温馨提示×

centos golang日志编码如何调

小樊
40
2026-10-03 03:56:25
栏目: 编程语言

在 CentOS 上调整 Golang 程序日志的编码,通常分几种情况:你是用标准库 log、第三方日志库(zap / logrus / slog),还是关心终端/系统 locale 编码(如 UTF-8 vs GBK)。下面按常见场景说明。


一、先确认 CentOS 系统编码(很重要)

Golang 本身输出的是 byte 流,编码取决于你写什么字节,以及终端怎么解释。

locale

典型正常环境:

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

如果不是 UTF-8,可临时设置:

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

永久生效(CentOS 7):

localectl set-locale LANG=en.UTF-8

二、Golang 日志“编码”的两种含义

1️⃣ 日志内容编码(UTF-8 / GBK)

✅ 推荐:始终用 UTF-8

Go 源码默认 UTF-8,日志直接写即可:

log.Println("中文日志测试")

只要终端是 UTF-8,就正常显示。

❌ 老系统需要 GBK(很少见)

需要显式转换:

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

func toGBK(s string) []byte {
    r, _, _ := transform.Bytes(simplifiedchinese.GBK.NewEncoder(), []byte(s))
    return r
}

2️⃣ 日志格式编码(JSON / Console)

使用 zap(最常用)

JSON 编码(适合服务器 / 容器)

cfg := zap.NewProductionConfig()
cfg.Encoding = "json"
logger, _ := cfg.Build()

Console 编码(适合调试)

cfg := zap.NewDevelopmentConfig()
cfg.Encoding = "console"

使用 logrus

logrus.SetFormatter(&logrus.JSONFormatter{})
// 或
logrus.SetFormatter(&logrus.TextFormatter{})

使用 slog(Go 1.21+)

logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))

三、CentOS + systemd 日志注意点

如果用 systemd 启动 Go 程序:

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

否则 journal 可能乱码。

查看日志:

journalctl -u your-service -f

四、常见乱码原因速查

现象 原因
中文变 ??? 终端非 UTF-8
JSON 中文是 unicode 正常(\uXXXX)
SSH 乱码 客户端编码不对
Docker 日志乱码 容器没设 LANG

五、推荐最佳实践 ✅

  • 系统:CentOS 设 UTF-8
  • Go:源码 UTF-8
  • 日志库:zap + JSON
  • 容器/服务:显式设置 LANG

如果你能补充:

  • 用的哪个日志库
  • 是终端乱码还是文件乱码
  • CentOS 版本

我可以直接给你一份可复制的配置。

0 踩