Debian下Golang日志存储策略
一 策略总览与取舍
二 推荐方案对比
| 方案 | 适用场景 | 核心配置 | 优点 | 注意点 |
|---|---|---|---|---|
| 标准库 log + systemd-journald | 系统服务、容器化 | 输出到stdout/stderr;用journalctl检索 | 零依赖、运维统一、便于转发 | 需理解journald字段与查询语法 |
| log + 文件 + logrotate | 传统主机、需长期落盘 | /etc/logrotate.d/应用名配置轮转压缩 | 系统级统一策略、成熟可靠 | 注意权限与轮转触发时机 |
| zap/logrus + lumberjack | 高性能、需应用内轮转 | MaxSize/MaxBackups/MaxAge/Compress | 细粒度控制、易嵌入程序 | 需正确处理并发与关闭 |
| 写入 syslog(rsyslog) | 与系统日志统一归集 | 使用syslog hook或本地syslog | 集中管理、可远程转发 | 结构化能力依赖syslog配置 |
| 集中式(rsyslog→ELK/Graylog) | 多服务/分布式 | Filebeat/rsyslog采集到ES/Kafka | 检索分析强大、可视化 | 成本与运维复杂度更高 |
三 落地配置示例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"github.com/natefinch/lumberjack"
)
func newLogger() *zap.Logger {
encCfg := zap.NewProductionEncoderConfig()
encCfg.TimeKey = "ts"
encCfg.EncodeTime = zapcore.ISO8601TimeEncoder
fileWriter := zapcore.AddSync(&lumberjack.Logger{
Filename: "/var/log/myapp/app.log", // 建议运行前mkdir -p /var/log/myapp && chown myapp:myapp /var/log/myapp
MaxSize: 10, // MB
MaxBackups: 7,
MaxAge: 30, // 天
Compress: true,
})
core := zapcore.NewCore(
zapcore.NewJSONEncoder(encCfg),
fileWriter,
zap.InfoLevel,
)
return zap.New(core, zap.AddCaller())
}
要点:生产建议JSON、包含调用者;按服务拆分日志目录与文件;确保进程对日志目录有写权限。
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 myapp myapp
sharedscripts
postrotate
systemctl kill -s USR1 myapp.service >/dev/null 2>&1 || true
endscript
}
要点:使用delaycompress避免正在写入的日志被压缩;通过USR1通知应用重新打开日志文件(应用需处理信号);测试用logrotate -d与logrotate -f。
package main
import (
"log"
"os"
)
func main() {
log.SetOutput(os.Stdout)
log.SetFlags(log.LstdFlags | log.Lshortfile)
log.Println("started")
}
要点:服务单元中设置StandardOutput=journal、StandardError=journal;用journalctl -u myapp.service -f实时查看。
四 运维与容量管理
journalctl --disk-usage;按时间清理journalctl --vacuum-time 7d;按容量清理journalctl --vacuum-size 500M。五 性能与安全要点
recover捕获panic并上报,防止进程异常退出。