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 }