iris mvc默认不打访问日志,因其专注业务逻辑分发,日志由中间件处理;需手动注册iris.logger中间件,且须在mvc配置前启用,它仅记录状态码、路径与耗时,不包含请求/响应体。

为什么Iris MVC默认不打访问日志
Iris的MVC层本身不自动记录HTTP请求日志,它把这件事交给中间件链处理。如果你只注册了mvc.Application而没加日志中间件,哪怕控制器方法执行了,app.Logger()也不会自动输出GET /users/123这类访问记录。这不是bug,是设计取舍:MVC专注业务逻辑分发,日志归中间件管。
用iris.Logger中间件最简单
直接调用app.Use(iris.Logger)就能打出标准访问日志,格式类似:2026/09/21 04:18 [INFO] GET /api/users 200 12ms。但要注意三点:
- 必须在
mvc.Configure或mvc.New之前注册,否则MVC路由匹配后日志中间件已跳过 - 该中间件只记录状态码、路径、耗时,不包含请求体或响应体内容
- 如果启用了
Recovery中间件,它会拦截panic并返回500,此时iris.Logger仍会记下那条500日志——这是正常行为,不是漏记
想记录请求/响应体?得自己写中间件
iris.Logger不解析Body,要记录JSON参数或响应数据,得手动读取并重放:
- 调用
ctx.ReadBody(&v)前先用ctx.Request().Body读一次,再用io.NopCloser包回去,否则后续控制器拿不到Body - 响应体不能直接捕获,得用
ctx.ResponseWriter().Clone()(Iris v12.2.5+支持)或包装ResponseWriter接口 - 敏感字段如
password、token必须脱敏,建议在中间件里用json.RawMessage解析后删键,别依赖结构体tag - 避免在日志里打印二进制或超长文本,加长度限制,比如
body[:min(len(body), 1024)]
和MVC控制器共享Logger实例
MVC控制器里不能直接用app.Logger(),因为app不在控制器作用域。正确做法是:
- 在
BeforeActivation里用b.Dependencies().Add(app.Logger())注入 - 控制器字段声明
Logger *zap.Logger(或你用的任意logger),Iris会自动绑定 - 不要在
BeginRequest里调用ctx.Application().Logger()——它返回的是全局实例,但无法保证和中间件日志时间戳对齐 - 若用Logrus/Zap等第三方logger,确保其
WithField("request_id", ctx.GetID())在中间件里已设好,控制器内复用即可
真正难的不是“怎么打日志”,而是日志字段是否对齐、是否可关联、是否被异步goroutine污染。MVC控制器里调用go func() { c.Logger.Info("in goroutine") }()时,c.Logger若没带MDC上下文,这条日志就丢了request_id——这种坑比语法错误更隐蔽。











