From be3b3873baf2decf8a8de24b28628e6f5a9740a7 Mon Sep 17 00:00:00 2001 From: Michael Adler Date: Mon, 24 Feb 2025 13:54:38 +0100 Subject: [PATCH] feat: add journald-friendly log format Pass structured log data to journald using its native protocol [1]. [1] https://systemd.io/JOURNAL_NATIVE_PROTOCOL/ Signed-off-by: Michael Adler --- cmd/wfx/cmd/config/flags.go | 2 +- cmd/wfx/cmd/root/setup.go | 16 +++++++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/cmd/wfx/cmd/config/flags.go b/cmd/wfx/cmd/config/flags.go index 82cdcd09..1a0558e6 100644 --- a/cmd/wfx/cmd/config/flags.go +++ b/cmd/wfx/cmd/config/flags.go @@ -116,7 +116,7 @@ func NewFlagset() *pflag.FlagSet { allLevels := []string{zerolog.TraceLevel.String(), zerolog.DebugLevel.String(), zerolog.InfoLevel.String(), zerolog.WarnLevel.String(), zerolog.ErrorLevel.String(), zerolog.FatalLevel.String(), zerolog.PanicLevel.String()} f.String(LogLevelFlag, "info", fmt.Sprintf("set log level. one of: [%s]", strings.Join(allLevels, ", "))) - f.String(LogFormatFlag, "auto", "log format; possible values: json, pretty, auto") + f.String(LogFormatFlag, "auto", "log format; possible values: json, pretty, journald, auto") return f } diff --git a/cmd/wfx/cmd/root/setup.go b/cmd/wfx/cmd/root/setup.go index c52daa39..fdcdd65e 100644 --- a/cmd/wfx/cmd/root/setup.go +++ b/cmd/wfx/cmd/root/setup.go @@ -13,7 +13,9 @@ import ( "os" "time" + "github.com/coreos/go-systemd/v22/journal" "github.com/rs/zerolog" + "github.com/rs/zerolog/journald" "github.com/rs/zerolog/log" "golang.org/x/term" ) @@ -26,19 +28,27 @@ func setupLogging(out *os.File, format string, lvl zerolog.Level) { if term.IsTerminal(int(out.Fd())) { format = "pretty" } else { - format = "json" + if ok, _ := journal.StderrIsJournalStream(); ok { + format = "journald" + } else { + format = "json" + } } } switch format { case "json": - logger = zerolog.New(out).With().Caller().Logger() + logger = zerolog.New(out) case "pretty": logger = zerolog.New(zerolog.ConsoleWriter{ Out: out, TimeFormat: time.Stamp, }) + case "journald": + logger = zerolog.New(journald.NewJournalDWriter()) default: - fmt.Fprintf(os.Stderr, "Invalid log format: %s\n", format) + fmt.Fprintf(os.Stderr, "Invalid log format specified: %s\n", format) } log.Logger = logger.With().Timestamp().Caller().Logger() + + log.Debug().Str("format", format).Msg("Logging configured successfully") }