beego.SetLogger没生效的根本原因是调用时机错误——必须在beego.Run()之前且晚于beego.BeeApp初始化(app.conf加载完成)执行,若在controller、filter或路由注册后调用,会被内部重置为默认console logger。

beego.SetLogger 为什么没生效
根本原因是调用时机错——beego.SetLogger 必须在 beego.Run() 之前、且晚于 beego.BeeApp 初始化(即 app.conf 加载完成)之后执行。如果放在 controller、filter 或路由注册之后,它会被 Beego 内部重置为默认 console logger。
常见踩坑点:
- 在
init()函数里调用,但早于beego.BeeApp构建(比如beego.AppConfig尚未加载),导致配置被忽略 - 混用
logs.SetLogger和beego.SetLogger:二者底层都操作logs.BeeLogger,后调用者会覆盖前者的输出目标 - 误以为改了
conf/app.conf中的loglevel就能控制文件输出——其实它只影响 console 日志级别,对文件日志完全无效
日志写到文件但不轮转?
Beego 默认的 file adapter 不带滚动能力。直接传 {"filename":"logs/app.log"} 就是单文件无限追加,磁盘爆满风险极高。
正确做法是启用轮转参数,或换用 multifile:
立即学习“go语言免费学习笔记(深入)”;
- 用
file+ 轮转:必须同时指定"daily":true和"maxdays":7,否则不会按天切分也不会清理旧日志 - 确保
logs/目录存在且进程有写权限,否则静默失败(无报错,日志直接丢弃) - 更推荐
multifile:它专为时间切分设计,"datefmt":"2006-01-02"生成app.2026-10-08.log这类文件,"filename":"logs/app"不能带后缀 - 别漏掉
logs.Reset():否则 console 输出器还在,日志会重复打印两份
怎么让 MySQL 和 Cache 模块写不同日志文件
Beego 全局 logger 是单实例,不支持多目标分流。但可以手动创建命名 logger 并注册:
关键步骤:
- 在
main.go初始化阶段,用beego.NewLogger("file", ...)创建独立 logger 实例 - 调用
beego.RegisterLogger("mysql", mysqlLogger)注册为命名 logger - 业务代码中通过
l := beego.GetBeeLogger().GetLogger("mysql")获取并使用,如l.Info(...) - 注意:命名 logger 不受
beego.SetLevel()控制,需单独调用mysqlLogger.SetLevel(beego.LevelDebug)
JSON 格式日志怎么输出
Beego 原生不支持 JSON 输出:file 和 console adapter 固定为文本行格式。硬拼 JSON 字符串会导致时间戳、级别字段重复,且无法被 Filebeat、Loki 等采集器解析。
可行方案只有两个:
- 自定义 adapter:实现
beego.LoggerInterface,在WriteMsg()中构造完整 JSON 对象(含level、time、msg、file、line等字段),再用beego.SetLogger("custom", customLogger)注册 - 绕过 Beego logger:直接用标准库
encoding/json+os.OpenFile手写 JSON 日志,但会丢失 Beego 的分级过滤、异步缓冲等能力
真正难的不是写 JSON,而是保证每条日志字段语义一致、时间精度统一、错误时仍能落盘——这些细节在自定义 adapter 里全得自己兜底。


















