89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"io"
|
|
stdlog "log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/rs/zerolog"
|
|
"github.com/rs/zerolog/log"
|
|
"github.com/sirupsen/logrus"
|
|
"github.com/traefik/traefik/v3/pkg/config/static"
|
|
"github.com/traefik/traefik/v3/pkg/logs"
|
|
"gopkg.in/natefinch/lumberjack.v2"
|
|
)
|
|
|
|
func init() {
|
|
// hide the first logs before the setup of the logger.
|
|
zerolog.SetGlobalLevel(zerolog.ErrorLevel)
|
|
}
|
|
|
|
func setupLogger(staticConfiguration *static.Configuration) {
|
|
// configure log format
|
|
w := getLogWriter(staticConfiguration)
|
|
|
|
// configure log level
|
|
logLevel := getLogLevel(staticConfiguration)
|
|
|
|
// create logger
|
|
logCtx := zerolog.New(w).With().Timestamp()
|
|
if logLevel <= zerolog.DebugLevel {
|
|
logCtx = logCtx.Caller()
|
|
}
|
|
|
|
log.Logger = logCtx.Logger().Level(logLevel)
|
|
zerolog.DefaultContextLogger = &log.Logger
|
|
zerolog.SetGlobalLevel(logLevel)
|
|
|
|
// Global logrus replacement (related to lib like go-rancher-metadata, docker, etc.)
|
|
logrus.StandardLogger().Out = logs.NoLevel(log.Logger, zerolog.DebugLevel)
|
|
|
|
// configure default standard log.
|
|
stdlog.SetFlags(stdlog.Lshortfile | stdlog.LstdFlags)
|
|
stdlog.SetOutput(logs.NoLevel(log.Logger, zerolog.DebugLevel))
|
|
}
|
|
|
|
func getLogWriter(staticConfiguration *static.Configuration) io.Writer {
|
|
var w io.Writer = os.Stdout
|
|
|
|
if staticConfiguration.Log != nil && len(staticConfiguration.Log.FilePath) > 0 {
|
|
_, _ = os.OpenFile(staticConfiguration.Log.FilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o666)
|
|
w = &lumberjack.Logger{
|
|
Filename: staticConfiguration.Log.FilePath,
|
|
MaxSize: staticConfiguration.Log.MaxSize,
|
|
MaxBackups: staticConfiguration.Log.MaxBackups,
|
|
MaxAge: staticConfiguration.Log.MaxAge,
|
|
Compress: true,
|
|
}
|
|
}
|
|
|
|
if staticConfiguration.Log == nil || staticConfiguration.Log.Format != "json" {
|
|
w = zerolog.ConsoleWriter{
|
|
Out: w,
|
|
TimeFormat: time.RFC3339,
|
|
NoColor: staticConfiguration.Log != nil && (staticConfiguration.Log.NoColor || len(staticConfiguration.Log.FilePath) > 0),
|
|
}
|
|
}
|
|
|
|
return w
|
|
}
|
|
|
|
func getLogLevel(staticConfiguration *static.Configuration) zerolog.Level {
|
|
levelStr := "error"
|
|
if staticConfiguration.Log != nil && staticConfiguration.Log.Level != "" {
|
|
levelStr = strings.ToLower(staticConfiguration.Log.Level)
|
|
}
|
|
|
|
logLevel, err := zerolog.ParseLevel(strings.ToLower(levelStr))
|
|
if err != nil {
|
|
log.Error().Err(err).
|
|
Str("logLevel", levelStr).
|
|
Msg("Unspecified or invalid log level, setting the level to default (ERROR)...")
|
|
|
|
logLevel = zerolog.ErrorLevel
|
|
}
|
|
|
|
return logLevel
|
|
}
|