Revel 日志需手动配置 conf/app.conf 三项:log.info.output、log.error.output 设为文件路径,log.level 在 [dev] 段设 DEBUG;必须创建 log/ 目录,否则日志静默丢失;加 log.info.flags=10 和 prefix 提升可读性;轮转需同时配 maxsize、maxlines、backupcount 且 output 不能为 stdout;配置生效须重启并确认运行模式匹配对应段落。

Revel 安装后日志默认只打到 stdout,且不建目录、不轮转、不带文件位置——直接跑起来根本看不到 ERROR 以外的上下文,线上出问题时连哪一行报的错都找不到。
conf/app.conf 里必须改的三项
Revel 日志配置全靠 conf/app.conf,代码里调 revel.INFO 或 revel.ERROR 不会改变输出行为。不改这三项,日志基本等于“半残废”:
-
log.info.output = log/info.log(别留stdout,否则 dev 模式下控制台刷屏,关键信息被淹没) -
log.error.output = log/error.log(单独拆开,避免 INFO 日志冲掉 ERROR 堆栈) -
log.level = DEBUG(加在[dev]段,让revel.DEBUG生效;生产环境换成ERROR)
⚠️ 注意:log/ 目录必须手动创建,Revel 从不自动建目录。目录不存在时,日志静默丢弃,控制台也不报错。
加时间戳和文件位置:log.info.flags 和 log.info.prefix
默认日志格式是 [INFO] app user login failed,没有时间、没有文件行号,查问题像盲人摸象。要加上这两项:
-
log.info.flags = 10(Ltime | Llongfile = 2 | 8,即显示时间 + 完整文件路径 + 行号) -
log.info.prefix = "INFO "(可选,让前缀更清晰,和WARN/ERROR对齐)
改完重启应用,日志就变成:14:05:22 /app/controllers/user.go:87 INFO user login failed。没这一步,你永远不知道 revel.INFO 是谁在哪个函数里打的。
log.file.maxsize 不生效?三个参数必须同时配
想让日志自动轮转(比如单个文件不超过 10MB),只设 log.file.maxsize = 10485760 没用。Revel 的轮转逻辑要求三者共存:
-
log.file.maxsize = 10485760(单位是字节,不是 MB) -
log.file.maxlines = 10000(行数限制也得设,哪怕只是凑数) -
log.file.backupcount = 5(默认是 0,不设就永不轮转)
而且 log.output 必须是 file 或 both,不能是 stdout。轮转触发时机是「写入前检查」,所以实际文件大小可能略超一点才切。
为什么改了配置却没反应?重启和模式段落是关键
Revel 日志配置不支持热重载,改完 conf/app.conf 后必须重启进程。另外极易踩坑的是段落匹配:
- 你在
[prod]里改了log.error.output,但用revel run -a myapp启动,默认读的是[dev]段 —— 日志还是打 stdout - 命令行加
-log.level=TRACE只对[dev]有效,[prod]下完全忽略 - 验证是否生效:启动后立刻
tail -f log/error.log,再触发一个错误(比如故意访问不存在的路由),看有没有新行
最常被忽略的一点:Revel 用的是 log4go,不是 logrus/zap,所有第三方日志库的配置或 hook 都无效——别白费劲去 import。

















