diff --git a/logrotate/logrotate.go b/logrotate/logrotate.go index e569dad..9b19992 100644 --- a/logrotate/logrotate.go +++ b/logrotate/logrotate.go @@ -15,13 +15,13 @@ type RotateWriter struct { } // Make a new RotateWriter. Return nil if error occurs during setup. -func New(filename string) *RotateWriter { +func New(filename string) (*RotateWriter, error) { w := &RotateWriter{filename: filename} err := w.Rotate() if err != nil { - return nil + return nil, err } - return w + return w, nil } // Write satisfies the io.Writer interface. diff --git a/other/zerolog.go b/other/zerolog.go index 62fc1f4..76ed0c9 100644 --- a/other/zerolog.go +++ b/other/zerolog.go @@ -8,11 +8,12 @@ import ( "github.com/rs/zerolog" "github.com/rs/zerolog/log" + + "git.mstar.dev/mstar/goutils/logrotate" ) var cliFlagLogLevel = "info" var cliFlagLogJson = false -var cliFlagLogFile = "" func SetupFlags() { flag.StringVar( @@ -27,17 +28,15 @@ func SetupFlags() { false, "Log json objects to stderr instead of nicely formatted ones", ) - flag.StringVar( - &cliFlagLogFile, - "logfile", - "", - "Set the file to write json formatted log messages to", - ) } -func ConfigureLoggingFromCliArgs() { - configOutputs() +// 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() { @@ -60,18 +59,16 @@ func configLevel() { log.Info().Str("new-level", cliFlagLogLevel).Msg("New logging level set") } -func configOutputs() { +func configOutputs(logfileName *string) (rotateLogs func() error) { + rotateLogs = func() error { return nil } extraLogWriters := []io.Writer{} - if cliFlagLogFile != "" { - file, err := os.OpenFile(cliFlagLogFile, os.O_APPEND|os.O_CREATE, os.ModeAppend) + if logfileName != nil { + logfile, err := logrotate.New(*logfileName) if err != nil { log.Fatal().Err(err).Msg("Failed to open log file") } - // NOTE: Technically this leaks a file handle - // Shouldn't matter though since the log file should be open until the very end - // Sooooo, eh. Don't care about adding an elaborate system to close the file at the very end. - // OS will do that anyway - extraLogWriters = append(extraLogWriters, file) + extraLogWriters = append(extraLogWriters, logfile) + rotateLogs = logfile.Rotate } if !cliFlagLogJson { console := zerolog.ConsoleWriter{Out: os.Stderr} @@ -84,4 +81,5 @@ func configOutputs() { append([]io.Writer{log.Logger}, extraLogWriters...)..., )).With().Timestamp().Logger() } + return }