beego默认不记录标准访问日志,需手动配置beelogger并用insertfilter在finishrouter阶段获取状态码、响应大小和耗时等字段写入文件;注意x-forwarded-for处理、静态资源路由覆盖及日志轮转无自动压缩。

Beego 默认不记录访问日志,必须手动启用
Beego 1.x 和 2.x 版本默认关闭 HTTP 访问日志(access log),不像 Gin 或 Echo 那样开箱即用。它只在 RunMode == "dev" 时输出简单请求信息到控制台,但不写文件、不带状态码/耗时/UA 等关键字段,不能用于运维分析。
要真正记录标准格式的访问日志(类似 Nginx 的 log_format combined),必须显式配置日志模块并挂载到 HTTP 处理链中。
使用 beego.BeeLogger + beego.InsertFilter 实现自定义访问日志
Beego 没有内置 AccessLogFilter,但可通过 InsertFilter 在请求进入控制器前、响应写出后插入日志逻辑。核心是捕获 http.ResponseWriter 的状态码和字节数 —— Beego 的 context.ResponseWriter 是包装过的,需用 ctx.ResponseWriter.Status 和 ctx.ResponseWriter.Size 获取。
- 在
main.go或router.go初始化后添加过滤器:
beego.InsertFilter("/*", beego.BeforeRouter, func(ctx *context.Context) {
start := time.Now()
// 记录开始时间,供后续计算耗时
ctx.Input.SetData("log_start_time", start)
})
beego.InsertFilter("/*", beego.FinishRouter, func(ctx *context.Context) {
status := ctx.ResponseWriter.Status
size := ctx.ResponseWriter.Size
method := ctx.Request.Method
path := ctx.Request.URL.Path
ua := ctx.Request.UserAgent()
cost := time.Since(ctx.Input.GetData("log_start_time").(time.Time)).Microseconds()
beego.Info(fmt.Sprintf(`%s "%s %s %s" %d %d %dµs "%s"`,
ctx.Request.RemoteAddr,
method, path, ctx.Request.Proto,
status, size, cost, ua))
})
- 注意:Beego 2.x 中
ctx.ResponseWriter.Status和ctx.ResponseWriter.Size是可靠可用的;1.x 需确保使用较新 patch 版本(≥1.12.3),否则可能为 0 - 日志输出目标由
beego.BeeLogger配置决定,不是控制台就是文件,见下一点
配置日志输出到文件而非控制台
Beego 日志默认输出到 console,访问日志量大时必须切到文件,否则会拖慢响应且无法持久化。关键配置项是 log.Output 和 log.Level,需在 conf/app.conf 中设置:
[prod] log.Output = "file" log.FileLine = false log.Level = 2 log.FilePath = "logs/" log.FileName = "access.log" log.MaxLines = 1000000 log.MaxSize = 104857600 log.Daily = true log.MaxDays = 30
-
log.Level = 2对应LevelInfo,确保beego.Info()被记录;若设为 3(Warn)则访问日志被丢弃 -
log.FilePath必须是相对路径(相对于可执行文件所在目录)或绝对路径,且进程需有写权限 - Beego 不自动创建
logs/目录,启动前需手动创建,否则日志写入失败且无报错提示
避免日志内容缺失或格式错乱的几个细节
实际部署中常见日志字段为空或异常,多因请求上下文被提前修改或中间件干扰:
-
ctx.Request.RemoteAddr可能是反向代理 IP(如 Nginx),应优先取X-Forwarded-For头:ctx.Request.Header.Get("X-Forwarded-For"),但需校验可信代理链 - 重定向(302)或 panic 导致的 500 错误,
ctx.ResponseWriter.Status可能晚于预期写入,建议在FinishRouter阶段读取更稳妥 - 静态资源(
/static/)默认不走 Beego 路由,不会触发该 filter —— 若需记录,需在 Nginx 层统一处理,或改用beego.StaticDir并确保路径被路由匹配 - 并发写日志时 Beego 文件 logger 是线程安全的,但若同时用多个
Info()写同一行(比如拆成多条),会出现日志错行,务必拼成单条再输出
最易忽略的是:Beego 的日志轮转依赖 log.Daily 和 log.MaxDays,但不会自动压缩旧文件,磁盘空间需单独监控。











