Logrotate 程序是一個日誌文件管理工具。用於分割日誌文件,壓縮轉存、刪除舊的日誌文件,並建立新的日誌文件,下面就對logrotate日誌輪轉的記錄:php
1.1 Logrotate配置文件介紹
Linux系統默認安裝logrotate,默認的配置文件:node
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf:爲主配置文件
logrotate.d:爲配置相關子系統,用於隔離每一個應用配置(Nginx、PHP、Tomcat...)nginx
Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。web
Logrotate能夠由自動或者手動觸發日誌輪轉:vim
logrotate -f /etc/logrotate.d/nginx
logrotate -f /etc/logrotate.d/php
不過正式執行前最好經過Debug選項來驗證一下(-d參數)
具體logrotate命令格式以下:bash
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日誌後,發送日誌到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程。php-fpm
1.2 Logrotater日誌文件切割策略
查看logrotate.conf配置:工具
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 所設定的參數
monthly //每個月一次切割,取代默認的一週
minsize 1M //文件大小超過 1M 後纔會切割
create 0664 root utmp //指定新建的日誌文件權限以及所屬用戶和組
rotate 1 //只保留一個日誌.
}post
Logrotate中其餘可配置參數,具體以下:測試
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.3 NGINX日誌的配置實例參考:
vim /etc/logrotate.d/nginx
/var/log/weblog/*.log {
daily //指定轉儲週期爲天天 compress //經過gzip 壓縮轉儲之後的日誌 rotate 7 //保存7天的日誌 missingok //若是日誌文件丟失,不要顯示錯誤 notifempty //當日志文件爲空時,不進行輪轉 dateext //使用當期日期做爲命名格式,exp: nginx_access.log-20190120 sharedscripts //運行postrotate腳本 postrotate //執行的指令 if [ -f /run/nginx.pid ]; then kill -USR1 `cat /run/nginx.pid` fi endscript //結束指令
}
1.4 PHP-FPM日誌的配置實例參考:
vim /etc/logrotate.d/nginx
/usr/local/php/var/log/*.log {
daily
compress
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate
if [ -f /usr/local/php/var/run/php-fpm.pid ]; then kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` fi
endscript
}
1.5 Logrotater日誌切割輪詢
因爲Logrotate是基於CRON運行的,因此這個日誌輪轉的時間是由CRON控制的,具體能夠查詢CRON的配置文件/etc/anacrontab,過往的老版本的文件爲(/etc/crontab)
查看輪轉文件:/etc/anacrontab
cat /etc/anacrontab
SHELL=/bin/sh PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root RANDOM_DELAY=45 START_HOURS_RANGE=3-22 1 5 cron.daily nice run-parts /etc/cron.daily 7 25 cron.weekly nice run-parts /etc/cron.weekly @monthly 45 cron.monthly nice run-parts /etc/cron.monthly
使用anacrontab輪轉的配置文件,日誌切割的生效時間是在凌晨3點到22點之間,並且隨機延遲時間是45分鐘,可是這樣配置沒法知足咱們在現實中的應用
如今的需求是將切割時間調整到天天的晚上12點,即天天切割的日誌是前一天的0-24點之間的內容,操做以下:
mv /etc/anacrontab /etc/anacrontab.bak //取消日誌自動輪轉的設置
使用crontab來做爲日誌輪轉的觸發容器來修改Logrotate默認執行時間
vi /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 root run-parts /etc/cron.hourly
59 23 * root run-parts /etc/cron.daily
22 4 0 root run-parts /etc/cron.weekly
42 4 1 root run-parts /etc/cron.monthly
1.6 解決logrotate沒法自動輪詢日誌的辦法
現象說明:
使用logrotate輪詢nginx日誌,配置好以後,發現nginx日誌連續兩天沒被切割,檢查後肯定配置文件一切正常,這是爲何呢??
強行啓動記錄文件維護操做,縱使logrotate指令認爲沒有須要,應該有多是logroate認爲nginx日誌過小,不進行輪詢。
故須要強制輪詢,即在/etc/cron.daily/logrotate腳本中將 -t 參數替換成 -f 參數
vim /etc/cron.daily/logrotate
/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
最後最後重啓下cron服務:
/etc/init.d/crond restartStopping crond: [ OK ]Starting crond: [ OK ]