总体思路 围绕可观测性、性能、可靠性、可运维性四个维度,将 Golang 应用日志与 Debian 的系统日志体系打通:用结构化日志输出关键事件与指标,减少主流程阻塞,防止磁盘被日志撑爆,联动监控告警快速处置,从而提升整体稳定性与 MTTR。
一 日志采集与输出策略
二 系统层面日志治理与可靠性
三 监控告警与可观测性闭环
四 落地配置与最小示例
# /etc/systemd/system/myapp.service
[Unit]
Description=My Go App
After=network.target
[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal
StandardError=journal
SyslogIdentifier=myapp
Restart=on-failure
# 避免日志无限增长
LogRateLimitIntervalSec=30
LogRateLimitBurst=10000
[Install]
WantedBy=multi-user.target
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 28
compress
delaycompress
missingok
notifempty
create 640 myapp myapp
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}
// 使用 zap + channel + bufio.Writer 的骨架示例
// 1) 初始化带缓冲的 writer
f, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
w := bufio.NewWriterSize(f, 64<<10) // 64KB 缓冲
core := zapcore.NewCore(
zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),
zapcore.AddSync(w), // 仍通过 Sync 保证落盘
zap.NewAtomicLevelAt(zap.InfoLevel),
)
logger := zap.New(core, zap.AddCaller())
defer logger.Sync()
// 2) 异步 worker
ch := make(chan *zapcore.Entry, 10000)
go func() {
for e := range ch {
logger.With(e.Context...).Log(e.Level, e.Message)
}
}()
// 3) 优雅退出时 Flush
defer w.Flush(); defer f.Close()