在 Linux 系統下,Golang 日志清理可以通過以下幾種方法實現:
許多 Golang 日志庫都提供了內置的日志輪轉和清理功能。例如,logrus 和 zap 這兩個流行的日志庫都支持日志輪轉。你可以根據庫的文檔配置日志輪轉策略,以便在達到一定大小或時間時自動清理舊日志。
logrotate 是一個 Linux 系統下用于管理日志文件的工具。它可以自動壓縮、刪除和輪轉日志文件。要使用 logrotate 管理 Golang 應用的日志,你需要創建一個 logrotate 配置文件,然后在 crontab 中設置定期執行 logrotate。
創建一個名為 /etc/logrotate.d/myapp
的配置文件,內容如下:
/path/to/your/golang/app/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
create 0640 root root
}
這個配置表示每天輪轉日志文件,保留最近 7 天的日志,壓縮舊日志,如果日志文件不存在則不報錯,如果日志文件為空則不輪轉,以及設置新日志文件的權限和所有者。
接下來,在 crontab 中添加一行以每天運行 logrotate:
0 0 * * * /usr/sbin/logrotate /etc/logrotate.conf
你還可以編寫一個自定義的日志清理程序,定期檢查日志文件的大小和時間,然后刪除超過指定閾值的老舊日志。這個程序可以使用 Golang 的 os
和 time
包來實現。將此程序作為守護進程或定時任務運行,以便持續清理日志。
以下是一個簡單的示例,用于刪除指定目錄下 7 天前的日志文件:
package main
import (
"fmt"
"os"
"path/filepath"
"time"
)
func main() {
logDir := "/path/to/your/golang/app/logs"
cutoff := time.Now().AddDate(0, 0, -7)
filepath.Walk(logDir, func(path string, info os.FileInfo, err error) error {
if err != nil {
return err
}
if !info.IsDir() && info.ModTime().Before(cutoff) {
err = os.Remove(path)
if err != nil {
return fmt.Errorf("failed to remove log file %s: %v", path, err)
}
fmt.Printf("Removed old log file: %s\n", path)
}
return nil
})
}
將此程序作為守護進程或定時任務運行,以便持續清理日志。