Linux 下 logrotate 日誌輪詢操作梳理

發表於2017-06-07

對於 Linux 系統安全來說,日誌檔案是極其重要的工具。不知為何,我發現很多運維同學的伺服器上都執行著一些諸如每天切分 Nginx日誌之類的 CRON 指令碼,大家似乎遺忘了 Logrotate,爭相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺著現成的性感美女,大家卻忙著自娛自樂,罪過!

logrotate 程式是一個日誌檔案管理工具。用於分割日誌檔案,刪除舊的日誌檔案,並建立新的日誌檔案,起到“轉儲”作用。可以節省磁碟空間。下面就對 logrotate 日誌輪轉操作做一梳理記錄。

1)配置檔案介紹

Linux系統預設安裝logrotate工具,它預設的配置檔案在:

/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置檔案,logrotate.d 是一個目錄,該目錄裡的所有檔案都會被主動的讀入/etc/logrotate.conf中執行。

另外,如果 /etc/logrotate.d/ 裡面的檔案中沒有設定一些細節,則會以/etc/logrotate.conf這個檔案的設定來作為預設值。

Logrotate是基於CRON來執行的,其指令碼是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。實際執行時,Logrotate會呼叫配置檔案/etc/logrotate.conf。可以在/etc/logrotate.d目錄裡放置自定義好的配置檔案,用來覆蓋Logrotate的預設值。

如果等不及cron自動執行日誌輪轉,想手動強制切割日誌,需要加-f引數;不過正式執行前最好通過Debug選項來驗證一下(-d引數),這對除錯也很重要:

logrotate 命令格式:

logrotate [OPTION…] <configfile>

-d, –debug :debug模式,測試配置檔案是否有錯誤。
-f, –force :強制轉儲檔案。
-m, –mail=command :壓縮日誌後,傳送日誌到指定郵箱。
-s, –state=statefile :使用指定的狀態檔案。
-v, –verbose :顯示轉儲過程。

根據日誌切割設定進行操作,並顯示詳細資訊:

根據日誌切割設定進行執行,並顯示詳細資訊,但是不進行具體操作,debug模式

檢視各log檔案的具體執行情況

2)切割介紹

比如以系統日誌/var/log/message做切割來簡單說明下:

  • 第一次執行完rotate(輪轉)之後,原本的messages會變成messages.1,而且會製造一個空的messages給系統來儲存日誌;
  • 第二次執行之後,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日誌!

如果僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的儲存日誌所取代!也就是會儲存最新的幾個日誌。

日誌究竟輪換幾次,這個是根據配置檔案中的dateext 引數來判定的。

看下logrotate.conf配置:

由這個檔案的設定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規劃出來的目錄,雖然可以將所有的配置都寫入 /etc/logrotate.conf ,但是這樣一來這個檔案就實在是太複雜了,尤其是當使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理了。

所以,如果獨立出來一個目錄,那麼每個要切割日誌的服務, 就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中。

其他重要引數說明:

小示例:下面一個切割nginx日誌的配置

——————–分享一例曾經使用過的nginx日誌切割處理指令碼———————–
1)logrotate日誌分割配置:

2)日誌分割指令碼

3)crontab定時執行

手動執行指令碼,測試下看看:

———————————-php指令碼切割一例———————————-

———————————-nginx日誌切割一例———————————–

———————————-系統日誌切割一例———————————–

———————————-tomcat日誌切割一例———————————–

———————————早期用過的nginx日誌處理一例———————————-

3)嘗試解決logrotate無法自動輪詢日誌的辦法

現象說明:

使用logrotate輪詢nginx日誌,配置好之後,發現nginx日誌連續兩天沒被切割,這是為什麼呢??

然後開始檢查日誌切割的配置檔案是否有問題,檢查後確定配置檔案一切正常。

於是懷疑是logrotate預定的cron沒執行,檢視了cron的日誌,發現有一條Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)這樣的日誌,證明cron在04:02分時已經執行/etc/cron.daily目錄下的程式。

接著檢視/etc /cron.daily/logrotate(這是logrotate自動輪轉的指令碼)的內容:

沒有發現異常,配置好的日誌輪轉操作都是由這個指令碼完成的,一切執行正常,指令碼應該就沒問題。

直接執行命令:

[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

這些系統日誌是正常輪詢了,但nginx日誌卻還是沒輪詢。

接著強行啟動記錄檔案維護操作,縱使logrotate指令認為沒有需要,應該有可能是logroate認為nginx日誌太小,不進行輪詢。

故需要強制輪詢,即在/etc/cron.daily/logrotate指令碼中將 -t 引數替換成 -f 引數

最後最後重啟下cron服務:

相關文章