在 Debian 上使用 Golang 日志出现乱码,通常不是 Go 本身的问题,而是字符编码、终端环境或输出方式不一致导致的。下面按常见原因给你一个排查清单。
Debian 默认期望使用 UTF‑8,如果 locale 设置不正确,Golang 输出的 UTF‑8 字符串在终端就会变成乱码。
locale
如果看到类似:
LANG=C
LC_ALL=
或不是 UTF-8,就很可能出问题。
locale -a | grep utf8
如果没有 zh_CN.UTF-8 或 en_US.UTF-8,需要先生成。
sudo dpkg-reconfigure locales
# 选择 en_US.UTF-8 或 zh_CN.UTF-8
或手动:
sudo locale-gen zh_CN.UTF-8
sudo update-locale LANG=zh_CN.UTF-8
然后 重新登录或重启终端。
Go 的 fmt、log、slog 默认都使用 UTF‑8 编码。
✅ 乱码不是 Go 的问题
❌ 而是“终端 / 文件 / 管道”解码方式不对
cat / vim 看文件乱码确认文件编码:
file your.log
如果是 UTF‑8,但终端不是 UTF‑8,就会乱码。
✅ 解决:
export LANG=en_US.UTF-8
cat your.log
Windows 记事本默认不是 UTF‑8。
✅ 解决:
iconv 转换:iconv -f utf-8 -t gbk your.log > your_gbk.log
如果你用 log 输出到 stdout,被 systemd 接管:
journalctl -u your-service
在 service 文件中加:
[Service]
Environment=LANG=en_US.UTF-8
Environment=LC_ALL=en_US.UTF-8
然后:
sudo systemctl daemon-reexec
sudo systemctl restart your-service
例如直接把 GBK 内容当字符串打印:
// 错误示例
buf := readGBK()
log.Println(string(buf)) // 乱码
✅ 正确做法(用 golang.org/x/text/encoding/simplifiedchinese):
import "golang.org/x/text/encoding/simplifiedchinese"
decoder := simplifiedchinese.GBK.NewDecoder()
utf8Bytes, _ := decoder.Bytes(gbkBytes)
log.Println(string(utf8Bytes))
docker run golang:latest locale
✅ 解决办法(Dockerfile):
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
你可以按顺序确认:
locale 是否是 UTF-8你可以贴出:
locale 输出我可以直接告诉你是哪一步导致的乱码。