zap日志记录1)自定义配置和2)伐木工人
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zap日志记录1)自定义配置和2)伐木工人相关的知识,希望对你有一定的参考价值。
我正在尝试使用1)定制的*zap.Config
和2)lumberjack
构建定制的zap记录器,但找不到适用于两种配置的示例。
由于config.Build
不接受WriteSync
作为输入。你知道如何实现这个目标吗?
func genBaseLoggerZap() Logger {
ex, err := os.Executable()
if err != nil {
Fatalf("Failed to get os.Executable, err: %v", err)
}
zlManager.outputPath = path.Join(filepath.Dir(ex), zlManager.outputPath)
// Want to add sync here..
zapcore.AddSync(&lumberjack.Logger{
Filename: zlManager.outputPath + "123",
MaxSize: 500,
MaxBackups: 10,
MaxAge: 28,
})
return genLoggerZap(BaseLogger, genDefaultConfig())
}
// genLoggerZap creates a zapLogger with given ModuleID and Config.
func genLoggerZap(mi ModuleID, cfg *zap.Config) Logger {
logger, err := cfg.Build()
if err != nil {
Fatalf("Failed to generate zap logger, err: %v", err)
}
newLogger := &zapLogger{mi, cfg, logger.Sugar()}
newLogger.register()
return newLogger
}
答案
您可以使用zap.RegisterSink
函数和Config.OutputPaths
字段添加自定义日志目标。 RegisterSink将URL方案映射到Sink构造函数,OutputPaths
配置日志目标(编码为URL)。
方便的是,*lumberjack.Logger
已经实现了几乎所有的zap.Sink
接口。只缺少Sync
方法,可以使用薄包装类型轻松添加。
package main
import (
"net/url"
"go.uber.org/zap"
lumberjack "gopkg.in/natefinch/lumberjack.v2"
)
type lumberjackSink struct {
*lumberjack.Logger
}
// Sync implements zap.Sink. The remaining methods are implemented
// by the embedded *lumberjack.Logger.
func (lumberjackSink) Sync() error { return nil }
func main() {
zap.RegisterSink("lumberjack", func(u *url.URL) (zap.Sink, error) {
return lumberjackSink{
Logger: &lumberjack.Logger{
Filename: u.Opaque,
// Use query parameters or hardcoded values for remaining
// fields.
},
}, nil
})
config := zap.NewProductionConfig()
// Add a URL with the "lumberjack" scheme.
config.OutputPaths = append(config.OutputPaths, "lumberjack:foo.log")
log, _ := config.Build()
log.Info("test", zap.String("foo", "bar"))
}
以上是关于zap日志记录1)自定义配置和2)伐木工人的主要内容,如果未能解决你的问题,请参考以下文章