
我正在 Linux (CentOS 7) 上運行一個進程,它在標準輸出上產生大量輸出。將其全部傳送到檔案將導致檔案大小大於 1 TB。但令人高興的是,輸出是相當可壓縮的 - 它由大量重複的文字組成。
我的想法是,我可以使用某種日誌輪換程序,就像這裡描述的那樣:(標準輸出的日誌旋轉?),但是一旦日誌不再是當前的,它就會被壓縮(並且永遠不會被刪除)?所以我最終會向檔案寫入幾個 GB,壓縮它,然後繼續寫入新檔案?
答案1
您可以使用對數旋轉為了這。 CentOS 7正在使用系統所以你可以配置一個計劃的日誌輪調任務像這樣的東西:
/etc/systemd/system
在呼叫中建立一個 logrotate 設定文件,mylogrotate.config
其中包含以下內容:/path/to/your/logfile/*.log { compress copytruncate delaycompress minsize 1G missingok nomail notifempty rotate 30 }
這將告訴 logrotate 執行以下操作:
- 舊版的日誌檔案預設使用 gzip 壓縮。
- 建立副本後就地截斷原始日誌文件,而不是移動舊日誌檔案並選擇建立新日誌檔案。
- 將上一個日誌檔案的壓縮推遲到下一個循環週期,這樣您將擁有兩個未壓縮的日誌檔案。
- 當日誌檔案大小超過 1GB 時,日誌檔案就會輪換。
- 如果日誌檔案遺失,請繼續下一個日誌檔案而不發出錯誤訊息。
- 不要將舊日誌文件郵寄到任何地址。
- 日誌檔案在刪除之前會輪換 30 次,因此您將擁有 30 個舊日誌檔案。任何早於該時間的內容都將被刪除。
建立系統服務。使用以下內容建立一個/etc/systemd/system
名為的檔案:mylogrotate.service
[Unit]
Description=Rotate My Log
[Service]
Type=oneshot
ExecStart=/usr/sbin/logrotate /etc/systemd/system/mylogrotate.config --state /etc/systemd/system/mylogrotate.state --verbose
我們來安排一下這個任務吧。/etc/systemd/system
使用mylogrotate.timer
以下內容建立第三個文件:
[Unit]
Description=Rotate My Log Timer
[Timer]
OnCalendar=*:00:00
Persistent=true
[Install]
WantedBy=timers.target
這將每小時運行一次 logrotate。
一切都已設定完畢。現在啟用計劃任務。
systemctl enable mylogrotate.timer
systemctl start mylogrotate.timer
當然,這一切都是以 root 身分進行的。
(我使用的是 Ubuntu,但我希望這能在 CentOS 上運行而不會出現任何問題)