logrotate日志處理


介紹

  logrotate旨在簡化生成大量日志文件的系統的管理。它允許日志文件的自動輪換、壓縮、刪除和郵件。每個日志文件可以每天、每周、每月處理,也可以在它變得太大時處理。通常,logrotate作為每日cron作業運行。它不會在一天內多次修改日志,除非日志的標准是基於日志的大小,並且logrotate每天運行多次,或者使用-f或--force選項。命令行上可以給出任意數量的配置文件。稍后的配置文件可能會覆蓋前面文件中給出的選項,因此列出logrotate配置文件的順序很重要。通常,應該使用一個配置文件,其中包含所需的任何其他配置文件。有關如何使用include指令來實現此目的的更多信息,請參見下面的內容。如果命令行上給出了一個目錄,則該目錄中的每個文件都用作配置文件。如果沒有給出命令行參數,logrotate將打印版本和版權信息,以及簡短的使用摘要。如果在輪換日志時發生錯誤,logrotate將以非零狀態退出。

其特點:

通過讓用戶來配置規則的方式,檢測和處理日志文件。配合Cron可讓處理定時化;
預制了大量判斷條件和處理方式,可大大降低手寫腳本的負擔和出錯的可能;
Logrorate檢測日志文件屬性,比對用戶配置好的檢測條件,對滿足條件的再根據用戶配置的要求來處理,整個可以通過Cron來定時調度。

 

組成

/usr/bin/logrotate 程序所在位置;
/etc/cron.daily/logrotate 默認讓Cron每天執行logrotate一次;
/etc/logrotate.conf 全局配置文件;
/etc/logrotate.d 應用自個的配置文件存放目錄,覆蓋全局配置;

 

logrotate命令格式:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日志后,發送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程。

 

參數說明

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 的時候就轉儲。

 

以下是對test.log進行的切割:

在/etc/logrotate.d/下創建test配置文件:
# cat test 
/datadisk/data/log/test/test.log {
        rotate 5
        missingok
        create 644 root root
        compress
        delaycompress
}

在執行了5次logrotate -f /etc/logrotate.d/test之后可以看到日志文件如下:
 
        

 

看下debug驗證的結果:
[root@master logrotate.d]# logrotate -d -f /etc/logrotate.d/test     
reading config file /etc/logrotate.d/test
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /datadisk/data/log/test/test.log  forced from command line (5 rotations)
empty log files are rotated, old logs are removed
considering log /datadisk/data/log/test/test.log
  log needs rotating
rotating log /datadisk/data/log/test/test.log, log->rotateCount is 5
dateext suffix '-20190214'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log /datadisk/data/log/test/test.log.1 does not exist
renaming /datadisk/data/log/test/test.log.5.gz to /datadisk/data/log/test/test.log.6.gz (rotatecount 5, logstart 1, i 5), 
renaming /datadisk/data/log/test/test.log.4.gz to /datadisk/data/log/test/test.log.5.gz (rotatecount 5, logstart 1, i 4), 
renaming /datadisk/data/log/test/test.log.3.gz to /datadisk/data/log/test/test.log.4.gz (rotatecount 5, logstart 1, i 3), 
renaming /datadisk/data/log/test/test.log.2.gz to /datadisk/data/log/test/test.log.3.gz (rotatecount 5, logstart 1, i 2), 
renaming /datadisk/data/log/test/test.log.1.gz to /datadisk/data/log/test/test.log.2.gz (rotatecount 5, logstart 1, i 1), 
renaming /datadisk/data/log/test/test.log.0.gz to /datadisk/data/log/test/test.log.1.gz (rotatecount 5, logstart 1, i 0), 
renaming /datadisk/data/log/test/test.log to /datadisk/data/log/test/test.log.1
creating new /datadisk/data/log/test/test.log mode = 0644 uid = 0 gid = 0
removing old log /datadisk/data/log/test/test.log.6.gz
error: error opening /datadisk/data/log/test/test.log.6.gz: No such file or directory

 

關於rotate輪換簡單的理解就是:

第一次執行完rotate(輪轉)之后,原本的test會變成test.1,而且會制造一個空的test給系統來儲存日志;
第二次執行之后,test.1會變成test.2,而test會變成test.1,又造成一個空的test來儲存日志;
如果僅設定保留五個日志(即輪轉5次)的話,那么執行第五次時,則 test.5這個檔案就會被刪除,保存最新的幾個日志,compress會壓縮轉儲后面的日志。

 

 對nginx日志進行切割:

/datadisk/data/log/nginx/access.log {
        daily
        rotate 5
        missingok
        notifempty
        dateext
        compress
        delaycompress
        sharedscripts
        postrotate
            if [ -f /var/run/nginx.pid ];then
                kill -USR1 `cat /var/run/nginx.pid`
            fi
        endscript

}

Nginx是通過postrotate指令發送USR1信號來通知Nginx重新打開日志文件的。但是其他的應用程序不一定遵循這樣的約定,比如說MySQL是通過flush-logs來重新打開日志文件的,可以在/etc/logrotate.d/目錄下查看默認的mysql的配置。更有甚者,有些應用程序就壓根沒有提供類似的方法,此時如果想重新打開日志文件,就必須重啟服務,但為了高可用性,這往往不能接受。還好Logrotate提供了一個名為copytruncate的指令,此方法采用的是先拷貝再清空的方式。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM