logrotate是Debian系統自帶的日志管理工具,可自動輪轉、壓縮和刪除Golang應用程序的日志文件,無需修改應用代碼。
操作步驟:
sudo apt-get update && sudo apt-get install logrotate
/etc/logrotate.d/
目錄下新建配置文件(如golang-app
),內容如下(根據實際日志路徑調整):/var/log/golang-app/*.log {
daily # 每天輪轉一次(可選:weekly/monthly)
rotate 7 # 保留最近7個日志文件
compress # 壓縮舊日志(節省空間)
missingok # 日志文件不存在時不報錯
notifempty # 日志為空時不輪轉
create 0640 root adm # 新日志文件的權限和所有者
}
sudo logrotate -d /etc/logrotate.d/golang-app
若需立即執行輪轉,可添加-f
參數:sudo logrotate -f /etc/logrotate.d/golang-app
/etc/cron.daily/logrotate
),無需額外配置。若需更細粒度的日志管理(如按文件大小、應用狀態觸發輪轉),可使用lumberjack
庫(第三方日志輪轉工具),直接在代碼中實現日志清理。
操作步驟:
go get gopkg.in/natefinch/lumberjack.v2
lumberjack.Logger
設置為日志輸出目標,示例如下:package main
import (
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/golang-app/app.log", // 日志文件路徑
MaxSize: 10, // 單個日志文件最大10MB(超過則輪轉)
MaxBackups: 5, // 保留最多5個舊日志文件
MaxAge: 30, // 保留最多30天
Compress: true, // 壓縮舊日志
})
// 示例日志輸出
log.Println("This is a log message from Golang application.")
}
Filename
:日志文件路徑(需確保應用有寫入權限);MaxSize
:單個日志文件的最大大?。▎挝唬篗B);MaxBackups
:保留的舊日志文件數量;MaxAge
:舊日志文件的最大保留天數;Compress
:是否壓縮舊日志(減少存儲占用)。若Golang應用通過systemd以服務形式運行(如myapp.service
),可使用journalctl
命令管理日志。
常用操作:
sudo journalctl -u myapp.service -n 100 # 查看最近100條日志
sudo journalctl --vacuum-time=2weeks # 刪除兩周前的日志
sudo journalctl --vacuum-size=100M # 限制日志總大小為100MB
/etc/systemd/system/myapp.service
),添加以下配置以限制日志大?。?pre class="hljs">[Service]
StandardOutput=journal
StandardError=journal
LogLevelMax=info
重啟服務使配置生效:sudo systemctl daemon-reload
sudo systemctl restart myapp.service
若需完全自定義清理邏輯(如按文件名前綴、特定目錄清理),可編寫Shell腳本并通過cron定時執行。
操作步驟:
/usr/local/bin/cleanup_golang_logs.sh
):#!/bin/bash
LOG_DIR="/var/log/golang-app"
MAX_DAYS=7 # 保留最近7天的日志
# 查找并刪除超過MAX_DAYS天的.log文件
find "$LOG_DIR" -type f -name "*.log" -mtime +$MAX_DAYS -exec rm -f {} \;
echo "$(date): Deleted old Golang logs older than $MAX_DAYS days." >> /var/log/log_cleanup.log
sudo chmod +x /usr/local/bin/cleanup_golang_logs.sh
crontab -e
),添加以下行(每天凌晨1點執行):0 1 * * * /usr/local/bin/cleanup_golang_logs.sh
或系統級cron(/etc/crontab
):0 1 * * * root /usr/local/bin/cleanup_golang_logs.sh
journalctl
可簡化日志管理;根據實際需求選擇合適的方法,可有效避免Golang日志占用過多磁盤空間。