X-Git-Url: https://git.giacomolli.uk/onechat/blobdiff_plain/4c199e7d93b6a4529ed5956807911b5f6c5489a7..c781f79f3c8cb9a7577ee1574d196988da2719b3:/daemon_log.go diff --git a/daemon_log.go b/daemon_log.go index 15426bc..f1e4b0b 100644 --- a/daemon_log.go +++ b/daemon_log.go @@ -5,8 +5,10 @@ import ( "fmt" "io" "log/slog" + "os" "strings" "sync" + "time" ) // DaemonLogHandler writes short event lines with ordered attributes. Copies @@ -102,6 +104,18 @@ func (h *DaemonLogHandler) WithGroup(name string) slog.Handler { return &clone } +// daemonLogger returns a logger for one daemon part. JOURNAL_STREAM selects +// syslog priorities without a time stamp. Other output carries the standard +// time stamp and level. +func daemonLogger(out io.Writer, prefix string) *slog.Logger { + return slog.New(&DaemonLogHandler{ + out: out, + prefix: prefix, + journal: os.Getenv("JOURNAL_STREAM") != "", + mutex: &sync.Mutex{}, + }) +} + // daemonLogAttr resolves and writes one attribute, or keeps its cause for the // end of the line. Groups flatten into dotted keys and empty attributes produce // no text. @@ -141,3 +155,13 @@ func daemonLogAttr(line *strings.Builder, group string, attr slog.Attr, cause *s fmt.Fprint(line, attr.Value.Any()) } } + +// durationText returns d for a log line: rounded to the second, or to the +// millisecond when it is shorter than a second. +func durationText(d time.Duration) string { + if d < time.Second { + return d.Round(time.Millisecond).String() + } + + return d.Round(time.Second).String() +}