温馨提示×

debian golang日志怎么切

小樊
33
2026-10-04 04:45:17
栏目: 编程语言

在 Debian 上运行 Golang 程序时,“日志怎么切”通常指日志轮转(log rotation),常见做法有两类:


一、用系统工具 logrotate(最推荐,简单稳定)

适合场景:Golang 直接写文件(如 os.OpenFile 写 app.log)

1. 示例 Golang 代码(写文件即可)

f, _ := os.OpenFile("/var/log/myapp/app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
log.SetOutput(f)

2. 创建 logrotate 配置

sudo nano /etc/logrotate.d/myapp

内容示例:

/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    copytruncate
}

3. 说明

  • copytruncate:不重启程序就能切日志(Golang 最常用)
  • 不想用 copytruncate:程序需支持 SIGHUP 重新打开日志

4. 手动测试

sudo logrotate -f /etc/logrotate.d/myapp

二、Golang 内部切日志(不依赖系统)

适合场景:容器、无 root 权限、自定义规则

方案 1:使用 librilog / zap + rotate

import "gopkg.in/natefinch/lumberjack.v2"

log.SetOutput(&lumberjack.Logger{
    Filename:   "/var/log/myapp/app.log",
    MaxSize:    10, // MB
    MaxBackups: 7,
    MaxAge:     7, // days
    Compress:   true,
})

✅ 自动切、自动压缩
❌ 日志文件名不带日期


三、systemd + stdout(Debian 10+)

如果你是 systemd 启动 Golang:

[Service]
ExecStart=/usr/local/bin/myapp
StandardOutput=journal

然后用:

journalctl -u myapp

由 journald 管理日志


四、选择建议

场景 推荐方式
服务器长期运行 logrotate + copytruncate
容器 lumberjack
systemd 服务 journald
多服务统一 filebeat + logrotate

如果你愿意,可以告诉我:

  • Golang 是怎么启动的(systemd / docker / 裸跑)
  • 日志是 stdout 还是文件

我可以给你精确配置。

0 踩