How to configure uber-go/zap
logger api to append logs to a specified file-path. Can it be made to work like rolling file-appender (based on file-size or date) without affecting performance?
A hook can be added to the zap logger which writes the entries to lumberjack, a rolling log for Go.
A simple usage would look like this:
The rolling log:
// remember to call this at app (or scope) exit:
// logger.Close()
var lumlog = &lumberjack.Logger{
Filename: "/tmp/my-zap.log",
MaxSize: 10, // megabytes
MaxBackups: 3, // number of log files
MaxAge: 3, // days
}
The zap
compatible hook:
func lumberjackZapHook(e zapcore.Entry) error {
lumlog.Write([]byte(fmt.Sprintf("%+v", e)))
return nil
}
And use it like:
logger, _ := zap.NewProduction(zap.Hooks(lumberjackZapHook))
Edit 1: I'm not sure if this meets your requirement in terms of performance. There are many factors there. For example using SSD hards make a big difference, or even logging into some timeseries databases with batch writes.
Edit 2: In zap documentation too, it uses lumberjack (but not as a hook).
If you want to use both console log and rolling log without hook then you can do the following:
// NewProductionZapLogger will return a new production logger backed by zap
func NewProductionZaplogger() (Logger, error) {
conf := zap.NewProductionConfig()
conf.Level = zap.NewAtomicLevelAt(zap.DebugLevel)
conf.DisableCaller = true
conf.DisableStacktrace = true
zapLogger, err := conf.Build(zap.WrapCore(zapCore))
return zpLg{
lg: zapLogger.Sugar(),
}, err
}
func zapCore(c zapcore.Core) zapcore.Core {
// lumberjack.Logger is already safe for concurrent use, so we don't need to
// lock it.
w := zapcore.AddSync(&lumberjack.Logger{
Filename: "./chat.log",
MaxSize: 50, // megabytes
MaxBackups: 30,
MaxAge: 28, // days
})
core := zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
w,
zap.DebugLevel,
)
cores := zapcore.NewTee(c, core)
return cores
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With