beego日志默认仅dev模式下启用console输出且级别为leveltrace;若手动注册引擎需显式初始化、设级别并匹配调用条件,否则info等低级别日志会被静默丢弃。

Beego 的日志输出不是“开箱即用”的完整配置,而是分两层:框架内置的 BeeLogger 默认只启用了 console 输出(仅 dev 模式下生效),且默认级别是 LevelTrace;但若你调用 logs.SetLogger 手动注册引擎,就必须显式初始化、设置级别、并确保日志调用触发条件匹配——否则很可能看不到任何输出。
如何让 Beego 日志真正打到控制台
开发阶段最常踩的坑是:写了 logs.Info("hello") 却没输出。这不是代码错了,而是默认行为被覆盖或未激活。
-
BeeLogger在beego.Run()启动时才自动启用 console,如果你绕过 beego 启动流程(比如直接用logs.NewLogger),它不会自动接管 - 即使用了
beego.BeeLogger,也要确认RunMode = "dev",因为 prod 模式下 beego 会禁用日志输出(除非你手动重置) - 必须调用
beego.SetLevel(logs.LevelDebug)或更低级别(如LevelTrace),否则Info及以下级别会被静默丢弃 - 如果自己 new 了一个
logs.Logger实例(如log := logs.NewLogger(10000)),记得最后调用log.Close(),否则缓冲区可能不刷新
用 file 引擎持久化日志时的关键配置项
文件日志看似简单,但 maxlines、daily、rotate 这三个参数组合容易导致日志不滚动或覆盖。
-
"daily": true和"rotate": true必须同时为true才会按天切分;若rotate=false,即使daily=true也只会写一个文件 -
"maxlines"和"maxsize"是“或”关系:任一条件满足就触发 rotate,不是“且”。默认maxlines=1000000,大流量服务建议调低(如 50000)避免单文件过大 -
"perm"默认是0600,生产环境若需其他进程读取(如 filebeat),得设为0644,否则权限拒绝 - 路径必须写绝对路径或确保工作目录稳定,相对路径如
"filename": "logs/app.log"在 systemd 服务中常因 cwd 不一致而写入失败
SMTP 邮件告警为什么总不发
Beego 的 smtp 引擎不是“写个 error 就发邮件”,它是一套带开关和过滤条件的管道——配置错一个字段,就会静默失效。
-
"lossy": false是硬性要求,否则只在进程退出时汇总发一次,不是实时告警 -
"sendLevel": "error"必须是字符串,不是整数;值必须是小写,如"error",写成"Error"或logs.LevelError都无效 - 所有 key 必须严格小驼峰:
"smtpAddr",不是"smtp_addr"或"SMTPADDR";JSON 字符串值必须双引号包裹,不能单引号 - 密码不能明文写死,应从环境变量注入,例如
"sendPass": "${SMTP_PASS}",并在启动前export SMTP_PASS=xxx
多引擎共存时的日志分流逻辑
Beego 允许同时注册 console、file、smtp 等多个引擎,但它们共享同一个日志级别阈值——不是每个引擎独立控制,而是由 SetLevel 统一裁决是否进入 pipeline。
- 先由
SetLevel判断日志是否“够格”进入缓冲区(如设为LevelError,则Info直接丢弃,后续引擎都收不到) - 各引擎可再通过自身配置进一步过滤:比如 file 引擎配
"level": 7(LevelTrace),而 smtp 配"sendLevel": "error",这样 info 写进文件但不发邮件 - 异步模式
log.Async()只影响写入性能,不改变路由逻辑;但开启后若未调用log.Close(),程序退出时可能丢失最后几条日志 - 若用
logs.SetLogger("multifile", config),注意它和"file"是不同适配器,multifile支持按模块分文件,但配置结构完全不同,不能混用
Beego 日志真正的复杂点不在语法,而在层级控制权分散:全局 SetLevel、引擎级 sendLevel、运行模式(dev/prod)、甚至 Async() 的 flush 时机,四者叠加后,一条 Error 是否可见、是否落盘、是否发邮件,取决于最严的那个关卡。调试时建议先关掉所有引擎,只留 console + SetLevel(LevelTrace),确认基础通路,再逐个打开并验证过滤行为。











