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)伐木工人的主要内容,如果未能解决你的问题,请参考以下文章

如何配置仅在错误级别写入输出的自定义 zap 记录器?

具有自定义消息编码器的 Uber zap 日志记录

Uber Zap 记录器未在日志语句中打印调用者信息

golang zaplog使用(转)

如何为滚动文件系统日志配置 uber-go/zap 记录器?

zap日志配置