Linux 下 logrotate 日誌輪詢操作梳理
對於 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的預設值。
123456789 | [root@huanqiu_web1~]# cat /etc/cron.daily/logrotate #!/bin/sh/usr/sbin/logrotate/etc/logrotate.conf>/dev/null2>&1EXITVALUE=$?if[$EXITVALUE!=0];then/usr/bin/logger-tlogrotate"ALERT exited abnormally with [$EXITVALUE]"fiexit0 |
如果等不及cron自動執行日誌輪轉,想手動強制切割日誌,需要加-f引數;不過正式執行前最好通過Debug選項來驗證一下(-d引數),這對除錯也很重要:
12 | # /usr/sbin/logrotate -f /etc/logrotate.d/nginx# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx |
logrotate 命令格式:
logrotate [OPTION…] <configfile>
-d, –debug :debug模式,測試配置檔案是否有錯誤。
-f, –force :強制轉儲檔案。
-m, –mail=command :壓縮日誌後,傳送日誌到指定郵箱。
-s, –state=statefile :使用指定的狀態檔案。
-v, –verbose :顯示轉儲過程。
根據日誌切割設定進行操作,並顯示詳細資訊:
12 | [root@huanqiu_web1~]# /usr/sbin/logrotate -v /etc/logrotate.conf[root@huanqiu_web1~]# /usr/sbin/logrotate -v /etc/logrotate.d/php |
根據日誌切割設定進行執行,並顯示詳細資訊,但是不進行具體操作,debug模式
12 | [root@huanqiu_web1~]# /usr/sbin/logrotate -d /etc/logrotate.conf[root@huanqiu_web1~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx |
檢視各log檔案的具體執行情況
1 | [root@fangfull_web1~]# cat /var/lib/logrotate.status |
2)切割介紹
比如以系統日誌/var/log/message做切割來簡單說明下:
- 第一次執行完rotate(輪轉)之後,原本的messages會變成messages.1,而且會製造一個空的messages給系統來儲存日誌;
- 第二次執行之後,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日誌!
如果僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的儲存日誌所取代!也就是會儲存最新的幾個日誌。
日誌究竟輪換幾次,這個是根據配置檔案中的dateext 引數來判定的。
看下logrotate.conf配置:
1234567891011121314151617181920 | # cat /etc/logrotate.conf# 底下的設定是 "logrotate 的預設值" ,如果別的檔案設定了其他的值,# 就會以其它檔案的設定為主weekly //預設每一週執行一次rotate輪轉工作rotate4 //保留多少個日誌檔案(輪轉幾次).預設保留四個.就是指定日誌檔案刪除之前輪轉的次數,0 指沒有備份create //自動建立新的日誌檔案,新的日誌檔案具有和原來的檔案相同的許可權;因為日誌被改名,因此要建立一個新的來繼續儲存之前的日誌dateext //這個引數很重要!就是切割後的日誌檔案以當前日期為格式結尾,如xxx.log-20131216這樣,如果註釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式compress //是否通過gzip壓縮轉儲以後的日誌檔案,如xxx.log-20131216.gz ;如果不需要壓縮,註釋掉就行include/etc/logrotate.d# 將 /etc/logrotate.d/ 目錄中的所有檔案都載入進來/var/log/wtmp{ //僅針對 /var/log/wtmp 所設定的引數monthly //每月一次切割,取代預設的一週minsize1M //檔案大小超過 1M 後才會切割create0664root utmp //指定新建的日誌檔案許可權以及所屬使用者和組rotate1 //只保留一個日誌.}# 這個 wtmp 可記錄使用者登入系統及系統重啟的時間# 因為有 minsize 的引數,因此不見得每個月一定會執行一次喔.要看檔案大小。 |
由這個檔案的設定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規劃出來的目錄,雖然可以將所有的配置都寫入 /etc/logrotate.conf ,但是這樣一來這個檔案就實在是太複雜了,尤其是當使用很多的服務在系統上面時, 每個服務都要去修改 /etc/logrotate.conf 的設定也似乎不太合理了。
所以,如果獨立出來一個目錄,那麼每個要切割日誌的服務, 就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中。
其他重要引數說明:
12345678910111213141516171819202122232425262728293031 | compress 通過gzip壓縮轉儲以後的日誌nocompress 不做gzip壓縮處理copytruncate 用於還在開啟中的日誌檔案,把當前日誌備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日誌資料。nocopytruncate 備份日誌檔案不過不截斷create mode owner group 輪轉時指定建立新檔案的屬性,如create0777nobody nobodynocreate 不建立新的日誌檔案delaycompress 和compress一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮nodelaycompress 覆蓋delaycompress選項,轉儲同時壓縮。missingok 如果日誌丟失,不報錯繼續滾動下一個日誌errors address 專儲時的錯誤資訊傳送到指定的Email地址ifempty 即使日誌檔案為空檔案也做輪轉,這個是logrotate的預設選項。notifempty 當日志文件為空時,不進行輪轉mail address 把轉儲的日誌檔案傳送到指定的E-mail地址nomail 轉儲時不傳送日誌檔案olddir directory 轉儲後的日誌檔案放入指定的目錄,必須和當前日誌檔案在同一個檔案系統noolddir 轉儲後的日誌檔案和當前日誌檔案放在同一個目錄下sharedscripts 執行postrotate指令碼,作用是在所有日誌都輪轉後統一執行一次指令碼。如果沒有配置這個,那麼每個日誌輪轉後都會執行一次指令碼prerotate 在logrotate轉儲之前需要執行的指令,例如修改檔案的屬性等動作;必須獨立成行postrotate 在logrotate轉儲之後需要執行的指令,例如重新啟動(kill-HUP)某個服務!必須獨立成行daily 指定轉儲週期為每天weekly 指定轉儲週期為每週monthly 指定轉儲週期為每月rotate count 指定日誌檔案刪除之前轉儲的次數,0指沒有備份,5指保留5個備份dateext 使用當期日期作為命名格式dateformat.%s 配合dateext使用,緊跟在下一行出現,定義檔案切割後的檔名,必須配合dateext使用,只支援%Y%m%d%s這四個引數size(或minsize)log-size 當日志文件到達指定的大小時才轉儲,log-size能指定bytes(預設)及KB(sizek)或MB(sizem).當日志文件>=log-size的時候就轉儲。以下為合法格式:(其他格式的單位大小寫沒有試過)size=5或size5(>=5個位元組就轉儲)size=100k或size100ksize=100M或size100M |
小示例:下面一個切割nginx日誌的配置
1234567891011121314 | [root@master-server~]# vim /etc/logrotate.d/nginx /usr/local/nginx/logs/*.log{dailyrotate7missingoknotifemptydateextsharedscriptspostrotateif[-f/usr/local/nginx/logs/nginx.pid];thenkill-USR1`cat/usr/local/nginx/logs/nginx.pid`fiendscript} |
——————–分享一例曾經使用過的nginx日誌切割處理指令碼———————–
1)logrotate日誌分割配置:
1234567891011 | [root@bastion-IDC~# vim /etc/logrotate.d/nginx/data/nginx_logs/*.access_log{nocompress daily copytruncate create ifempty olddir/data/nginx_logs/days rotate0} |
2)日誌分割指令碼
1234567891011121314151617181920212223 | [root@bastion-IDC~# vim /usr/local/sbin/logrotate-nginx.sh#!/bin/bash#建立轉儲日誌壓縮存放目錄mkdir-p/data/nginx_logs/days#手工對nginx日誌進行切割轉換/usr/sbin/logrotate-vf/etc/logrotate.d/nginx#當前時間time=$(date-d"yesterday"+"%Y-%m-%d")#進入轉儲日誌存放目錄cd/data/nginx_logs/days#對目錄中的轉儲日誌檔案的檔名進行統一轉換foriin$(ls./|grep"^\(.*\)\.[[:digit:]]$")domv${i}./$(echo${i}|sed-n's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo$time)done#對轉儲的日誌檔案進行壓縮存放,並刪除原有轉儲的日誌檔案,只儲存壓縮後的日誌檔案。以節約儲存空間foriin$(ls./|grep"^\(.*\)\-\([[:digit:]-]\+\)$")dotarjcvf${i}.bz2./${i}rm-rf./${i}done#只保留最近7天的壓縮轉儲日誌檔案find/data/nginx_logs/days/*-name"*.bz2"-mtime7-typef-execrm-rf{}\; |
3)crontab定時執行