關於日誌切割 日誌文件包含了關於系統中發生的事件的有用信息,在排障過程中或者系統性能分析時經常被用到。對於忙碌的伺服器,日誌文件大小會增長極快,伺服器會很快消耗磁碟空間,這成了個問題。除此之外,處理一個單個的龐大日誌文件也常常是件十分棘手的事。logrotate是個十分有用的工具,它可以自動對日誌進 ...
關於日誌切割
日誌文件包含了關於系統中發生的事件的有用信息,在排障過程中或者系統性能分析時經常被用到。對於忙碌的伺服器,日誌文件大小會增長極快,伺服器會很快消耗磁碟空間,這成了個問題。除此之外,處理一個單個的龐大日誌文件也常常是件十分棘手的事。
logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌文件。例如,你可以設置logrotate,讓/var/log/foo日誌文件每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。
安裝logrotate
系統版本說明
[root@nfsnobody ~]# cat /etc/redhat-release
CentOS release 6.9 (Final)
[root@nfsnobody ~]# uname -r
2.6.32-696.el6.x86_64
預設centos系統安裝自帶logrotate,安裝方法如下
yum -y install logrotate crontabs
軟體包信息說明
[root@nfsnobody ~]# rpm -ql logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf # 主配置文件
/etc/logrotate.d # 配置目錄
logrotate的配置文件是/etc/logrotate.conf,通常不需要對它進行修改。日誌文件的輪循設置在獨立的配置文件中,它(們)放在/etc/logrotate.d/目錄下。
實踐配置logrotate
測試logrotate如何管理日誌
這裡我們將創建一個10MB的日誌文件/var/log/log-file。我們將展示怎樣使用logrotate來管理該日誌文件。
從創建一個日誌文件開始,然後在其中填入一個10MB的隨機比特流數據文件。
[root@nfsnobody ~]# touch /var/log/log-file
[root@nfsnobody ~]# head -c 10M < /dev/urandom > /var/log/log-file
由於現在日誌文件已經準備好,我們將配置logrotate來輪循該日誌文件。讓我們為該文件創建一個配置文件。
[root@nfsnobody ~]# 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
}
上面的模板是通用的,而配置參數則根據你的需求進行調整,不是所有的參數都是必要的。也可以通過man手冊中的例子進行配置。
配置文件說明
配置參數 | 說明 |
---|---|
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 進程將立即再次讀取其配置並繼續運行。 |
以上信息來源 "man logrotate" |
手動運行logrotate
logrotate可以在任何時候從命令行手動調用。要調用為/etc/lograte.d/下配置的所有日誌調用logrotate:
[root@nfsnobody ~]# logrotate /etc/logrotate.conf
要為某個特定的配置調用logrotate,執行一次切割任務測試
[root@nfsnobody ~]# ll /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file
[root@nfsnobody ~]# logrotate -vf /etc/logrotate.d/log-file
[root@nfsnobody ~]# ll /var/log/log-file*
-rw-r--r-- 1 root root 0 Feb 7 19:17 /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb 7 18:50 /var/log/log-file.1
即使輪循條件沒有滿足,我們也可以通過使用‘-f’選項來強制logrotate輪循日誌文件,‘-v’參數提供了詳細的輸出。
Logrotate的記錄日誌
logrotate自身的日誌通常存放於/var/lib/logrotate/status目錄。如果處於排障目的,我們想要logrotate記錄到任何指定的文件,我們可以指定像下麵這樣從命令行指定。
[root@nfsnobody ~]# logrotate -vf -s /var/log/logrotate-status /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 not rotated, old logs are removed
considering log /var/log/log-file
log does not need rotating
not running postrotate script, since no logs were rotated
Logrotate定時任務
logrotate需要的cron任務應該在安裝時就自動創建了,我把cron文件的內容貼出來,以供大家參考。
[root@nfsnobody ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
Logrotate生產應用
為nginx設置日誌切割
防止訪問日誌文件過大
[root@nfsnobody nginx]# cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 5
missingok
notifempty
create 644 www www
postrotate
if [ -f /application/nginx/logs/nginx.pid ]; then
kill -USR1 `cat /application/nginx/logs/nginx.pid`
fi
endscript
}
logrotate工具對於防止因龐大的日誌文件而耗盡存儲空間是十分有用的。配置完畢後,進程是全自動的,可以長時間在不需要人為干預下運行。本教程重點關註幾個使用logrotate的幾個基本樣例,你也可以定製它以滿足你的需求。
附錄
關於USR1信號解釋
摘自: http://www.xuebuyuan.com/323422.html
USR1亦通常被用來告知應用程式重載配置文件;
例如,向Apache HTTP伺服器發送一個USR1信號將導致以下步驟的發生:
停止接受新的連接,等待當前連接停止,重新載入配置文件,重新打開日誌文件,重啟伺服器,
從而實現相對平滑的不關機的更改。
內容摘自wiki:http://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2
對於USR1和2都可以用戶自定義的,在POSIX相容的平臺上,SIGUSR1和SIGUSR2是發送給一個進程的信號,它表示了用戶定義的情況。它們的符號常量在頭文件signal.h中定義。在不同的平臺上,信號的編號可能發生變化,因此需要使用符號名稱。
kill -HUP pid 或者 killall -HUP pName:
其中pid是進程標識,pName是進程的名稱。
如果想要更改配置而不需停止並重新啟動服務,可以使用上面兩個命令。在對配置文件作必要的更改後,發出該命令以動態更新服務配置。根據約定,當你發送一個掛起信號(信號1或HUP)時,大多數伺服器進程(所有常用的進程)都會進行複位操作並重新載入它們的配置文件。
常見配置參數小結
配置參數 | 說明 |
---|---|
compress | 通過gzip壓縮轉儲以後的日誌 |
nocompress | 不壓縮 |
copytruncate | 用於還在打開中的日誌文件,把當前日誌備份並截斷 |
nocopytruncate | 備份日誌文件但是不截斷 |
create mode owner group | 轉儲文件,使用指定的文件模式創建新的日誌文件 |
nocreate | 不建立新的日誌文件 |
delaycompress | 和compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮 |
nodelaycompress | 覆蓋 delaycompress選項,轉儲同時壓縮。 |
errors address | 專儲時的錯誤信息發送到指定的Email 地址 |
ifempty | 即使是空文件也轉儲,這個是logrotate 的預設選項。 |
notifempty | 如果是空文件的話,不轉儲 |
mail address | 把轉儲的日誌文件發送到指定的E-mail地址 |
nomail | 轉儲時不發送日誌文件 |
olddir directory | 轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統 |
noolddir | 轉儲後的日誌文件和當前日誌文件放在同一個目錄下 |
prerotate/endscript | 在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行 |
daily | 指定轉儲周期為每天 |
weekly | 指定轉儲周期為每周 |
monthly | 指定轉儲周期為每月 |
rotate count | 指定日誌文件刪除之前轉儲的次數,0指沒有備份,5 指保留5 個備份 |
tabooext [+] list | 讓logrotate不轉儲指定擴展名的文件,預設的擴展名是:.rpm-orig, .rpmsave, v, 和 ~ |
size size | 當日誌文件到達指定的大小時才轉儲,bytes(預設)及KB(sizek)或MB(sizem) |
missingok | 在日誌輪循期間,任何錯誤將被忽略,例如“文件無法找到”之類的錯誤。 |