Linux下logrotate服務

一.配置文件

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 進程將立即再次讀取其配置並繼續運行。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章