linux 小工具之:日誌切割(logrotate)

1向2飛發表於2016-09-08
        一直都是看到nginx自身是不帶日誌切割的(坑爹的玩意兒),近兩天玩nginx(為了方便直接rpm安裝的),突然發現/var/log/nginx/*.log下的日誌,竟然按照日期進行了切割和備份,感覺怪怪的(平常這個都是自己碼shell+cron搞定的),怎麼突然軟體自己實現了,開始以為nginx新版增加日誌切割功能,但是對比原始碼安裝的情況並非如此(因為rpm安裝的版本個低啊!)。開始各種百度,都是寫的自己怎麼shell實現切割的(坑一個)。沒辦法,只有自己使出了自己的一貫排錯查詢手法神奇grep,#grep access.log /  <--呵呵,還真被找了/var/lib/logrotate.status 這個是什麼鬼,又百度,終於搞清楚了,一個大寫的坑:Logrotate

一、Logrotate簡介

logrotate 是Linux系統日誌檔案管理工具。用來把舊的日誌檔案刪除,並建立新的日誌檔案,我們把它叫做“轉儲”。
(1)可以根據日誌檔案的大小,也可以按照日期來轉儲,這個過程一般通過 cron 程式來執行。
(2)logrotate 程式還可以用於壓縮日誌檔案,以及傳送日誌到指定的E-mail。
(3)預設的logrotate被加入cron的/etc/cron.daily中作為每日任務執行。
(4)/etc/logrotate.d/* 為/etc/logrotate.conf預設配置檔案的輔助包含配置檔案,目錄其中檔案也會被logrotate讀取,單獨指明特定日誌檔案的特定規則。
(5)/var/lib/logrotate.status中記錄logrotate上次輪換日誌檔案的時間。
(6)logrotate 基於系統Cron定時任務執行,所以生成日誌的時間可以在/etc/crontab中看到.

vi /etc/crontab

SHELL=/bin/sh

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin


# m h dom mon dow user  command

17 *    * * *   root    cd / && run-parts --report /etc/cron.hourly

25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )

47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )

52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )

二、Logrotate除錯和手動執行:

logrotate 可以直接執行,後面跟配置檔案就可以了,如:/usr/sbin/logrotate -f /etc/logrotate.d/nginx

引數:

-v  顯示指令執行過程

-d  Debug模式(模擬執行),詳細顯示指令執行過程,便於排錯或瞭解程式執行的情況。

-f  強制執行

-s  <狀態檔案>  使用指定的狀態檔案

三、配置檔案配置

logrotate 的預設全域性配置檔案是 /etc/logrotate.conf ,輔助配置檔案:/etc/logrotate.d/* 
主要引數:

daily:指定轉儲週期為每天 ,其他日期值:(weekly指定轉儲週期為每週、 monthly指定轉儲週期為每月、yearly 年 )
size size:當日志檔案到達指定的大小時才轉儲,Size 可以指定 bytes (預設)以及KB (sizek)或者MB (sizem). 

dateext:在備份轉存檔案末尾新增當前日期 

compress:通過gzip 壓縮轉儲以後的日誌 

nocompress:不需要壓縮時,用這個引數 
delaycompress和 compress 一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮
missingok: 在日誌輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤。
create mode owner group:轉儲檔案,使用指定的檔案模式建立新的日誌檔案 

ifempty:即使是空檔案也轉儲,這個是 logrotate 的預設選項。 

notifempty:如果是空檔案的話,不轉儲 
rotate 5:一次將儲存5個歸檔日誌。對於第六個歸檔,時間最久的歸檔將被刪除。,0 指沒有備份,5 指保留5 個備份 

prerotate/endscript:在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

postrotate/endscript:在轉儲以後需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

copytruncate:先把日誌內容複製到舊日誌檔案後才清除日誌檔案內容,可以保證日誌記錄的連續性

nocopytruncate:備份日誌檔案但是不截斷 

nocreate:不建立新的日誌檔案 

nodelaycompress:覆蓋 delaycompress 選項,轉儲同時壓縮。 

errors address:專儲時的錯誤資訊傳送到指定的Email 地址 

mail address:把轉儲的日誌檔案傳送到指定的E-mail 地址 

nomail:轉儲時不傳送日誌檔案 

olddir directory:轉儲後的日誌檔案放入指定的目錄,必須和當前日誌檔案在同一個檔案系統 

noolddir轉儲後的日誌檔案和當前日誌檔案放在同一個目錄下  

tabootext [+] list讓logrotate: 不轉儲指定副檔名的檔案,預設的副檔名是:.rpm-orig, .rpmsave, v, 和 ~ 

四、測試用例

crontab -e

59 23 * * *  /usr/sbin/logrotate -f /etc/logrotate.d/nginx      # 把Nginx日誌全部轉儲


vi /etc/logrotate.d/nginx

/var/log/nginx/*.log {

        daily#指定轉儲週期為每天 

        missingok

        rotate 52

        compress#通過gzip 壓縮轉儲以後的日誌

        delaycompress#和 compress 一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮 

        ifempty

        create 0640 www-data adm

        sharedscripts

        postrotate

  #kill -USR1 `cat /var/run/nginx.pid不是中止Nginx的程式,而是傳遞給它訊號重新生成日誌,如果nginx沒啟動不做操作

                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

        endscript

}



Q&A

1.如何測試logrotate程式執行的情況

答:/usr/sbin/logrotate -d /etc/logrotate.d/nginx


2.怎麼檢視log檔案的具體執行情況

答:cat /var/lib/logrotate/status


3.使用-v或-d引數時,顯示log does not need rotating

答:logrotate在對status未記錄的檔案進行轉儲時,會在status新增一條該檔案的記錄,並將操作時間設為當天。之後程式再次對此檔案進行轉儲時發現這個檔案今天已經操作過,就不再進行相關操作。

解決方法:1. vi /var/lib/logrotate/status  更改相對應的檔案操作日期

 2. 使用-s指定狀態檔案

 

4.分割日誌時報錯:error: skipping "/var/log/nginx/test.access.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

答:新增“su root list”到/etc/logrotate.d/nginx檔案中即可

如下;

/var/log/nginx/*.log {

        su root list

        daily

        missingok

        rotate 52

        compress

        delaycompress

        notifempty

        #ifempty

        create 0640 www-data adm

        sharedscripts

        postrotate

                [ ! -f /var/run/nginx.pid ] || kill -USR1 `cat /var/run/nginx.pid`

        endscript

}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23890223/viewspace-2124714/,如需轉載,請註明出處,否則將追究法律責任。

相關文章