1. 程式人生 > >Linux 下 logrotate 日誌輪詢操作梳理

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=5size5>=5個位元組就轉儲)size=100ksize100ksize=100Msize100M

小示例:下面一個切割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定時執行