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日志文件的有效管理。