温馨提示×

为何debian golang日志乱码

小樊
41
2026-09-04 01:55:23
栏目: 编程语言

Debian 上 Golang 程序日志出现乱码,通常不是 Go 本身的问题,而是字符编码 / 终端环境 / 输出方式不一致导致的。下面按常见原因逐一说明,并给出解决办法。


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

Debian 默认可能不是 UTF-8(尤其老系统或最小化安装)。

检查 locale

locale

如果看到:

LANG=
LC_ALL=
LANG=C

或包含 ASCIIPOSIX,就容易出现乱码。

解决

设置 UTF-8 locale:

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

推荐写入:

~/.bashrc
/etc/environment

二、日志本身不是 UTF-8(中文源码 / 文件编码问题)

情况 1:源码文件不是 UTF-8

file 检查:

file main.go

如果不是 UTF-8:

iconv -f GBK -t UTF-8 main.go > main_utf8.go

情况 2:日志写文件时乱码

确保:

  • 写日志的内容是 string(UTF-8)
  • 不要手动转码

✅ 正确示例:

log.Println("中文日志")

❌ 错误示例(GBK 字符串):

s := []byte{0xd6, 0xd0} // GBK
log.Println(string(s))

三、终端工具编码不对(Xshell / PuTTY / Terminal)

即使服务器是对的,客户端错了也会乱码。

检查终端设置

  • Xshell:文件 → 属性 → 终端 → 编码 = UTF-8
  • PuTTY:Window → Translation → UTF-8
  • macOS Terminal:默认 UTF-8 ✅
  • VS Code 终端:右下角编码应为 UTF-8

四、systemd 服务日志乱码(journalctl)

如果程序作为 service 运行:

journalctl -u your-service

原因

  • journal 默认 UTF-8
  • LANG 没设置时,Go 可能用 C

解决

在 service 文件加:

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

然后:

sudo systemctl daemon-reload
sudo systemctl restart your-service

五、日志库重定向到文件后打开乱码

如果你用:

log.SetOutput(file)

然后 Windows 打开文件乱码:

✅ 解决:

  • 用 UTF-8 编码打开(VS Code / Notepad++)
  • 或写 BOM(不推荐)

六、快速自检清单 ✅

  1. locale 是否为 UTF-8
  2. 源码是否为 UTF-8
  3. 终端是否为 UTF-8
  4. systemd 是否设置 LANG
  5. 日志内容是否本身是 GBK

七、最小可复现示例(正常情况)

package main

import "log"

func main() {
    log.SetFlags(log.LstdFlags)
    log.Println("中文日志测试")
}

如果这里都乱码,99% 是环境编码问题。


如果你愿意,可以贴:

  • locale 输出
  • 日志截图或示例
  • 是否 systemd / docker / 直接运行

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

0