beego日志系统应使用github.com/astaxie/beego/logs包而非旧beelogger:需newlogger(10000)创建实例,setlogger("file",json配置)设文件输出,enablefunccalldepth(true)开启文件行号,setlevel()按数值级别(0最高)控制过滤,异步模式下须调close()确保日志刷新。

Beego 的日志系统默认是开启的,但直接用 beego.Debug 或 beego.Error 这类全局函数,底层走的是已弃用的旧日志路径(BeeLogger),不支持多引擎、异步、文件轮转等关键能力。真正该用的是 github.com/astaxie/beego/logs 包,它才是当前稳定维护的日志模块。
如何正确初始化 logs 包并设置文件输出
别再调 beego.SetLogger("file", ...) —— 这个接口在 v2+ 中已被标记为 deprecated,且无法和 logs 包共存。必须显式创建 logs.BeeLogger 实例:
- 先
go get github.com/astaxie/beego/logs(注意不是beego/v2下的子包) - 用
logs.NewLogger(10000)创建实例,参数是异步 channel 缓冲大小,设太小(如 100)会导致高并发下日志丢失 - 调
log.SetLogger("file", `{"filename":"logs/app.log","maxlines":1000000,"maxsize":10485760,"daily":true,"maxdays":15}`)—— 所有配置必须是合法 JSON 字符串,maxlines和maxsize不设会默认无限追加,磁盘爆掉是常见事故 - 记得调
log.DelLogger("console")关掉默认的控制台输出,否则日志重复刷屏
日志级别设置与实际输出逻辑
logs.SetLevel() 控制的是“最低可记录级别”,但 Beego 的级别定义容易混淆:数值越小,级别越高。比如 LevelEmergency = 0,LevelDebug = 7。设置 logs.LevelWarning(值为 4)后,只输出 Emergency、Alert、Critical、Error、Warning 这 5 级,Notice 及以下全被过滤。
- 不要混用旧包的
beego.SetLevel(beego.LevelError)和新包的logs.SetLevel(logs.LevelError),它们互不影响,但旧调用无效 - 调试时临时开全量日志,用
logs.SetLevel(logs.LevelDebug);上线前务必改成logs.LevelInfo或更高 -
logs.LevelTrace是别名,实际等于LevelDebug,没有独立语义
为什么日志没写入文件或没显示行号
两个最常被忽略的开关:
-
log.EnableFuncCallDepth(true)必须调用,否则所有日志都不带文件名和行号;默认是 false,且这个设置只对当前 logger 实例生效 -
log.SetLogFuncCallDepth(3)控制栈帧深度,设太小(如 1)会显示到logs包内部函数,设太大(如 10)可能越界 panic;生产环境推荐设为 3,能准确定位到业务代码调用点 - 如果用了异步模式(默认开启),
log.Close()必须在进程退出前调用,否则最后一批日志可能滞留在 channel 里未 flush - 检查
logs/app.log所在目录是否存在、进程是否有写权限 —— Beego 不自动创建父目录,mkdir -p logs得自己做
日志分级本身不难,难的是让每个级别在正确时机、以正确格式、落到正确位置。尤其要注意旧 API 和新 logs 包的隔离性 —— 它们共享同名函数但完全不互通,混用只会让你以为配置生效了,其实什么都没发生。











