goutils/other/zerolog.go
mstar afcc54c831
BREAKING CHANGE: Remodelled logging setup
- other.ConfigureLoggingFromCliArgs has been renamed to
  other.ConfigureLogging
- The -logfile cli argument has been removed and replaced with an
  argument to other.ConfigureLogging. This argument takes a pointer to a
  string or nil. If it's a valid pointer, it's used just like the
  -logfile cli flag before
- The logfile, if requested via the previously mentioned parameter, can
  now be rotated by calling the returned function. If no logfile is
  specified, the returned function does nothing
2025-03-24 08:39:04 +01:00

85 lines
2.1 KiB
Go

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
}