在 CentOS 上调整 Golang 程序日志的编码,通常分几种情况:你是用标准库 log、第三方日志库(zap / logrus / slog),还是关心终端/系统 locale 编码(如 UTF-8 vs GBK)。下面按常见场景说明。
Golang 本身输出的是 byte 流,编码取决于你写什么字节,以及终端怎么解释。
locale
典型正常环境:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是 UTF-8,可临时设置:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
永久生效(CentOS 7):
localectl set-locale LANG=en.UTF-8
Go 源码默认 UTF-8,日志直接写即可:
log.Println("中文日志测试")
只要终端是 UTF-8,就正常显示。
需要显式转换:
import "golang.org/x/text/encoding/simplifiedchinese"
import "golang.org/x/text/transform"
func toGBK(s string) []byte {
r, _, _ := transform.Bytes(simplifiedchinese.GBK.NewEncoder(), []byte(s))
return r
}
JSON 编码(适合服务器 / 容器)
cfg := zap.NewProductionConfig()
cfg.Encoding = "json"
logger, _ := cfg.Build()
Console 编码(适合调试)
cfg := zap.NewDevelopmentConfig()
cfg.Encoding = "console"
logrus.SetFormatter(&logrus.JSONFormatter{})
// 或
logrus.SetFormatter(&logrus.TextFormatter{})
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
如果用 systemd 启动 Go 程序:
[Service]
Environment=LANG=en_US.UTF-8
否则 journal 可能乱码。
查看日志:
journalctl -u your-service -f
| 现象 | 原因 |
|---|---|
| 中文变 ??? | 终端非 UTF-8 |
| JSON 中文是 unicode | 正常(\uXXXX) |
| SSH 乱码 | 客户端编码不对 |
| Docker 日志乱码 | 容器没设 LANG |
LANG如果你能补充:
我可以直接给你一份可复制的配置。