温馨提示×

为何debian golang日志乱

小樊
41
2026-10-04 04:59:20
栏目: 编程语言

在 Debian 上用 Go 打印日志“乱”,通常不是 Go 本身的问题,而是终端编码、系统 locale、日志输出目标、或第三方日志库配置不一致导致的。下面按最常见原因逐一说明。


一、最常见原因:系统 locale 不是 UTF-8

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

二、终端不是 UTF-8(SSH / 本地终端)

即使系统是对的,终端不对也会乱。

检查

echo $TERM
echo $LANG

解决

  • 使用 UTF-8 终端(大多数现代终端默认是)
  • Windows 用户:
    • 不要用老 cmd
    • 用 Windows Terminal
    • 或设置:
      chcp 65001
      

三、日志里有中文,但写文件而非 stdout

现象

  • 屏幕正常
  • 日志文件打开是乱码

原因

  • 文件本身是 UTF-8
  • 但用 gbk 的编辑器打开(如老版记事本)

解决

  • 用支持 UTF-8 的编辑器(VS Code / Vim)
  • 或显式写 UTF-8 文件(Go 默认就是)

四、用了第三方日志库但配置错了

常见库问题

zap

zap.NewProduction()

默认输出 JSON,看起来“乱”,其实不是乱码,是结构日志。

logrus

log.SetFormatter(&log.JSONFormatter{})

如果你想看“正常文本”

logrus.SetFormatter(&logrus.TextFormatter{
    FullTimestamp: true,
})

五、字符串本身就不是 UTF-8(源头问题)

比如:

  • 从网络读取
  • 从数据库读取
  • 从 Windows 文件读取(GBK)

示例(GBK → UTF-8)

import "golang.org/x/text/encoding/simplifiedchinese"

decoder := simplifiedchinese.GBK.NewDecoder()
utf8Str, _ := decoder.String(gbkStr)

六、systemd 服务日志乱

如果你用:

journalctl -u your-service

解决

在 service 文件加:

[Service]
Environment=LANG=en_US.UTF-8

然后:

sudo systemctl daemon-reload
sudo systemctl restart your-service

七、快速自检清单 ✅

  • [ ] locale 是 UTF-8
  • [ ] 终端是 UTF-8
  • [ ] 日志库 formatter 正确
  • [ ] 文件用 UTF-8 打开
  • [ ] 输入数据本身编码正确

如果你愿意,可以贴一段:

  • 乱码截图 / 日志内容
  • 用的日志库(标准 log / zap / logrus)
  • 运行方式(终端 / systemd / Docker)

我可以直接帮你定位是哪一类“乱”。

0 踩