在 Debian 上 Go 程序写日志“慢”,通常不是 Go 本身慢,而是环境 / 配置 / 日志方式导致的。下面按常见原因从高频到低频说明,并给出排查和解决办法。
如果你用 systemd 运行 Go 程序(Debian 默认):
[Service]
ExecStart=/opt/app/bin/server
日志输出到 stdout/stderr,会被 journald 捕获。
RateLimitjournalctl -u xxx -f 很慢✅ 不要让 Go 写 stdout 当日志
StandardOutput=file:/var/log/app/app.log
StandardError=file:/var/log/app/err.log
或
StandardOutput=null
再用文件日志库写。
Go 标准库 log:
高并发下:
log.Println("xxx")
会非常慢。
使用带缓冲的日志库:
zaplogrus(比标准库好,但不如 zap)slog(Go 1.21+,推荐)logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
Debian 常见于:
echo test >> log 也慢iostat 显示磁盘 100%iostat -x 1
df -T /var/log
mount | grep log
例如:
f, _ := os.OpenFile("log", ...)
f.Write(...)
f.Sync()
或者某些库默认 Sync()。
buf := bufio.NewWriter(f)
defer buf.Flush()
或日志库配置:
zap.NewProduction()
Go 日志常包含:
hostpidhostnameDebian 上 /etc/nsswitch.conf 配置不当会导致:
files mdns4_minimal [NOTFOUND=return] dns
每次日志都查主机名 → 卡住。
getent hosts $(hostname)
/etc/hosts 加本机名在某些虚拟化环境(老 Xen / 低配 VM):
clock_gettime 慢cat /proc/sys/kernel/perf_event_paranoid
log.Debug("request", ...)
info/warn[Service]
ExecStart=/opt/app/bin/server
StandardOutput=file:/var/log/app/app.log
StandardError=file:/var/log/app/err.log
Go:
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
✅ 是否在 systemd 下写 stdout
✅ 是否用标准 log 高并发
✅ 日志盘是否慢
✅ 是否每次写都 Sync
✅ hostname 是否解析慢
如果你愿意,可以贴:
journalctl 或 iostat 表现我可以直接帮你定位是哪一条。