go - 使用 1) 自定义配置和 2) 伐木工人进行 zap 日志记录
问题描述
我正在尝试使用 1) 自定义*zap.Config
和 2)构建自定义的 zap 记录器lumberjack
,但找不到合适的示例来应用这两种配置。
由于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"))
}
推荐阅读
- wordpress - Woocommerce 可搜索产品自定义字段
- c++ - 在 MAC OS X 上的 CMAKE 项目中包含标志(ncurses)
- apache-kafka - KSQL 说它希望现有主题有 2 个分区(主题有 1 个),
- javascript - 上传前如何拆分数据?
- java - Rostful API - 实现
- hibernate - Corda 持久性和带有集合的模型
- python - 为什么我的 Python 命令在 Windows 10 CMD 中不起作用?
- gradle - 构建离子 4 科尔多瓦 9 平台 android@8
- javascript - 数组对象文件表单数据
- python - Matplotlib 绘制数百个矩形轮廓