2
0
forked from drew/smtprelay
Files
smtprelay/logger.go

86 lines
1.7 KiB
Go

package main
import (
"fmt"
"io"
"os"
"strings"
"time"
"github.com/DeRuina/timberjack"
"github.com/rs/zerolog"
)
var (
rotator *timberjack.Logger
log *zerolog.Logger
)
func setupLogger() {
zerolog.TimeFieldFormat = time.RFC3339
// Handle logfile
var writer io.Writer
if *logFile == "" {
writer = os.Stderr
} else {
rotator = &timberjack.Logger{
Filename: *logFile,
MaxSize: 10, // megabytes before rotation
MaxBackups: 3,
MaxAge: 30, // days
Compress: true,
BackupTimeFormat: "20060102150405",
}
writer = rotator
}
// Handle log_format
switch *logFormat {
case "json":
// zerolog default is JSON
case "plain":
writer = zerolog.ConsoleWriter{
Out: writer,
NoColor: true,
TimeFormat: "",
FormatTimestamp: func(i interface{}) string {
return "" // avoid default time
},
}
case "", "default":
writer = zerolog.ConsoleWriter{
Out: writer,
NoColor: true,
TimeFormat: time.RFC3339,
}
case "pretty":
writer = zerolog.ConsoleWriter{
Out: writer,
TimeFormat: time.RFC3339Nano,
}
default:
fmt.Fprintf(os.Stderr, "Invalid log_format: %s\n", *logFormat)
os.Exit(1)
}
l := zerolog.New(writer).With().Timestamp().Logger()
log = &l
// Handle log_level
level, err := zerolog.ParseLevel(strings.ToLower(*logLevel))
if err != nil {
level = zerolog.InfoLevel
log.Warn().Str("given_level", *logLevel).
Msg("could not parse log level, defaulting to 'info'")
}
zerolog.SetGlobalLevel(level)
}
// Call this on shutdown if you want to close the rotator and stop timers cleanly
func closeLogger() {
if rotator != nil {
rotator.Close()
}
}