- 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
85 lines
2.1 KiB
Go
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
|
|
}
|