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

Posted

技术标签:

【中文标题】如何为滚动文件系统日志配置 uber-go/zap 记录器?【英文标题】:How to configure uber-go/zap logger for rolling filesystem log? 【发布时间】:2018-01-08 11:28:32 【问题描述】:

如何配置uber-go/zap logger api 以将日志附加到指定的文件路径。它可以像滚动文件附加器(基于文件大小或日期)一样工作而不影响性能吗?

【问题讨论】:

你在什么操作系统上?您的应用程序运行情况如何?你现在登录的怎么样了? 我通常建议应用程序登录到 stdout/stderr 并让 syslog 或其他一些工具将其重定向到旋转日志文件。 【参考方案1】:

可以向 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 documentation 中,它也使用伐木工人(但不是作为钩子)。

【讨论】:

【参考方案2】:

如果您想同时使用控制台日志和滚动日志而不使用钩子,那么您可以执行以下操作:

// 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

【讨论】:

以上是关于如何为滚动文件系统日志配置 uber-go/zap 记录器?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 grails 插件配置日志记录?

如何为 .NET 库配置具有依赖注入的日志记录提供程序

如何为 ASP.NET Core 应用配置 Azure 应用服务日志记录提供程序?

xcconfigs:如何为一个目标设置多个配置

发现一个很快的golang logging模块

如何为 Kafka 生产者配置日志记录?