iris默认日志无颜色,因setlevel仅控制级别而非着色;需用colorable.newcolorablestdout()替换默认writer才能启用ansi彩色输出,windows还需vt模式支持。

为什么 iris.Logger().SetLevel(iris.LogDebug) 不显示颜色?
因为 Iris 默认日志输出是纯文本,SetLevel 只控制日志级别,不启用 ANSI 颜色。终端是否显示彩色,取决于日志输出器(Logger)是否使用了带颜色的 writer,而不是日志级别设置。
常见现象:本地开发时看到灰白日志,误以为配置没生效;其实日志已输出,只是没着色。
- Iris v12+ 内置
iris.DefaultWriter是无色的,即使终端支持 ANSI 也不自动着色 - 生产环境通常禁用颜色(如重定向到文件),但开发时建议显式启用
- 不能只靠
SetLevel或SetOutput,必须替换底层 writer
用 colorable.NewColorableStdout() 替换默认 writer
Iris 不自带彩色 writer,但可借助 golang.org/x/sys/windows(Windows)和 github.com/mattn/go-colorable 实现跨平台 ANSI 支持。后者是事实标准,Iris 社区示例也普遍采用它。
实操步骤:
- 安装依赖:
go get github.com/mattn/go-colorable - 在
main()初始化 Iris 之前,用colorable.NewColorableStdout()创建着色 writer - 调用
app.Logger().SetOutput()替换默认输出目标 - 确保未同时调用
app.Logger().SetOutput(os.Stderr)等覆盖操作
package main
import (
"github.com/kataras/iris/v12"
"github.com/mattn/go-colorable"
)
func main() {
app := iris.New()
app.Logger().SetOutput(colorable.NewColorableStdout())
app.Logger().SetLevel(iris.LogDebug)
app.Get("/", func(ctx iris.Context) {
ctx.Application().Logger().Debug("这行会显示为蓝色")
ctx.Application().Logger().Warn("这行会显示为黄色")
ctx.Application().Info("这行会显示为绿色")
ctx.WriteString("hello")
})
app.Listen(":8080")
}
为什么 os.Stdout 在 Windows 上不显示颜色?
Windows 旧版 cmd/powershell 默认不启用虚拟终端(VT)模式,导致 ANSI 转义序列被忽略,直接打印原始字符(如 \x1b[34m),看起来像乱码或空白。
go-colorable 的作用就是检测平台并自动适配:在 Windows 上调用 SetConsoleMode 启用 VT,Linux/macOS 直接透传 ANSI 序列。
- 不用
go-colorable而直接写os.Stdout:Windows 下必然无色(或乱码) - 用
colorable.NewColorableStdout()但没 import:编译失败,注意检查 import 路径是否拼错 - Docker 容器内运行时,若终端非 TTY(如
docker run -d),颜色也会被禁用——这是预期行为,不是 bug
自定义日志格式时如何保留颜色?
如果你调用 app.Logger().SetFormatter() 使用自定义格式(如 JSON 或带 traceID),默认颜色会丢失,因为 iris.TextFormatter 的颜色逻辑绑定在默认实现里。
解决方法只有两个:
- 不要替换 formatter,改用
app.Logger().Child("my-tag")分流日志,主日志保持默认彩色格式 - 若必须自定义格式,需手动在字符串中插入 ANSI 转义码(如
"\x1b[36m[DEBUG]\x1b[0m"),并确保 writer 是 colorable 的 - 注意:
iris.JSONFormatter完全不支持颜色,因其输出是结构化文本,颜色无意义
最稳妥的做法是开发环境用默认彩色 formatter,生产环境用 JSONFormatter + os.Stderr,两者通过构建 tag 或环境变量切换。











