package other import ( "flag" "io" "os" "strings" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "git.mstar.dev/mstar/goutils/logrotate" ) 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", ) } // If logfileName != nil, that file will be used for writing logs to. // Additionally, this function will then return another function // for rotating the log file func ConfigureLogging(logfileName *string) func() error { rotateFunc := configOutputs(logfileName) configLevel() return rotateFunc } 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(logfileName *string) (rotateLogs func() error) { rotateLogs = func() error { return nil } extraLogWriters := []io.Writer{} if logfileName != nil { logfile, err := logrotate.New(*logfileName) if err != nil { log.Fatal().Err(err).Msg("Failed to open log file") } extraLogWriters = append(extraLogWriters, logfile) rotateLogs = logfile.Rotate } if !cliFlagLogJson { console := zerolog.ConsoleWriter{Out: os.Stderr} log.Logger = zerolog.New(zerolog.MultiLevelWriter(append([]io.Writer{console}, extraLogWriters...)...)). With(). Timestamp(). Logger() } else { log.Logger = zerolog.New(zerolog.MultiLevelWriter( append([]io.Writer{log.Logger}, extraLogWriters...)..., )).With().Timestamp().Logger() } return }