Go 语言的日志输出如何加颜色?
Go 日志加颜色的三种方式:手写 ANSI 转义码(\033[31m)、用 logrus/charmbracelet/log 等库的彩色 handler、slog 第三方 handler。本文给出三种实现。
最简单:用 ANSI 转义码——\033[31m 红色、\033[32m 绿色、\033[0m 复位;不想手写就用 logrus 或 charmbracelet/log 等自带彩色输出的库。
手写 ANSI 转义码
package main
import "fmt"
const (
colorRed = "\033[31m"
colorGreen = "\033[32m"
colorYellow = "\033[33m"
colorReset = "\033[0m"
)
func main() {
fmt.Println(colorRed + "ERROR: 连接失败" + colorReset)
fmt.Printf("%sINFO%s: 启动完成\n", colorGreen, colorReset)
}
用 logrus(自带彩色)
import log "github.com/sirupsen/logrus"
log.SetFormatter(&log.TextFormatter{ForceColors: true})
log.Warn("黄色警告") // TTY 下自动彩色
slog 场景
Go 1.21+ 的 slog 本身不带颜色,接 charmbracelet/log 等 handler 即可获得彩色 + 结构化输出。
注意事项
- 输出重定向到文件时应关闭颜色(转义码会污染日志文件):检测 TTY 后决定;
- Windows 老终端不支持 ANSI,新终端/PowerShell 已支持。
常见问题(FAQ)
Q:日志采集后颜色码怎么办? 应在写文件时禁用颜色;已混入的可用正则 \x1b\[[0-9;]*m 清洗。