Golang标准库log不支持日志轮转,但可通过第三方日志库(如logrus、zap)结合lumberjack库实现自动日志分割与压缩。lumberjack是专门用于日志轮转的Go库,支持设置日志文件大小、保留数量、压缩等功能。
操作步骤:
go get github.com/sirupsen/logrus  # 或 go get go.uber.org/zap
go get gopkg.in/natefinch/lumberjack.v2
lumberjack(以logrus为例):package main
import (
    "github.com/sirupsen/logrus"
    "gopkg.in/natefinch/lumberjack.v2"
)
func main() {
    logrus.SetOutput(&lumberjack.Logger{
        Filename:   "/var/log/myapp.log",  // 日志文件路径
        MaxSize:    10,                    // 单个日志文件最大10MB
        MaxBackups: 3,                     // 保留最多3个旧日志文件
        MaxAge:     28,                    // 保留最多28天
        Compress:   true,                  // 压缩旧日志(gzip格式)
    })
    logrus.Info("This is a log message with rotation support.")
}
该配置会在日志文件达到10MB时自动分割,保留最多3个旧文件(如myapp.log.1、myapp.log.2),超过28天的文件会被自动删除,且旧文件会被压缩以节省空间。Debian系统自带的logrotate工具可统一管理应用日志,无需修改代码即可实现轮转。适用于不想改动应用程序代码的场景。
操作步骤:
logrotate(若未安装):sudo apt-get install logrotate
/etc/logrotate.d/myapp):sudo nano /etc/logrotate.d/myapp
添加以下内容(以轮转/var/log/myapp.log为例):/var/log/myapp.log {
    size 10M                # 当日志文件达到10MB时轮转
    rotate 3                # 保留3个旧日志文件
    compress                # 压缩旧日志(gzip)
    missingok               # 日志文件不存在时不报错
    notifempty              # 日志为空时不轮转
    create 0640 root adm    # 新日志文件权限与属主
}
sudo logrotate -d /etc/logrotate.d/myapp  # 干运行(模拟执行)
sudo logrotate -f /etc/logrotate.d/myapp  # 强制立即执行
该配置会自动监控日志文件大小,触发轮转后保留3个压缩后的旧日志文件(如myapp.log.1.gz、myapp.log.2.gz)。若Golang应用以systemd服务运行,可将日志发送到系统日志(syslog),由rsyslog或journald统一管理。rsyslog支持日志轮转(通过/etc/logrotate.d/rsyslog配置),避免单个日志文件过大。
操作步骤:
/etc/systemd/system/myapp.service):[Unit]
Description=My Golang Application
After=network.target
[Service]
ExecStart=/path/to/your/app
StandardOutput=syslog       # 标准输出重定向到syslog
StandardError=syslog        # 标准错误重定向到syslog
SyslogIdentifier=myapp      # 日志标识符(用于rsyslog过滤)
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl enable myapp
sudo journalctl -u myapp -f  # 实时查看应用日志
系统日志的轮转配置通常位于/etc/logrotate.d/rsyslog,默认会自动处理日志分割与压缩。即使使用轮转,过多的无用日志仍会占用空间。可通过调整日志级别和优化日志格式减少日志量:
INFO及以上),避免DEBUG日志过多。logrus为例):logrus.SetLevel(logrus.InfoLevel)  // 只记录Info、Warn、Error级别
JSONFormatter替代默认文本格式,或添加LUTC标志使时间戳标准化(减少冗余信息)。log为例):log.SetFlags(log.LstdFlags | log.Lshortfile | log.LUTC)  // 添加UTC时间戳
这些优化可减少日志文件的大小,间接降低轮转频率。设置监控系统(如Prometheus+Grafana)实时跟踪日志文件大小,当超过阈值时触发告警(如邮件、短信通知),避免日志占满磁盘。
Prometheus的node_exporter监控/var/log目录大小,通过Grafana设置告警规则(如“日志目录大小超过10GB时告警”)。以上方法可根据实际需求组合使用(如“代码内置轮转+lumberjack”+“系统logrotate备份”+“监控告警”),实现Golang日志文件的有效管理。