feat: add config for log level

This commit is contained in:
2026-03-15 21:48:31 +03:00
parent cea4633436
commit 0533f23e3d
3 changed files with 38 additions and 5 deletions

View File

@@ -79,6 +79,9 @@ RECONCILE_INTERVAL=60s
# Coalesces rapid bursts (e.g. rolling restarts) into a single reconcile.
DEBOUNCE_DELAY=5s
# Log level for watcher output. Allowed: debug, info, warn, error
LOG_LEVEL=info
# ── Docker ────────────────────────────────────────────────────────────────────
# Docker daemon endpoint. Leave empty to use the default Unix socket.

View File

@@ -30,6 +30,7 @@ type Config struct {
ReconcileInterval time.Duration
DebounceDelay time.Duration
LogLevel string
RecordTTL int
CloudflareAutoTTL bool
@@ -98,6 +99,13 @@ func LoadConfig() (*Config, error) {
return nil, fmt.Errorf("CF_AUTO_TTL: invalid boolean %q: %w", autoTTLStr, err)
}
cfg.LogLevel = strings.ToLower(envOrDefault("LOG_LEVEL", "info"))
switch cfg.LogLevel {
case "debug", "info", "warn", "error":
default:
return nil, fmt.Errorf("LOG_LEVEL: invalid value %q (allowed: debug, info, warn, error)", cfg.LogLevel)
}
cfg.ExcludeRouters = make(map[string]struct{})
if v := os.Getenv("EXCLUDE_ROUTERS"); v != "" {
for _, r := range strings.Split(v, ",") {

32
main.go
View File

@@ -22,21 +22,28 @@ func main() {
return
}
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: slog.LevelInfo,
})))
cfg, err := LoadConfig()
if err != nil {
slog.Error("configuration error", "error", err)
fmt.Fprintln(os.Stderr, "configuration error:", err)
os.Exit(1)
}
logLevel, err := parseLogLevel(cfg.LogLevel)
if err != nil {
fmt.Fprintln(os.Stderr, "configuration error:", err)
os.Exit(1)
}
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{
Level: logLevel,
})))
slog.Info("traefik-dns-watcher starting",
"traefik_url", cfg.TraefikURL,
"zones", cfg.Zones,
"repo_path", cfg.RepoPath,
"dynamic_dir", cfg.DynamicDir,
"log_level", cfg.LogLevel,
"git_https_token_enabled", cfg.GitAuthToken != "",
"git_auth_username", cfg.GitAuthUsername,
"reconcile_interval", cfg.ReconcileInterval,
@@ -115,6 +122,21 @@ func main() {
slog.Info("traefik-dns-watcher stopped")
}
func parseLogLevel(v string) (slog.Level, error) {
switch strings.ToLower(v) {
case "debug":
return slog.LevelDebug, nil
case "info":
return slog.LevelInfo, nil
case "warn":
return slog.LevelWarn, nil
case "error":
return slog.LevelError, nil
default:
return 0, fmt.Errorf("LOG_LEVEL: invalid value %q (allowed: debug, info, warn, error)", v)
}
}
// maybeHandleGitAskpass serves username/password for git HTTPS auth in non-interactive mode.
// This process mode is only enabled for git child processes that set TDW_GIT_ASKPASS=1.
func maybeHandleGitAskpass() bool {