From 06536f57b1fdc76212da6b85fbc9287cc4f0de70 Mon Sep 17 00:00:00 2001 From: dev Date: Fri, 26 Jun 2026 14:14:52 +0200 Subject: feat: add three-level logging with per-request debug output - New --log-level flag: debug (default info), info, silent debug: every API request logged (method, URL, status, duration) info: normal events (batch progress, entry counts, summaries) silent: only warnings and fatal errors - Replaced all log.Printf/Fatalf calls with level-gated helpers - API request timing added to queryWikiArticle, queryWikidataBatch, downloadFile - Retries and backoff logged in debug mode --- src/main.go | 31 ++++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-) (limited to 'src/main.go') diff --git a/src/main.go b/src/main.go index cf1c74b..2436976 100644 --- a/src/main.go +++ b/src/main.go @@ -3,7 +3,6 @@ package main import ( "flag" "fmt" - "log" "regexp" _ "github.com/go-sql-driver/mysql" @@ -56,7 +55,7 @@ func (a *App) populateImdbTable() error { } if !imdbIDRe.MatchString(param) { - log.Printf("populateImdbTable: invalid param %q, skipping", param) + logWarn("populateImdbTable: invalid param %q, skipping", param) continue } @@ -82,7 +81,7 @@ func (a *App) populateImdbTable() error { return fmt.Errorf("commit: %w", err) } - log.Printf("populateImdbTable: inserted %d, skipped %d (already existed)", inserted, skipped) + logInfo("populateImdbTable: inserted %d, skipped %d (already existed)", inserted, skipped) return nil } @@ -105,7 +104,7 @@ func (a *App) getExistingImdbIDs() (map[string]bool, error) { return nil, fmt.Errorf("rows iteration: %w", err) } - log.Printf("getExistingImdbIDs: %d existing records", len(existing)) + logInfo("getExistingImdbIDs: %d existing records", len(existing)) return existing, nil } @@ -139,7 +138,7 @@ func (a *App) extractImdbIDs() error { match := imdbTitleRe.FindStringSubmatch(link.URL) if len(match) < 2 { - log.Printf("no IMDb ID found in URL: %s", link.URL) + logWarn("no IMDb ID found in URL: %s", link.URL) continue } @@ -160,52 +159,54 @@ func (a *App) extractImdbIDs() error { return fmt.Errorf("commit: %w", err) } - log.Printf("extractImdbIDs: scanned %d rows, updated %d", count, updated) + logInfo("extractImdbIDs: scanned %d rows, updated %d", count, updated) return nil } func main() { wikiOnly := flag.Bool("wiki-only", false, "only fetch wiki article data, skip SPARQL") + logLevelFlag := flag.String("log-level", "info", "logging level: debug, info, silent") flag.Parse() + setLogLevel(*logLevelFlag) cfg, err := LoadConfig("config.json") if err != nil { - log.Fatalf("failed to load config: %v", err) + logFatalErr("failed to load config", err) } app := App{Config: cfg} - log.Printf(`Connecting to "%s" database "%s" as user "%s" on host "%s:%s" with extra options "%s".`, cfg.DBDriver, cfg.DBDBName, cfg.DBUser, cfg.DBHost, cfg.DBPort, cfg.DBOptions) + logInfo(`Connecting to "%s" database "%s" as user "%s" on host "%s:%s" with extra options "%s".`, cfg.DBDriver, cfg.DBDBName, cfg.DBUser, cfg.DBHost, cfg.DBPort, cfg.DBOptions) app.DB, err = sqlx.Connect(cfg.DBDriver, cfg.DBUser+":"+cfg.DBPassword+"@tcp("+cfg.DBHost+":"+cfg.DBPort+")/"+cfg.DBDBName+"?"+cfg.DBOptions) if err != nil { - log.Fatal(err, "Cannot connect to database") + logFatalTwoArgs(err, "Cannot connect to database") } if err = app.DB.Ping(); err != nil { - log.Fatal(err, "No connection to database") + logFatalTwoArgs(err, "No connection to database") } defer app.DB.Close() if !*wikiOnly { if err = app.extractImdbIDs(); err != nil { - log.Fatalf("extractImdbIDs: %v", err) + logFatalErr("extractImdbIDs", err) } if err = app.populateImdbTable(); err != nil { - log.Fatalf("populateImdbTable: %v", err) + logFatalErr("populateImdbTable", err) } if err = app.fetchAndUpdateImdbData(); err != nil { - log.Fatalf("fetchAndUpdateImdbData: %v", err) + logFatalErr("fetchAndUpdateImdbData", err) } if err = app.fetchWikiArticles(); err != nil { - log.Fatalf("fetchWikiArticles: %v", err) + logFatalErr("fetchWikiArticles", err) } } else { if err = app.fetchWikiArticlesData(); err != nil { - log.Fatalf("fetchWikiArticlesData: %v", err) + logFatalErr("fetchWikiArticlesData", err) } } } -- cgit v1.2.3