如何配置uber-go/zap
logger api 以将日志附加到指定的文件路径。它可以像滚动文件附加器(基于文件大小或日期)一样工作而不影响性能吗?
问问题
6848 次
3 回答
7
可以向 zap 记录器添加一个钩子,它将条目写入lumberjack,即 Go 的滚动日志。
一个简单的用法如下所示:
滚动日志:
// 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
}
兼容的zap
钩子:
func lumberjackZapHook(e zapcore.Entry) error {
lumlog.Write([]byte(fmt.Sprintf("%+v", e)))
return nil
}
并像这样使用它:
logger, _ := zap.NewProduction(zap.Hooks(lumberjackZapHook))
编辑1:我不确定这是否符合您的性能要求。这里面有很多因素。例如,使用 SSD 硬盘会产生很大的不同,甚至可以通过批量写入登录到一些时间序列数据库。
编辑 2:在 zap文档中,它也使用伐木工人(但不是作为钩子)。
于 2017-08-01T17:18:18.333 回答
1
如果你想在没有钩子的情况下同时使用控制台日志和滚动日志,那么你可以执行以下操作:
// 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
}
于 2021-11-16T13:44:59.893 回答
0
我为 zap 和伐木工人编写了一个更简单的库rzap 。
rzap.NewGlobalLogger([]zapcore.Core{
rzap.NewCore(&lumberjack.Logger{
Filename: "/your/log/path/app.log",
MaxSize: 10, // 10 megabytes, defaults to 100 megabytes
MaxAge: 10, // 10 days, default is not to remove old log files
MaxBackups: 10, // 10 files, default is to retain all old log files
Compress: true, // compress to gzio, default is not to perform compression
}, zap.InfoLevel),
})
zap.L().Info("some message", zap.Int("status", 0))
于 2022-01-12T09:47:45.813 回答