beego 默认日志输出到控制台(os.stdout),不写文件、不持久化;需调用logs.setlogger()或addlogger()显式配置输出目标,如同时输出到console和file需先reset()再分别addlogger()。

Beego 默认日志输出到哪里?
Beego 2.x 默认使用 logs.BeeLogger,启动时自动初始化,日志默认输出到 console(标准输出),**不写文件,也不持久化**。如果你没显式配置,beego.Info("hello") 只会打印在终端,程序重启后日志就没了。
要记录到文件,必须手动设置日志输出目标——不是改 beego.Run() 参数,而是调用 logs.SetLogger() 配置驱动。
怎么把日志同时输出到控制台和文件?
Beego 的 logs 包支持多输出目标(multi writer),常见做法是:一个 console 用于开发调试,一个 file 用于生产留存。注意:不能直接多次调用 SetLogger(),它会覆盖前一次;要用 AddLogger() 追加。
- 先清空默认 logger:
logs.Reset() - 添加 console 输出:
logs.AddLogger(logs.AdapterConsole, ``) - 添加 file 输出(带轮转):
logs.AddLogger(logs.AdapterFile, `{"filename":"logs/app.log","maxlines":10000,"maxsize":1048576,"daily":true,"maxdays":7}`)
其中 maxlines、maxsize、daily、maxdays 是文件轮转关键参数,漏掉 daily:true 就不会按天切分,只靠大小或行数触发。
为什么 beego.Error() 没写进文件?
常见原因是:你调用了 beego.SetLevel(beego.LevelInformation) 或更低,而 beego.Error() 对应 LevelError(数值为 3),如果 Level 设成 4(LevelWarning)或更高,Error 日志会被过滤掉。
Beego 日志等级从低到高是:LevelDebug(0) → LevelInfo(1) → LevelWarning(2) → LevelError(3) → LevelCritical(4)。确认等级设置:
beego.SetLevel(beego.LevelError) // 只输出 Error 及以上 // 或更常用: beego.SetLevel(beego.LevelDebug) // 开发期全开
另外,beego.Error() 底层调的是 logs.BeeLogger.Error(),所以最终是否写出,取决于 logs.BeeLogger 的 Level 和各 Adapter 的 Level 设置(后者优先级更高)。
如何在中间件或 controller 里打带请求上下文的日志?
Beego 自身不提供 request-scoped logger,但你可以用 ctx.Input.Data 或自定义 context 传递 trace ID。最轻量的做法是:在 Prepare() 里生成唯一 ID 并存入 ctx.Input.Data["trace_id"],然后封装一个日志函数:
func ctxLog(ctx *context.Context, level string, v ...interface{}) {
id := ctx.Input.GetData("trace_id")
if id == nil {
id = "unknown"
}
msg := fmt.Sprint(v...)
logs.BeeLogger.Logf(level, "[trace:%s] %s", id, msg)
}
调用时:ctxLog(ctx, "info", "user login", "uid=", uid)。注意不要在日志里拼接敏感字段(如密码、token),Beego 日志本身不脱敏,得靠业务层过滤。
真正容易被忽略的点是:日志文件路径是相对路径(如 "logs/app.log"),它基于 **当前工作目录(os.Getwd())**,不是项目根目录或 main.go 所在目录。部署时务必确认启动命令的 cwd 正确,否则日志可能写到意想不到的位置,甚至因权限问题静默失败。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











