Logrus需显式调用SetLevel(log.DebugLevel)开启DEBUG输出,默认仅INFO及以上;TextFormatter需设DisableLevelTruncation:true防DEBU截断;环境变量应解析为logrus.Level类型。

使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
logrus 里怎么配置 DEBUG/INFO/WARN/ERROR 级别输出?
logrus 默认只输出 INFO 及以上级别(即 INFO、WARN、ERROR、FATAL),DEBUG 不会打印。要开启 DEBUG,必须显式设置日志级别:
• 调用 log.SetLevel(log.DebugLevel)(全局)或 logger.SetLevel(log.DebugLevel)(实例)
• 如果用了 logrus.TextFormatter,记得加 DisableLevelTruncation: true,否则 DEBU 会被截成 4 字符
• 环境变量控制时,建议用 os.Getenv("LOG_LEVEL") 解析后转成 logrus.Level,别硬写字符串比较
• 注意:测试中如果用 testify/assert 检查日志内容,得先将输出重定向到 bytes.Buffer,否则看不到 DEBUG 行
用 lumberjack 实现日志切割归档,关键参数怎么设? lumberjack 是最常用的 logrus 日志轮转后端,但默认配置容易踩坑:
• MaxSize 单位是 MB(不是字节),设 10 表示单个文件最大 10MB
• MaxBackups 控制保留几个旧日志,设 0 表示不限——但磁盘可能被撑爆,生产环境务必限制
• MaxAge 是过期天数(按文件修改时间算),和 MaxBackups 是“或”关系:任一条件满足就清理
• LocalTime 设为 true 才能按本地时区命名归档文件(如 app.log.2024-05-20)
• 切割触发时机是「写入前检查」,所以哪怕只写 1 字节,也会先判断是否超限——不用担心漏切
测试日志分级 + 切割逻辑,为什么总捕获不到归档行为? 单元测试里验证切割归档,不能靠等真实时间或文件大小,得做可控模拟:
• 把 lumberjack.Logger 的 Filename 指向临时目录(os.MkdirTemp),避免污染项目路径
• 手动调用 Rotate() 强制触发一次归档,再检查 filepath.Glob("*.log.*") 是否生成新文件
• 测试分级时,用 io.MultiWriter 同时写到 os.Stdout 和 bytes.Buffer,断言 buffer 内容是否含 "level=debug" 或 "level=error"
• 切记:logrus 的 SetOutput 是指针赋值,测试后要恢复原 Output,否则影响其他测试用例
• 如果用 testify/suite,在 SetupTest 里重置 logger,在 TeardownTest 清理临时文件
zap 替代 logrus 做分级+切割,差异在哪?
zap 更快更省内存,但原生不支持切割,得组合 lumberjack 或 fsnotify:
• zap 的 Debug/Info 等方法本身不带级别开关,开关由 AtomicLevel 控制,运行时可热更新
• 切割必须自己包装 lumberjack.Logger 作为 WriteSyncer,且要注意 Sync() 方法必须实现(lumberjack 已实现)
• zap 的结构化日志字段名是字符串,测试断言时得解析 JSON,不如 logrus 文本日志 grep 方便
• 如果只是单元测试验证行为,logrus + lumberjack 组合更轻量;高吞吐服务才值得迁移到 zap

















