iris.Logger() 默认输出到 os.Stdout,不支持文件写入;需用 os.OpenFile 创建 *os.File 并通过 app.Logger().SetOutput() 注入,注意错误检查与关闭时机;生产环境建议替换为支持轮转的 zerolog 或 zap。

iris.Logger() 默认不支持直接写入文件
iris 内置的 iris.Logger() 是基于 log.Logger 的封装,输出目标固定为 os.Stdout,没有内置文件写入能力。想落地到文件,必须替换底层 io.Writer —— 这是核心前提,否则所有配置都无效。
用 os.File 替换 logger 的 output writer
最直接的方式是创建一个 *os.File,然后通过 SetOutput() 注入到 iris 日志器中。注意:iris v12+ 使用 Application.Logger().SetOutput(),不是旧版的 iris.Logger().SetOutput()。
常见错误现象:panic: runtime error: invalid memory address,通常是因为 os.OpenFile 失败但没检查 err,导致传了 nil 给 SetOutput。
实操建议:
- 用
os.OpenFile(path, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)打开文件,确保可追加写入 - 务必在
app.Run()前完成替换,否则启动后日志已绑定 stdout - 建议用
defer file.Close(),但注意:关闭时机要晚于应用退出,否则可能丢最后几条日志
示例片段:
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
panic(err)
}
app.Logger().SetOutput(file)
// 后续调用 app.Logger().Infof(...) 就会写入 app.log
需要轮转?得换第三方日志器(如 zerolog)
iris 原生日志器不支持按大小/时间轮转、压缩、保留天数等能力。如果要求生产环境长期运行,硬靠 os.File 追加会导致单文件无限膨胀。
可行路径:
- 用
github.com/rs/zerolog或go.uber.org/zap替换默认 logger,再通过app.Logger().SetChild()(v12+)或自定义iris.Application{Logger: ...}注入 - zerolog 示例中,用
zerolog.New(rollingFileWriter).With().Timestamp().Logger()构建带轮转的 writer - 注意兼容性:替换后
app.Logger().Infof()仍可用,但底层实际调用的是你注入的实例
别忽略日志级别和格式控制
iris 默认日志级别是 info,但文件写入后无法交互式过滤,容易被 debug 日志淹没。建议显式设置:
- 调用
app.Logger().SetLevel(iris.LogInfo)限制最低输出级别 - 若用 zerolog/zap,需额外配置格式(如 JSON vs 文本),iris 不干预这部分,全由你选的日志库决定
- 避免在中间件里反复调用
app.Logger().SetOutput(),会导致 writer 被覆盖或并发写冲突
复杂点在于:文件 I/O 是阻塞操作,高并发下可能成为瓶颈;轮转逻辑若不在 writer 内部实现,就得自己监听信号或定时检查——这些细节很容易被忽略。


















