温馨提示×

怎么解决Golang日志乱码

小樊
48
2026-07-13 01:17:04
栏目: 编程语言

Golang 里出现“日志乱码”,通常不是 Go 本身的问题,而是编码、终端、输出方式不匹配导致的。下面按常见场景 + 解决方案给你总结。


一、最常见原因:终端编码不一致(Windows 尤其常见)

现象

  • 控制台打印中文变成 ?? 或乱码
  • 日志文件里正常,但终端显示乱码

原因

  • Windows 默认是 GBK
  • Go 默认输出 UTF-8

✅ 解决方案

✅ 方案 1:修改终端编码为 UTF-8(推荐)

Windows(CMD / PowerShell)

chcp 65001

然后重新运行程序。

永久方案(Windows 10+)

设置 → 时间和语言 → 管理语言设置 → Beta: 使用 Unicode UTF-8


✅ 方案 2:在 Go 中强制输出 GBK(不推荐)

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

func main() {
    encoder := simplifiedchinese.GBK.NewEncoder()
    data, _ := encoder.Bytes([]byte("中文日志"))
    fmt.Println(string(data))
}

⚠️ 只适合老系统,不建议新项目使用。


二、日志文件乱码

现象

  • 程序输出正常
  • 用 Notepad / 某些编辑器打开日志是乱码

原因

  • 日志文件是 UTF-8
  • 编辑器用 GBK 打开

✅ 解决方案

用 UTF-8 打开日志文件

  • VS Code:右下角编码 → UTF-8
  • Notepad++:编码 → UTF-8
  • Windows 记事本:另存为 → UTF-8

确保日志写入 UTF-8

f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
f.WriteString("中文日志\n")

Go 默认写入就是 UTF-8,不需要额外处理。


三、HTTP / API 返回日志乱码

现象

  • 接口返回中文乱码

原因

  • 没有设置 Content-Type

✅ 解决方案

w.Header().Set("Content-Type", "application/json; charset=utf-8")

四、日志库导致的乱码(zap / logrus)

zap 示例(正确用法)

logger, _ := zap.NewProduction()
logger.Info("中文日志")

✅ zap 默认 UTF-8
❌ 乱码通常是终端问题,不是 zap


五、Docker / Linux 环境乱码

原因

  • 容器缺少 locale

✅ 解决方案

ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

或:

locale -a

确保有 zh_CN.UTF-8


六、快速自检清单 ✅

你可以按顺序检查:

  1. ✅ Go 源码文件是否是 UTF-8(IDE 右下角)
  2. ✅ 终端编码是否是 UTF-8
  3. ✅ 日志文件是否用 UTF-8 打开
  4. ✅ HTTP 是否设置 charset=utf-8
  5. ✅ Docker / Linux 是否配置 locale

七、一句话总结

Go 不乱码,乱的是终端和编码。

如果你愿意,可以把:

  • 操作系统
  • 使用的日志库
  • 乱码截图或示例

发给我,我可以帮你精准定位是哪一种情况

0