diff --git a/.github/workflows/pr-check.yaml b/.github/workflows/pr-check.yaml index 13ce8d11..79aa62ad 100644 --- a/.github/workflows/pr-check.yaml +++ b/.github/workflows/pr-check.yaml @@ -7,6 +7,7 @@ on: - synchronize - labeled - unlabeled + - edited permissions: {} diff --git a/cmd/windows_exporter/0_service.go b/cmd/windows_exporter/0_service.go index 21ec667f..4a76561f 100644 --- a/cmd/windows_exporter/0_service.go +++ b/cmd/windows_exporter/0_service.go @@ -18,8 +18,10 @@ package main import ( + "context" "errors" "fmt" + "log/slog" "os" "strings" "unsafe" @@ -161,6 +163,22 @@ func logToEventToLog(eType uint16, msg string) error { return nil } +// logStartupError logs an error that occurs before the configured logger exists. +// A service has no console to receive the default stderr output, +// so the error is written to the event log as well. +func logStartupError(ctx context.Context, msg string, err error) { + if IsService { + if logErr := logToEventToLog(windows.EVENTLOG_ERROR_TYPE, fmt.Sprintf("%s: %v", msg, err)); logErr != nil { + logToFile(fmt.Sprintf("%s: %v", msg, err)) + } + } + + //nolint:sloglint // We do not have a logger yet. + slog.LogAttrs(ctx, slog.LevelError, msg, + slog.Any("err", err), + ) +} + func logToFile(msg string) { if file, err := os.CreateTemp("", "windows_exporter.service.error.log"); err == nil { _, _ = file.WriteString(msg) diff --git a/cmd/windows_exporter/main.go b/cmd/windows_exporter/main.go index 081a27b1..44ea550e 100644 --- a/cmd/windows_exporter/main.go +++ b/cmd/windows_exporter/main.go @@ -128,10 +128,7 @@ func run(ctx context.Context, args []string) int { collectors := collector.NewWithFlags(app) if err := config.Parse(app, args); err != nil { - //nolint:sloglint // we do not have an logger yet - slog.LogAttrs(ctx, slog.LevelError, "Failed to load configuration", - slog.Any("err", err), - ) + logStartupError(ctx, "Failed to load configuration", err) return 1 } @@ -140,9 +137,7 @@ func run(ctx context.Context, args []string) int { logger, err := log.New(logConfig) if err != nil { - logger.LogAttrs(ctx, slog.LevelError, "failed to create logger", - slog.Any("err", err), - ) + logStartupError(ctx, "failed to create logger", err) return 1 }