Skip to main content

zap 日志切割 lumberjack

zap 本身并不直接支持日志切割(log rotation),但你可以结合其他库来实现这一功能。一个常见的选择是使用 lumberjack 这个库,它专门用于日志切割和归档。

下面是一个结合 zaplumberjack 实现日志切割的示例:

安装依赖

首先,你需要安装 zaplumberjack

go get -u go.uber.org/zap
go get -u gopkg.in/natefinch/lumberjack.v2

示例代码

package main

import (
"flag"
"gopkg.in/natefinch/lumberjack.v2"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)

func main() {
// 定义一个环境变量
env := flag.String("env", "pro", "环境变量: test, fat, pro")
flag.Parse()

// 使用 lumberjack 实现日志切割
lumberjackLogger := &lumberjack.Logger{
Filename: "./logs/app.log",
MaxSize: 10, // 日志文件最大为 10 MB
MaxBackups: 3, // 保留最近的 3 个日志文件
MaxAge: 28, // 保留 28 天
Compress: true, // 是否压缩/归档旧日志文件
}

// 创建 zap 核心
writeSyncer := zapcore.AddSync(lumberjackLogger)
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.TimeKey = "timestamp"
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoder := zapcore.NewJSONEncoder(encoderConfig)

core := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)

var logger *zap.Logger
if *env == "test" {
logger, _ = zap.NewDevelopment()
} else {
logger = zap.New(core)
}

defer logger.Sync() // 确保缓冲区的日志条目被刷新

sugar := logger.Sugar()

// 记录日志
sugar.Infow("Info log example",
"env", *env,
"key1", "value1",
"key2", 42,
)
sugar.Debugw("Debug log example",
"env", *env,
"key1", "value1",
"key2", 42,
)
sugar.Warnw("Warn log example",
"env", *env,
"key1", "value1",
"key2", 42,
)
sugar.Errorw("Error log example",
"env", *env,
"key1", "value1",
"key2", 42,
)
}

解释

  1. lumberjack.Logger:

    • Filename: 日志文件的路径。
    • MaxSize: 单个日志文件的最大大小(以 MB 为单位)。
    • MaxBackups: 保留的旧日志文件的最大数量。
    • MaxAge: 保留旧日志文件的最大天数。
    • Compress: 是否压缩旧日志文件。
  2. zapcore.NewCore:

    • 创建一个新的 zap 核心,结合 lumberjack 的日志切割功能。
  3. 环境配置:

    • 根据不同的环境(test、fat、pro),选择不同的日志配置。在测试环境中使用 zap.NewDevelopment,在其他环境中使用自定义的核心配置。

输出结果

运行上述代码后,日志会被写入到 ./logs/app.log 文件中,并根据配置进行切割和归档。

例如,当日志文件达到 10 MB 时,会自动创建一个新的日志文件,并保留最近的 3 个日志文件,同时压缩旧的日志文件。

希望这个示例对你有帮助!如果你有其他问题,欢迎继续提问。