一.配置文件
Linux系統默認安裝logrotate工具,它默認的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
(1)logrotate.conf 是主要的配置文件,logrotate.d 是一個目錄,該目錄裏的所有文件都會被主動的讀入/etc/logrotate.conf中執行。
主配置文件: [root@node1 ~]# cat /etc/logrotate.conf # see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.
(2)在/etc/logrotate.d目錄裏放置自定義好的配置文件,用來覆蓋Logrotate的缺省值。
[root@node1 logrotate.d]# cd /etc/logrotate.d/ [root@node1 logrotate.d]# ls -lrt total 12 -rw-r--r--. 1 root root 210 Dec 10 2014 syslog -rw-r--r--. 1 root root 139 May 11 2016 dracut -rw-r--r--. 1 root root 87 May 12 2016 yum [root@node1 logrotate.d]# cat syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
(3)logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
[root@node1 cron.daily]# 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
(4)logrotate命令格式
logrotate [OPTION...] <configfile> -d, --debug :debug模式,測試配置文件是否有錯誤。 -f, --force :強制轉儲文件。 -m, --mail=command :壓縮日誌後,發送日誌到指定郵箱。 -s, --state=statefile :使用指定的狀態文件。 -v, --verbose :顯示轉儲過程。 查看各log文件的具體執行情況 [root@node1 cron.daily]# cat /var/lib/logrotate.status logrotate state -- version 2 "/var/log/yum.log" 2017-6-18 "/var/log/dracut.log" 2017-6-18 "/var/log/wtmp" 2017-6-18 "/var/log/spooler" 2017-6-18 "/var/log/btmp" 2017-6-18 "/var/log/maillog" 2017-6-18 "/var/log/secure" 2017-6-18 "/var/log/messages" 2017-6-18 "/var/log/cron" 2017-6-18
二.詳細介紹配置文件參數
# cat /etc/logrotate.conf weekly #默認每一週執行一次rotate輪轉工作 rotate 4 #保留多少個日誌文件(輪轉幾次),默認保留四個。就是指定日誌文件刪除之前輪轉的次數,如果是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文件,該文件記錄每個用戶的登錄次數和持續時間等信息 。last命令查看 monthly #每月執行一次,覆蓋之前配置文件中定義的一週 create 0664 root utmp #指定新創建的文件的權限 minsize 1M #文件大小超過 1M 後纔會切割 rotate 1 #保留一個日誌 } /var/log/btmp { #針對/var/log/btmp文件 missingok # 如果日誌丟失,不報錯繼續滾動下一個日誌 monthly create 0600 root utmp rotate 1 }
其他重要參數說明:
compress #通過gzip 壓縮轉儲以後的日誌 nocompress #不做gzip壓縮處理 copytruncate #用於還在打開中的日誌文件,把當前日誌備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日誌數據。 nocopytruncate #備份日誌文件不截斷 create mode owner group #輪轉時指定創建新文件的屬性,如create 0777 nobody nobody nocreate #不建立新的日誌文件 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 或 size 5 (>= 5 個字節就轉儲) size = 100k 或 size 100k size = 100M 或 size 100M
三.實例
(1)切割nginx日誌的配置
vim /etc/logrotate.d/nginx /usr/local/nginx/logs/*.log { daily rotate 7 missingok notifempty #當日志文件爲空時,不進行輪轉 dateext sharedscripts postrotate if [ -f /usr/local/nginx/logs/nginx.pid ]; then kill -USR1 `cat /usr/local/nginx/logs/nginx.pid` fi ###或者[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript } cat /etc/logrotate.d/nginx /Data/logs/nginx/*/*log { daily rotate 365 missingok notifempty compress dateext sharedscripts postrotate /etc/init.d/nginx reload endscript }
###USR1亦通常被用來告知應用程序重載配置文件;例如,向Apache HTTP服務器發送一個USR1信號將導致以下步驟的發生:停止接受新的連接,等待當前連接停止,重新載入配置文件,重新打開日誌文件,重啓服務器,從而實現相對平滑的不關機的更改###
(2)nginx日誌切割處理腳本
1)logrotate日誌分割配置: vim /etc/logrotate.d/nginx /data/nginx_logs/*.access_log { nocompress #不做gzip壓縮處理 daily copytruncate create ifempty olddir /data/nginx_logs/days rotate 0 } 2)日誌分割腳本 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 #對目錄中的轉儲日誌文件的文件名進行統一轉換 for i in $(ls ./ | grep "^\(.*\)\.[[:digit:]]$") do mv ${i} ./$(echo ${i}|sed -n 's/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo $time) done #對轉儲的日誌文件進行壓縮存放,並刪除原有轉儲的日誌文件,只保存壓縮後的日誌文件。以節約存儲空間 for i in $(ls ./ | grep "^\(.*\)\-\([[:digit:]-]\+\)$") do tar jcvf ${i}.bz2 ./${i} rm -rf ./${i} done #只保留最近7天的壓縮轉儲日誌文件 find /data/nginx_logs/days/* -name "*.bz2" -mtime 7 -type f -exec rm -rf {} \; 3)crontab定時執行 crontab -e #logrotate 0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1
(3)php腳本切割
cat /etc/logrotate.d/php /Data/logs/php/*log { daily rotate 365 missingok notifempty compress dateext sharedscripts postrotate if [ -f /Data/app/php5.6.26/var/run/php-fpm.pid ]; then kill -USR1 `cat /Data/app/php5.6.26/var/run/php-fpm.pid` fi endscript postrotate /bin/chmod 644 /Data/logs/php/*gz endscript }
(4)系統日誌切割
cat /etc/logrotate.d/syslog /var/log/cron /var/log/maillog /var/log/messages /var/log/secure /var/log/spooler { sharedscripts postrotate /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true endscript }
(5)例子
touch /var/log/log-file head -c 10M < /dev/urandom > /var/log/log-file 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 進程將立即再次讀取其配置並繼續運行。