Beego日志默认不按日期切分,因其FileLogger的Daily=true仅控制每日新建文件,不自动生成带日期后缀的归档文件,也不清理旧日志,易导致覆盖而非保留;需手动拼接日期文件名并禁用Rotate,或改用lumberjack实现可靠按天切分。

Beego 日志切分为什么默认不按日期?
Beego 1.x 内置的 logs 模块默认使用 FileLogger,它只支持按文件大小(MaxLines、MaxSize)或按天轮转(Daily),但「按日期命名 + 自动归档」需要手动干预——因为它的 Daily = true 仅控制「是否每天新建一个文件」,**不会自动重命名旧日志为 app.2024-05-20.log 这类格式,也不清理历史文件**。
也就是说:开启 Daily = true 后,每天会写入 app.log,旧文件会被直接覆盖(取决于 Rotate 设置),不是你想要的「保留每天一份、带日期后缀」的效果。
用 SetLogger 配合自定义 Filename 实现日期切分
核心思路是:**每次写日志前动态生成带日期的文件名,并确保 Beego 不做覆盖而是追加**。Beego 的 FileLogger 支持通过 Filename 字段指定路径,且若路径含日期占位符(如 app.{YMD}.log),需配合 logs.SetLogger 在每次请求/定时器中刷新 logger 实例(因为 Beego 不自动重载)。
实操建议:
- 关闭内置的全局日志初始化(避免冲突),改用手动
logs.NewLogger(1000)创建实例 - 在
main()或init()中不直接调用logs.SetLogger,而是封装一个getDailyLogger()函数,内部用time.Now().Format("2006-01-02")拼出文件名,再SetLogger - 必须设置
Rotate = false,否则 Beego 会在同一天内因大小触发切割,破坏日期一致性 - 若需长期运行,建议每小时或每天凌晨调用一次
getDailyLogger()刷新(可用time.Ticker)
示例关键代码:
func getDailyLogger() *logs.BeeLogger {
now := time.Now()
filename := fmt.Sprintf("logs/app.%s.log", now.Format("2006-01-02"))
logger := logs.NewLogger(1000)
logger.SetLogger(logs.AdapterFile, `{"Filename":"`+filename+`","Level":7,"Rotate":false}`)
return logger
}
// 在 main() 中初始化
logs.SetLogger(logs.AdapterFile, `{"Filename":"logs/app.`+time.Now().Format("2006-01-02")+`.log","Level":7,"Rotate":false}`)
更可靠的做法:换用 github.com/natefinch/lumberjack
Beego 的原生日志模块对日期切分支持弱,而 lumberjack 是 Go 生态事实标准,天然支持按大小/时间双维度切割,且能自动保留带日期后缀的归档文件(通过 LocalTime: true + 自定义 Filename 格式)。
适配 Beego 的关键点:
- Beego 的
FileLogger底层其实可接受任意io.Writer,所以你可以把*lumberjack.Logger包一层传给SetLogger - 必须禁用 Beego 的
Rotate(设为false),否则它会干扰lumberjack的行为 -
lumberjack默认不带日期后缀,需在Filename中硬编码日期,或用GetLogWriter动态返回带日期的 writer(推荐) - 注意
lumberjack的MaxAge是归档保留天数,不是切割周期;切割靠MaxSize或外部定时器触发
简单起见,多数项目选择用 lumberjack + 定时器每日 0 点切换 writer,比折腾 Beego 原生逻辑更稳。
容易忽略的权限与路径问题
Beego 日志路径是相对路径(如 logs/app.log),实际写入位置取决于进程启动目录,不是项目根目录。常见错误:
- 部署到 systemd 时工作目录是
/,导致日志写入/logs/并报permission denied - 容器中未挂载日志目录,或目录不存在且 Beego 不自动创建父级(
os.MkdirAll需自己做) - 多实例共用同一日志文件名(如都写
app.2024-05-20.log),造成内容错乱(Beego 不加文件锁)
解决方法:初始化日志前先 os.MkdirAll("logs", 0755),且生产环境强烈建议用绝对路径(如 /var/log/myapp/app.{YMD}.log),并确认运行用户有写权限。
Beego 原生日志对日期切分的支持是“半成品”,真正落地时几乎总要绕过它的 Daily 选项,要么手动拼日期文件名并小心控制 Rotate,要么直接切到 lumberjack。后者看似多引入一个依赖,实则省去大量边界 case 处理。











