Revel 默认不记录 HTTP 请求日志,需手动在 init.go 中注入 revel.RequestLogger 中间件,并配置 log.request.output 指向文件,同时确保目录存在可写、启动模式正确且代理头适配。

Revel 默认不记录每条 HTTP 请求日志,必须手动启用并配置中间件和日志输出目标,否则你永远看不到 GET /api/user 这类访问痕迹。
启用 Revel 内置请求日志中间件
Revel 提供了开箱即用的请求日志功能,但默认未激活。它不是靠 app.conf 开关控制,而是通过修改 app/init.go 中的 revel.InterceptFunc 调用链来注入。
- 打开
app/init.go,找到init()函数内类似revel.InterceptFunc(..., revel.BEFORE)的调用位置 - 插入一行:
revel.InterceptFunc(revel.RequestLogger, revel.BEFORE) - 确保该行在
revel.Router之前执行,否则路由未解析,日志里只会显示/?
配置请求日志输出到文件而非终端
即使启用了中间件,日志仍默认走 revel.INFO 输出通道,而 revel.INFO 默认只写 stdout(开发时刷屏,生产时无留存)。必须显式重定向其输出路径。
- 编辑
conf/app.conf,在[dev]或[prod]区段中添加:log.info.output = log/request.log - log/ 目录必须已存在且可写,Revel 不会自动创建,目录缺失会导致日志静默丢弃
- 若想区分请求日志和其他 INFO 日志,可新建独立通道:添加
log.request.output = log/request.log和log.request.level = INFO,再在init.go中改用revel.NewLogger("request")替代默认 logger
调整请求日志格式与内容细节
默认请求日志只含时间、状态码、路径和耗时,缺少客户端 IP、User-Agent 或响应体大小等关键字段——这些需靠自定义中间件或 patch 原生 RequestLogger 实现。
- 原生
revel.RequestLogger源码硬编码了格式,无法通过配置扩展;如需 IP,得自己写一个中间件读取req.RemoteAddr或X-Forwarded-For - 若仅需增强时间精度和文件定位,可在
app.conf中为 request 通道加前缀和标志:log.request.prefix = "REQ "和log.request.flags = 10(即Ltime | Llongfile) - 注意:
log.request.flags只影响日志头,不影响请求行本身内容;要改请求行字段,必须覆盖revel.RequestLogger函数逻辑
验证请求日志是否真实生成
光改配置不等于日志就落地,常见静默失败点集中在路径、权限和启动模式三处。
- 启动应用后,立刻检查
log/request.log文件是否存在且有内容:ls -l log/request.log && tail -n1 log/request.log - 若文件为空,确认启动命令是否带
-d(dev 模式):非 dev 模式下revel.RequestLogger被跳过 - 若报
permission denied,检查log/目录属主:ls -ld log/,必要时运行chmod 755 log/或chown $USER log/ - 在 Nginx 反向代理后,
req.RemoteAddr会变成127.0.0.1,此时必须依赖X-Real-IP头,而原生RequestLogger不读这个头——这是最容易被忽略的盲区


















