在 CentOS 上运行 Golang 程序出现日志乱码,通常不是 Go 本身的问题,而是字符编码不一致导致的。下面按常见原因逐步排查和解决。
go run / 二进制,看到乱码cat / tail 看乱码locale
如果看到:
LANG=
LC_ALL=
或
zh_CN.GBK
就容易导致乱码。
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
✅ 推荐(中文环境):
export LANG=zh_CN.UTF-8
export LC_ALL=zh_CN.UTF-8
vim /etc/locale.conf
内容:
LANG="zh_CN.UTF-8"
然后:
source /etc/locale.conf
Go 的 string 默认就是 UTF-8,不要手动转 GBK。
错误示例(容易乱码):
fmt.Println(string([]byte("中文"))) // 如果来源是 GBK 就会乱
import "log"
log.Println("中文日志")
或:
import "github.com/sirupsen/logrus"
logrus.Info("中文日志")
比如:
import "golang.org/x/text/encoding/simplifiedchinese"
import "golang.org/x/text/transform"
func gbkToUtf8(s []byte) ([]byte, error) {
return ioutil.ReadAll(transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewDecoder()))
}
systemd 默认 LANG=C
编辑 service 文件:
vim /etc/systemd/system/your-app.service
加:
[Service]
Environment=LANG=zh_CN.UTF-8
Environment=LC_ALL=zh_CN.UTF-8
然后:
systemctl daemon-reload
systemctl restart your-app
确认:
locale 是 UTF-8你可以贴一下:
我可以直接帮你定位到是哪一层出的问题。