Kitex日志

2024-01-17T14:21:02+08:00 | 2分钟阅读 | 更新于 2024-01-17T14:21:02+08:00

@

基础日志

核心思路

  1. 日志切割:保留 lumberjack.Logger 实现日志文件自动切割(按大小、备份数、保留天数)。
  2. 异步缓冲:保留 zapcore.BufferedWriteSyncer 实现异步批量写日志,减少磁盘 IO。
  3. Zap适配:通过 klog.NewZapLogger 将 Zap Logger 适配为 klog.Logger 接口,替换原 Logrus 适配器。
  4. 级别同步:确保 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(...)
}
About Me

没什么想介绍的,一个很大众的码农…

喜欢代码,车,马,真的是 🐎

讨厌别人让我给自己的代码写注释 最厌烦别人的程序没有写注释

目标

学AI,加油!加油!