zap 日志切割 lumberjack
zap 本身并不直接支持日志切割(log rotation),但你可以结合其他库来实现这一功能。一个常见的选择是使用 lumberjack 这个库,它专门用于日志切割和归档。
下面是一个结合 zap 和 lumberjack 实现日志切割的示例:
安装依赖
首先,你需要安装 zap 和 lumberjack:
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,
)
}
解释
-
lumberjack.Logger:
Filename: 日志文件的路径。MaxSize: 单个日志文件的最大大小(以 MB 为单位)。MaxBackups: 保留的旧日志文件的最大数量。MaxAge: 保留旧日志文件的最大天数。Compress: 是否压缩旧日志文件。
-
zapcore.NewCore:
- 创建一个新的
zap核心,结合lumberjack的日志切割功能。
- 创建一个新的
-
环境配置:
- 根据不同的环境(test、fat、pro),选择不同的日志配置。在测试环境中使用
zap.NewDevelopment,在其他环境中使用自定义的核心配置。
- 根据不同的环境(test、fat、pro),选择不同的日志配置。在测试环境中使用
输出结果
运行上述代码后,日志会被写入到 ./logs/app.log 文件中,并根据配置进行切割和归档。
例如,当日志文件达到 10 MB 时,会自动创建一个新的日志文件,并保留最近的 3 个日志文件,同时压缩旧的日志文件。
希望这个示例对你有帮助!如果你有其他问题,欢迎继续提问。