goutils/other/zerolog.go
mstar 0a22727d46
BREAKING CHANGE: Update ConfigureLogging
Now takes a writer as additional output next to stderr
to write logs to
2025-04-08 17:09:50 +02:00

76 lines
1.8 KiB
Go

package other
import (
"flag"
"io"
"os"
"strings"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
var cliFlagLogLevel = "info"
var cliFlagLogJson = false
func SetupFlags() {
flag.StringVar(
&cliFlagLogLevel,
"loglevel",
"info",
"Set the logging level. Valid values (case insensitive) are: debug, info, warn, error, fatal",
)
flag.BoolVar(
&cliFlagLogJson,
"logjson",
false,
"Log json objects to stderr instead of nicely formatted ones",
)
}
// Configure logging. Utilises the flags setup in [SetupFlags].
// If logWriter is not nil, will also write logs, as json objects,
// to the given writer
func ConfigureLogging(logWriter io.Writer) {
configOutputs(logWriter)
configLevel()
}
func configLevel() {
switch strings.ToLower(cliFlagLogLevel) {
case "trace":
zerolog.SetGlobalLevel(zerolog.TraceLevel)
case "debug":
zerolog.SetGlobalLevel(zerolog.DebugLevel)
case "info":
zerolog.SetGlobalLevel(zerolog.InfoLevel)
case "warn":
zerolog.SetGlobalLevel(zerolog.WarnLevel)
case "error":
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
case "fatal":
zerolog.SetGlobalLevel(zerolog.FatalLevel)
default:
zerolog.SetGlobalLevel(zerolog.InfoLevel)
}
log.Info().Str("new-level", cliFlagLogLevel).Msg("New logging level set")
}
func configOutputs(logWriter io.Writer) {
console := zerolog.ConsoleWriter{Out: os.Stderr}
extraLogWriters := []io.Writer{console}
if logWriter != nil {
extraLogWriters = append(extraLogWriters, logWriter)
}
if !cliFlagLogJson {
log.Logger = zerolog.New(zerolog.MultiLevelWriter(extraLogWriters...)).
With().
Timestamp().
Logger()
} else {
log.Logger = zerolog.New(zerolog.MultiLevelWriter(
append([]io.Writer{log.Logger}, extraLogWriters...)...,
)).With().Timestamp().Logger()
}
return
}