基础日志
核心思路
- 日志切割:保留 lumberjack.Logger 实现日志文件自动切割(按大小、备份数、保留天数)。
- 异步缓冲:保留 zapcore.BufferedWriteSyncer 实现异步批量写日志,减少磁盘 IO。
- Zap适配:通过 klog.NewZapLogger 将 Zap Logger 适配为 klog.Logger 接口,替换原 Logrus 适配器。
- 级别同步:确保 klog 日志级别与 Zap 日志级别一致。
代码实现
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
"github.com/kitex-contrib/obs-opentelemetry/logging/klog"
"your_project/conf" // 替换为实际配置包路径(如内部conf模块)
"time"
)
func setupKlog() {
// ========== 1. 配置日志切割(lumberjack) ==========
lumberJackLogger := &lumberjack.Logger{
Filename: conf.GetConf().Kitex.LogFileName, // 日志文件路径
MaxSize: conf.GetConf().Kitex.LogMaxSize, // 单文件最大大小(MB)
MaxBackups: conf.GetConf().Kitex.LogMaxBackups, // 最多保留旧日志数
MaxAge: conf.GetConf().Kitex.LogMaxAge, // 日志保留天数
}
// ========== 2. 配置异步缓冲写(zapcore.BufferedWriteSyncer) ==========
asyncWriter := &zapcore.BufferedWriteSyncer{
WS: zapcore.AddSync(lumberJackLogger), // 绑定lumberjack到zap的写同步器
FlushInterval: time.Minute, // 缓冲区刷新间隔(1分钟)
}
// ========== 3. 设置klog日志级别(同步到Zap) ==========
logLevel := conf.GetConf().Kitex.LogLevel() // 从配置获取日志级别(如"info"、"debug")
klog.SetLevel(logLevel) // 设置klog的日志级别
// 转换klog级别 → Zap级别
var zapLevel zap.Level
switch klog.Level() { // klog.Level()返回当前设置的级别(如klog.InfoLevel)
case klog.DebugLevel:
zapLevel = zap.DebugLevel
case klog.InfoLevel:
zapLevel = zap.InfoLevel
case klog.WarnLevel:
zapLevel = zap.WarnLevel
case klog.ErrorLevel:
zapLevel = zap.ErrorLevel
case klog.FatalLevel:
zapLevel = zap.FatalLevel
default:
zapLevel = zap.InfoLevel
}
// ========== 4. 配置Zap Encoder(日志格式) ==========
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 时间格式(ISO8601)
encoder := zapcore.NewJSONEncoder(encoderConfig) // JSON格式编码(也可使用ConsoleEncoder)
// ========== 5. 创建Zap Core(日志核心:编码器+写同步器+级别) ==========
core := zapcore.NewCore(
encoder, // 日志编码器(JSON格式)
asyncWriter, // 异步缓冲写同步器(含日志切割)
zap.NewAtomicLevelAt(zapLevel), // 日志级别(动态控制输出)
)
// ========== 6. 创建Zap Logger并适配为klog.Logger ==========
zapLogger := zap.New(core, zap.AddCaller()) // 可选:添加调用者信息(显示代码行号)
klogLogger := klog.NewZapLogger(zapLogger) // 适配为klog的Logger接口
// ========== 7. 绑定klog的Logger和输出 ==========
klog.SetLogger(klogLogger) // 替换原Logrus适配的Logger
// ========== 8. 注册服务关闭钩子(保证日志落盘) ==========
server.RegisterShutdownHook(func() {
asyncWriter.Sync() // 服务关闭时,强制刷写缓冲区的日志
})
}
// 示例:在main函数中调用setupKlog
func main() {
// 初始化配置、服务实例等...
setupKlog()
// 启动服务(如Kitex Server)
// server.Run(...)
}