Linux日誌文件總管——logrotate
logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌文件。例如,你可以設置logrotate,讓/var/log/foo日誌文件每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。另外,舊日誌也可以通過電子郵件發送,不過該選項超出了本教程的討論範圍。
主流Linux發行版上都默認安裝有logrotate包,如果出於某種原因,logrotate沒有出現在裡頭,你可以使用apt-get或yum命令來安裝。
在Debian或Ubuntu上:
# apt-get install logrotate cron
在Fedora,CentOS或RHEL上:
# yum install logrotate crontabs
logrotate的配置文件是/etc/logrotate.conf,通常不需要對它進行修改。日誌文件的輪循設置在獨立的配置文件中,它(們)放在/etc/logrotate.d/目錄下。
樣例一
在第一個樣例中,我們將創建一個10MB的日誌文件/var/log/log-file。我們將展示怎樣使用logrotate來管理該日誌文件。
我們從創建一個日誌文件開始吧,然後在其中填入一個10MB的隨機比特流數據。
# touch /var/log/log-file
# head -c 10M < /dev/urandom > /var/log/log-file
由於現在日誌文件已經準備好,我們將配置logrotate來輪循該日誌文件。讓我們為該文件創建一個配置文件。
# vim /etc/logrotate.d/log-file
/var/log/log-file {
monthly
rotate 5
compress
delaycompress
missingok
notifempty
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
這裡:
- monthly: 日誌文件將按月輪循。其它可用值為『daily』,『weekly』或者『yearly』。
- rotate 5: 一次將存儲5個歸檔日誌。對於第六個歸檔,時間最久的歸檔將被刪除。
- compress: 在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮。
- delaycompress: 總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循周期進行。這在你或任何軟體仍然需要讀取最新歸檔時很有用。
- missingok: 在日誌輪循期間,任何錯誤將被忽略,例如「文件無法找到」之類的錯誤。
- notifempty: 如果日誌文件為空,輪循不會進行。
- create 644 root root: 以指定的許可權創建全新的日誌文件,同時logrotate也會重命名原始日誌文件。
- postrotate/endscript: 在所有其它指令完成後,postrotate和endscript裡面指定的命令將被執行。在這種情況下,rsyslogd 進程將立即再次讀取其配置並繼續運行。
上面的模板是通用的,而配置參數則根據你的需求進行調整,不是所有的參數都是必要的。
樣例二
在本例中,我們只想要輪循一個日誌文件,然而日誌文件大小可以增長到50MB。
# vim /etc/logrotate.d/log-file
/var/log/log-file {
size=50M
rotate 5
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
樣例三
我們想要讓舊日誌文件以創建日期命名,這可以通過添加dateext常熟實現。
# vim /etc/logrotate.d/log-file
/var/log/log-file {
monthly
rotate 5
dateext
create 644 root root
postrotate
/usr/bin/killall -HUP rsyslogd
endscript
}
這將讓歸檔文件在它們的文件名中包含日期信息。
排障
這裡提供了一些logrotate設置的排障提示。
1. 手動運行logrotate
logrotate可以在任何時候從命令行手動調用。
要調用為/etc/lograte.d/下配置的所有日誌調用logrotate:
# logrotate /etc/logrotate.conf
要為某個特定的配置調用logrotate:
# logrotate /etc/logrotate.d/log-file
2. 演練
排障過程中的最佳選擇是使用『-d』選項以預演方式運行logrotate。要進行驗證,不用實際輪循任何日誌文件,可以模擬演練日誌輪循並顯示其輸出。
# logrotate -d /etc/logrotate.d/log-file
正如我們從上面的輸出結果可以看到的,logrotate判斷該輪循是不必要的。如果文件的時間小於一天,這就會發生了。
3. 強制輪循
即使輪循條件沒有滿足,我們也可以通過使用『-f』選項來強制logrotate輪循日誌文件,『-v』參數提供了詳細的輸出。
# logrotate -vf /etc/logrotate.d/log-file
reading config file /etc/logrotate.d/log-file
reading config info for /var/log/log-file
Handling 1 logs
rotating pattern: /var/log/log-file forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/log-file
log needs rotating
rotating log /var/log/log-file, log->rotateCount is 5
dateext suffix '-20140916'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
renaming /var/log/log-file.5.gz to /var/log/log-file.6.gz (rotatecount 5, logstart 1, i 5),
old log /var/log/log-file.5.gz does not exist
renaming /var/log/log-file.4.gz to /var/log/log-file.5.gz (rotatecount 5, logstart 1, i 4),
old log /var/log/log-file.4.gz does not exist
. . .
renaming /var/log/log-file.0.gz to /var/log/log-file.1.gz (rotatecount 5, logstart 1, i 0),
old log /var/log/log-file.0.gz does not exist
log /var/log/log-file.6.gz doesn't exist -- won't try to dispose of it
renaming /var/log/log-file to /var/log/log-file.1
creating new /var/log/log-file mode = 0644 uid = 0 gid = 0
running postrotate script
compressing log with: /bin/gzip
4. Logrotate的記錄日誌
logrotate自身的日誌通常存放於/var/lib/logrotate/status目錄。如果處於排障目的,我們想要logrotate記錄到任何指定的文件,我們可以指定像下面這樣從命令行指定。
# logrotate -vf –s /var/log/logrotate-status /etc/logrotate.d/log-file
5. Logrotate定時任務
logrotate需要的cron任務應該在安裝時就自動創建了,我把cron文件的內容貼出來,以供大家參考。
# cat /etc/cron.daily/logrotate
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo ""$logfile" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
小結一下,logrotate工具對於防止因龐大的日誌文件而耗盡存儲空間是十分有用的。配置完畢後,進程是全自動的,可以長時間在不需要人為干預下運行。本教程重點關注幾個使用logrotate的幾個基本樣例,你也可以定製它以滿足你的需求。
希望本文對你有所幫助。
via: http://xmodulo.com/2014/09/logrotate-manage-log-files-linux.html
作者:Sarmed Rahman 譯者:GOLinux 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive