Skip to content

Commit 5709b14

Browse files
Paul SchwabauerJanHoefelmeyer
andauthored
Extend structured logging usage in aggregator (gocsaf#622)
* Extend structured logging usage in aggregator * Use structured logging in advisories processor * Remove unnecessary inner function * Format * Feat: Add verbose flag to example aggregator toml (in comment) --------- Co-authored-by: JanHoefelmeyer <jan.hoefelmeyer@intevation.de>
1 parent cf4cf7c commit 5709b14

File tree

4 files changed

+36
-30
lines changed

4 files changed

+36
-30
lines changed

cmd/csaf_aggregator/config.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,8 +264,14 @@ func (c *config) privateOpenPGPKey() (*crypto.Key, error) {
264264
return c.key, c.keyErr
265265
}
266266

267-
func (c *config) httpClient(p *provider) util.Client {
267+
// httpLog does structured logging in a [util.LoggingClient].
268+
func httpLog(method, url string) {
269+
slog.Debug("http",
270+
"method", method,
271+
"url", url)
272+
}
268273

274+
func (c *config) httpClient(p *provider) util.Client {
269275
hClient := http.Client{}
270276

271277
var tlsConfig tls.Config
@@ -310,7 +316,10 @@ func (c *config) httpClient(p *provider) util.Client {
310316
}
311317

312318
if c.Verbose {
313-
client = &util.LoggingClient{Client: client}
319+
client = &util.LoggingClient{
320+
Client: client,
321+
Log: httpLog,
322+
}
314323
}
315324

316325
if p.Rate == nil && c.Rate == nil {
@@ -331,7 +340,6 @@ func (c *config) httpClient(p *provider) util.Client {
331340
}
332341

333342
func (c *config) checkProviders() error {
334-
335343
if !c.AllowSingleProvider && len(c.Providers) < 2 {
336344
return errors.New("need at least two providers")
337345
}
@@ -471,7 +479,6 @@ func (c *config) prepareCertificates() error {
471479

472480
// prepare prepares internal state of a loaded configuration.
473481
func (c *config) prepare() error {
474-
475482
if len(c.Providers) == 0 {
476483
return errors.New("no providers given in configuration")
477484
}

cmd/csaf_aggregator/mirror.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -462,8 +462,9 @@ func (w *worker) extractCategories(label string, advisory any) error {
462462
expr := cat[len(exprPrefix):]
463463
// Compile first to check that the expression is okay.
464464
if _, err := w.expr.Compile(expr); err != nil {
465-
fmt.Printf("Compiling category expression %q failed: %v\n",
466-
expr, err)
465+
slog.Error("Compiling category expression failed",
466+
"expr", expr,
467+
"err", err)
467468
continue
468469
}
469470
// Ignore errors here as they result from not matching.
@@ -588,12 +589,10 @@ func (w *worker) mirrorFiles(tlpLabel csaf.TLPLabel, files []csaf.AdvisoryFile)
588589
if err := os.MkdirAll(yearDir, 0755); err != nil {
589590
return err
590591
}
591-
//log.Printf("created %s\n", yearDir)
592592
yearDirs[year] = yearDir
593593
}
594594

595595
fname := filepath.Join(yearDir, filename)
596-
//log.Printf("write: %s\n", fname)
597596
data := content.Bytes()
598597
if err := writeFileHashes(
599598
fname, filename,

csaf/advisories.go

Lines changed: 21 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
package csaf
1010

1111
import (
12+
"context"
1213
"encoding/csv"
1314
"fmt"
1415
"io"
15-
"log"
1616
"log/slog"
1717
"net/http"
1818
"net/url"
@@ -91,7 +91,7 @@ func (daf DirectoryAdvisoryFile) LogValue() slog.Value {
9191
// advisory file names from a given provider metadata.
9292
type AdvisoryFileProcessor struct {
9393
AgeAccept func(time.Time) bool
94-
Log func(format string, args ...any)
94+
Log func(loglevel slog.Level, format string, args ...any)
9595
client util.Client
9696
expr *util.PathEval
9797
doc any
@@ -131,16 +131,16 @@ func (afp *AdvisoryFileProcessor) Process(
131131
) error {
132132
lg := afp.Log
133133
if lg == nil {
134-
lg = func(format string, args ...any) {
135-
log.Printf("AdvisoryFileProcessor.Process: "+format, args...)
134+
lg = func(loglevel slog.Level, format string, args ...any) {
135+
slog.Log(context.Background(), loglevel, "AdvisoryFileProcessor.Process: "+format, args...)
136136
}
137137
}
138138

139139
// Check if we have ROLIE feeds.
140140
rolie, err := afp.expr.Eval(
141141
"$.distributions[*].rolie.feeds", afp.doc)
142142
if err != nil {
143-
lg("rolie check failed: %v\n", err)
143+
lg(slog.LevelError, "rolie check failed", "err", err)
144144
return err
145145
}
146146

@@ -152,7 +152,7 @@ func (afp *AdvisoryFileProcessor) Process(
152152
if err := util.ReMarshalJSON(&feeds, rolie); err != nil {
153153
return err
154154
}
155-
lg("Found %d ROLIE feed(s).\n", len(feeds))
155+
lg(slog.LevelInfo, "Found ROLIE feed(s)", "length", len(feeds))
156156

157157
for _, feed := range feeds {
158158
if err := afp.processROLIE(feed, fn); err != nil {
@@ -168,12 +168,12 @@ func (afp *AdvisoryFileProcessor) Process(
168168
var dirURLs []string
169169

170170
if err != nil {
171-
lg("extracting directory URLs failed: %v\n", err)
171+
lg(slog.LevelError, "extracting directory URLs failed", "err", err)
172172
} else {
173173
var ok bool
174174
dirURLs, ok = util.AsStrings(directoryURLs)
175175
if !ok {
176-
lg("directory_urls are not strings.\n")
176+
lg(slog.LevelError, "directory_urls are not strings")
177177
}
178178
}
179179

@@ -209,9 +209,8 @@ func (afp *AdvisoryFileProcessor) Process(
209209
// prefixed by baseURL/.
210210
func (afp *AdvisoryFileProcessor) loadChanges(
211211
baseURL string,
212-
lg func(string, ...any),
212+
lg func(slog.Level, string, ...any),
213213
) ([]AdvisoryFile, error) {
214-
215214
base, err := url.Parse(baseURL)
216215
if err != nil {
217216
return nil, err
@@ -244,12 +243,12 @@ func (afp *AdvisoryFileProcessor) loadChanges(
244243
return nil, err
245244
}
246245
if len(r) < 2 {
247-
lg("%q has not enough columns in line %d", line)
246+
lg(slog.LevelError, "Not enough columns", "line", line)
248247
continue
249248
}
250249
t, err := time.Parse(time.RFC3339, r[timeColumn])
251250
if err != nil {
252-
lg("%q has an invalid time stamp in line %d: %v", changesURL, line, err)
251+
lg(slog.LevelError, "Invalid time stamp in line", "url", changesURL, "line", line, "err", err)
253252
continue
254253
}
255254
// Apply date range filtering.
@@ -258,7 +257,7 @@ func (afp *AdvisoryFileProcessor) loadChanges(
258257
}
259258
path := r[pathColumn]
260259
if _, err := url.Parse(path); err != nil {
261-
lg("%q contains an invalid URL %q in line %d", changesURL, path, line)
260+
lg(slog.LevelError, "Contains an invalid URL", "url", changesURL, "path", path, "line", line)
262261
continue
263262
}
264263

@@ -279,39 +278,39 @@ func (afp *AdvisoryFileProcessor) processROLIE(
279278
}
280279
up, err := url.Parse(string(*feed.URL))
281280
if err != nil {
282-
log.Printf("Invalid URL %s in feed: %v.", *feed.URL, err)
281+
slog.Error("Invalid URL in feed", "feed", *feed.URL, "err", err)
283282
continue
284283
}
285284
feedURL := afp.base.ResolveReference(up)
286-
log.Printf("Feed URL: %s\n", feedURL)
285+
slog.Info("Got feed URL", "feed", feedURL)
287286

288287
fb, err := util.BaseURL(feedURL)
289288
if err != nil {
290-
log.Printf("error: Invalid feed base URL '%s': %v\n", fb, err)
289+
slog.Error("Invalid feed base URL", "url", fb, "err", err)
291290
continue
292291
}
293292
feedBaseURL, err := url.Parse(fb)
294293
if err != nil {
295-
log.Printf("error: Cannot parse feed base URL '%s': %v\n", fb, err)
294+
slog.Error("Cannot parse feed base URL", "url", fb, "err", err)
296295
continue
297296
}
298297

299298
res, err := afp.client.Get(feedURL.String())
300299
if err != nil {
301-
log.Printf("error: Cannot get feed '%s'\n", err)
300+
slog.Error("Cannot get feed", "err", err)
302301
continue
303302
}
304303
if res.StatusCode != http.StatusOK {
305-
log.Printf("error: Fetching %s failed. Status code %d (%s)",
306-
feedURL, res.StatusCode, res.Status)
304+
slog.Error("Fetching failed",
305+
"url", feedURL, "status_code", res.StatusCode, "status", res.Status)
307306
continue
308307
}
309308
rfeed, err := func() (*ROLIEFeed, error) {
310309
defer res.Body.Close()
311310
return LoadROLIEFeed(res.Body)
312311
}()
313312
if err != nil {
314-
log.Printf("Loading ROLIE feed failed: %v.", err)
313+
slog.Error("Loading ROLIE feed failed", "err", err)
315314
continue
316315
}
317316

@@ -323,7 +322,7 @@ func (afp *AdvisoryFileProcessor) processROLIE(
323322
}
324323
p, err := url.Parse(u)
325324
if err != nil {
326-
log.Printf("error: Invalid URL '%s': %v", u, err)
325+
slog.Error("Invalid URL", "url", u, "err", err)
327326
return ""
328327
}
329328
return feedBaseURL.ResolveReference(p).String()

docs/examples/aggregator.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ web = "/var/csaf_aggregator/html"
55
domain = "https://localhost:9443"
66
rate = 10.0
77
insecure = true
8+
#verbose = false
89
#openpgp_private_key =
910
#openpgp_public_key =
1011
#interim_years =

0 commit comments

Comments
 (0)