温馨提示×

centos golang日志乱码咋解决

小樊
46
2026-09-30 06:26:21
栏目: 编程语言

在 CentOS 上运行 Golang 程序出现日志乱码,通常不是 Go 本身的问题,而是字符编码不一致导致的。下面按常见原因逐步排查和解决。


一、先确认乱码是什么场景

  1. 终端里直接运行 go run / 二进制,看到乱码
  2. 日志写到文件,用 cat / tail 看乱码
  3. 通过 systemd / nohup 启动后乱码
  4. 中文日志乱码,英文正常

二、最常见原因:系统 Locale 不是 UTF-8

1. 查看当前字符集

locale

如果看到:

LANG=
LC_ALL=

或

zh_CN.GBK

就容易导致乱码。

2. 设置为 UTF-8

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

3. 永久生效

vim /etc/locale.conf

内容:

LANG="zh_CN.UTF-8"

然后:

source /etc/locale.conf

三、Go 程序本身的正确做法(非常重要)

✅ Go 内部永远使用 UTF-8

Go 的 string 默认就是 UTF-8,不要手动转 GBK。

错误示例(容易乱码):

fmt.Println(string([]byte("中文"))) // 如果来源是 GBK 就会乱

✅ 日志库推荐

import "log"

log.Println("中文日志")

或:

import "github.com/sirupsen/logrus"
logrus.Info("中文日志")

四、如果日志来自外部(GBK 输入)

比如:

  • 读取 Windows 文件
  • 调用老系统接口返回 GBK

需要显式转码

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 启动乱码(很多人踩坑)

问题原因

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

六、终端工具问题(Xshell / SecureCRT)

确认:

  • 终端编码:UTF-8
  • 字体支持中文

七、快速自检清单 ✅

  • [ ] locale 是 UTF-8
  • [ ] 日志内容本身是 UTF-8
  • [ ] 没用 GBK 强转
  • [ ] systemd 设置了 LANG
  • [ ] 终端编码 UTF-8

八、如果你愿意,我可以更精准帮你

你可以贴一下:

  1. 日志示例代码
  2. 乱码截图或字符
  3. 启动方式(终端 / systemd / docker)

我可以直接帮你定位到是哪一层出的问题。

0 踩