在 Debian 上用 Go 打印日志“乱”,通常不是 Go 本身的问题,而是终端编码、系统 locale、日志输出目标、或第三方日志库配置不一致导致的。下面按最常见原因逐一说明。
Debian 默认有时是 C 或 POSIX,不是 UTF-8。
locale
如果看到:
LANG=C
LC_ALL=
或包含 POSIX,就容易乱码。
sudo apt install locales
sudo dpkg-reconfigure locales
选中:
en_US.UTF-8
或 zh_CN.UTF-8
然后:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
即使系统是对的,终端不对也会乱。
echo $TERM
echo $LANG
cmdchcp 65001
gbk 的编辑器打开(如老版记事本)zap.NewProduction()
默认输出 JSON,看起来“乱”,其实不是乱码,是结构日志。
log.SetFormatter(&log.JSONFormatter{})
logrus.SetFormatter(&logrus.TextFormatter{
FullTimestamp: true,
})
比如:
import "golang.org/x/text/encoding/simplifiedchinese"
decoder := simplifiedchinese.GBK.NewDecoder()
utf8Str, _ := decoder.String(gbkStr)
如果你用:
journalctl -u your-service
在 service 文件加:
[Service]
Environment=LANG=en_US.UTF-8
然后:
sudo systemctl daemon-reload
sudo systemctl restart your-service
locale 是 UTF-8如果你愿意,可以贴一段:
我可以直接帮你定位是哪一类“乱”。