在 Debian 上运行 Go 程序时,日志变慢通常不是 Go 语言本身的问题,而是系统环境或日志配置导致的。下面按常见原因给你梳理一下,并给出排查和解决办法。
stdout/stderr 被 systemd 接管(非常常见)如果你的 Go 程序是:
systemd 启动stdout/stderr那日志会经过 journald:
✅ 表现:
systemctl start 后变慢✅ 解决:
# /etc/systemd/system/xxx.service
[Service]
StandardOutput=file:/var/log/xxx.log
StandardError=file:/var/log/xxx.err
或
StandardOutput=syslog
或关掉 journal 同步:
[Service]
Environment=GODEBUG=asyncpreemptoff=1
fmt.Sprintf / 锁竞争常见日志库:
loglogruszap(配置不当)问题点:
✅ 解决:
zap / slog(Go 1.21+)示例(slog):
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("request", "path", r.URL.Path)
如果你写的是:
log.SetOutput(os.OpenFile("/var/log/app.log", ...))
在 Debian 上:
barrier✅ 排查:
iostat -x 1
如果 %util 很高,就是磁盘瓶颈。
✅ 解决:
log rotate/dev/shm)Debian 上如果日志里包含:
hostnameusernameos/user 包可能触发:
user.Current()
os.Hostname()
这些在:
✅ 解决:
Go 日志打印时间时:
time.Now()
如果:
/etc/localtime 不存在会反复读文件,变慢。
✅ 解决:
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
或:
export TZ=Asia/Shanghai
你可以补充:
我可以直接给你针对性优化方案或示例代码。