運維中的日誌切割操作梳理(Logrotate/python/shell指令碼實現)

散盡浮華發表於2017-01-19

 

對於Linux系統安全來說,日誌檔案是極其重要的工具。不知為何,我發現很多運維同學的伺服器上都執行著一些諸如每天切分Nginx日誌之類的CRON指令碼,大家似乎遺忘了Logrotate,爭相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺著現成的性感美女,大家卻忙著自娛自樂,罪過!logrotate程式是一個日誌檔案管理工具。用於分割日誌檔案,刪除舊的日誌檔案,並建立新的日誌檔案,起到“轉儲”作用。可以節省磁碟空間。下面就對logrotate日誌輪轉操作做一梳理記錄:

1)配置檔案介紹
Linux系統預設安裝logrotate工具,它預設的配置檔案在:
/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置檔案,logrotate.d 是一個目錄,該目錄裡的所有檔案都會被主動的讀入/etc/logrotate.conf中執行。
另外,如果 /etc/logrotate.d/ 裡面的檔案中沒有設定一些細節,則會以/etc/logrotate.conf這個檔案的設定來作為預設值。

Logrotate是基於CRON來執行的,其指令碼是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的
實際執行時,Logrotate會呼叫配置檔案/etc/logrotate.conf。
可以在/etc/logrotate.d目錄裡放置自定義好的配置檔案,用來覆蓋Logrotate的預設值。

[root@huanqiu_web1 ~]# cat /etc/cron.daily/logrotate 
#!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

如果等不及cron自動執行日誌輪轉,想手動強制切割日誌,需要加-f引數;不過正式執行前最好通過Debug選項來驗證一下(-d引數),這對除錯也很重要
# /usr/sbin/logrotate -f /etc/logrotate.d/nginx
# /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx

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

根據日誌切割設定進行操作,並顯示詳細資訊
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php

根據日誌切割設定進行執行,並顯示詳細資訊,但是不進行具體操作,debug模式
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

檢視各log檔案的具體執行情況
[root@fangfull_web1 ~]# cat /var/lib/logrotate.status

2)切割介紹
比如以系統日誌/var/log/message做切割來簡單說明下:
第一次執行完rotate(輪轉)之後,原本的messages會變成messages.1,而且會製造一個空的messages給系統來儲存日誌;
第二次執行之後,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日誌!
如果僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的儲存日誌所取代!也就是會儲存最新的幾個日誌。
日誌究竟輪換幾次,這個是根據配置檔案中的rotate引數來判定的。

看下logrotate.conf配置:
# cat /etc/logrotate.conf
# 底下的設定是 "logrotate 的預設值" ,如果別的檔案設定了其他的值,
# 就會以其它檔案的設定為主
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                    //只保留一個日誌.
}
# 這個 wtmp 可記錄使用者登入系統及系統重啟的時間
# 因為有 minsize 的引數,因此不見得每個月一定會執行一次喔.要看檔案大小。

由這個檔案的設定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規劃出來的目錄,雖然可以將所有的配置都寫入/etc/logrotate.conf ,但是這樣一來這個檔案就實在是太複雜了,尤其是當使用很多的服務在系統上面時, 每個服務都要去修改/etc/logrotate.conf的設定也似乎不太合理了。
所以,如果獨立出來一個目錄,那麼每個要切割日誌的服務, 就可以獨自成為一個檔案,並且放置到 /etc/logrotate.d/ 當中

其他重要引數說明
---------------------------------------------------------------------------------------------------------
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

小示例:下面一個切割nginx日誌的配置

[root@master-server ~]# 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
endscript
}

--------------------------------------------------分享一例曾經使用過的nginx日誌切割處理指令碼-----------------------------------------------
1)logrotate日誌分割配置:

[root@bastion-IDC ~# vim /etc/logrotate.d/nginx
/data/nginx_logs/*.access_log         
{
nocompress                                    
daily                                   
copytruncate                                   
create                               
ifempty                                    
olddir /data/nginx_logs/days            
rotate 0                                         
}

2)日誌分割指令碼

[root@bastion-IDC ~# 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定時執行

[root@bastion-IDC ~# crontab -e
#logrotate
0 0 * * * /bin/bash -x /usr/local/sbin/logrotate-nginx.sh > /dev/null 2>&1 

手動執行指令碼,測試下看看:

[root@bastion-IDC ~# /bin/bash -x /usr/local/sbin/logrotate-nginx.sh
[root@bastion-IDC ~# cd /data/nginx_logs/days 
[root@bastion-IDC days# ls
huantest.access_log-2017-01-18.bz2

----------------------------------php指令碼切割一例----------------------------------

[root@huanqiu_web1 ~]# 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
}

[root@huanqiu_web1 ~]# ll /Data/app/php5.6.26/var/run/php-fpm.pid 
-rw-r--r-- 1 root root 4 Dec 28 17:03 /Data/app/php5.6.26/var/run/php-fpm.pid

[root@huanqiu_web1 ~]# cd /Data/logs/php
[root@huanqiu_web1 php]# ll
total 25676
-rw-r--r-- 1 root   root         0 Jun  1  2016 error.log
-rw-r--r-- 1 nobody nobody     182 Aug 30  2015 error.log-20150830.gz
-rw-r--r-- 1 nobody nobody     371 Sep  1  2015 error.log-20150901.gz
-rw-r--r-- 1 nobody nobody     315 Sep  7  2015 error.log-20150907.gz
.........
.........

----------------------------------nginx日誌切割一例-----------------------------------

[root@huanqiu_web1 ~]# cat /etc/logrotate.d/nginx 
/Data/logs/nginx/*/*log {
    daily
    rotate 365
    missingok
    notifempty
    compress
    dateext
    sharedscripts
    postrotate
    /etc/init.d/nginx reload
    endscript
}

[root@huanqiu_web1 ~]# ll /Data/logs/nginx/www.huanqiu.com/
..........
-rw-r--r-- 1 root root      1652 Jan  1 00:00 error.log-20170101.gz
-rw-r--r-- 1 root root      1289 Jan  2 00:00 error.log-20170102.gz
-rw-r--r-- 1 root root      1633 Jan  3 00:00 error.log-20170103.gz
-rw-r--r-- 1 root root      3239 Jan  4 00:00 error.log-20170104.gz

----------------------------------系統日誌切割一例-----------------------------------

[root@huanqiu_web1 ~]# 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
}

[root@huanqiu_web1 ~]# ll /var/log/messages*
-rw------- 1 root root 34248975 Jan 19 18:42 /var/log/messages
-rw------- 1 root root 51772994 Dec 25 03:11 /var/log/messages-20161225
-rw------- 1 root root 51800210 Jan  1 03:05 /var/log/messages-20170101
-rw------- 1 root root 51981366 Jan  8 03:36 /var/log/messages-20170108
-rw------- 1 root root 51843025 Jan 15 03:40 /var/log/messages-20170115
[root@huanqiu_web1 ~]# ll /var/log/cron*
-rw------- 1 root root 2155681 Jan 19 18:43 /var/log/cron
-rw------- 1 root root 2932618 Dec 25 03:11 /var/log/cron-20161225
-rw------- 1 root root 2939305 Jan  1 03:06 /var/log/cron-20170101
-rw------- 1 root root 2951820 Jan  8 03:37 /var/log/cron-20170108
-rw------- 1 root root 3203992 Jan 15 03:41 /var/log/cron-20170115
[root@huanqiu_web1 ~]# ll /var/log/secure*
-rw------- 1 root root  275343 Jan 19 18:36 /var/log/secure
-rw------- 1 root root 2111936 Dec 25 03:06 /var/log/secure-20161225
-rw------- 1 root root 2772744 Jan  1 02:57 /var/log/secure-20170101
-rw------- 1 root root 1115543 Jan  8 03:26 /var/log/secure-20170108
-rw------- 1 root root  731599 Jan 15 03:40 /var/log/secure-20170115
[root@huanqiu_web1 ~]# ll /var/log/spooler*
-rw------- 1 root root 0 Jan 15 03:41 /var/log/spooler
-rw------- 1 root root 0 Dec 18 03:21 /var/log/spooler-20161225
-rw------- 1 root root 0 Dec 25 03:11 /var/log/spooler-20170101
-rw------- 1 root root 0 Jan  1 03:06 /var/log/spooler-20170108
-rw------- 1 root root 0 Jan  8 03:37 /var/log/spooler-20170115

----------------------------------tomcat日誌切割一例-----------------------------------

[root@huanqiu-backup ~]# cat /etc/logrotate.d/tomcat 
/Data/app/tomcat-7-huanqiu/logs/catalina.out { 
rotate 14 
daily 
copytruncate 
compress 
notifempty 
missingok 
} 

[root@huanqiu-backup ~]# ll /Data/app/tomcat-7-huanqiu/logs/catalina.*
-rw-r--r--. 1 root root     0 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out
-rw-r--r--. 1 root root 95668 Jan 19 19:11 /Data/app/tomcat-7-huanqiu/logs/catalina.out.1.gz

---------------------------------早期用過的nginx日誌處理一例----------------------------------

[root@letv-backup ~]# vim /letv/sh/cut_nginx_log.sh
#!/bin/bash
# 你的日誌檔案存放目錄
logs_path="/letv/logs/"
# 日誌檔案的名字,多個需要空格隔開
logs_names=(error access pv_access)
dates=`date -d "yesterday" +"%Y%m%d"`
mkdir -p ${logs_path}$dates/
num=${#logs_names[@]}
for((i=0;i<num;i++));do
mv ${logs_path}${logs_names[i]}.log ${logs_path}$dates/${logs_names[i]}.log
done
#nginx平滑重啟
kill -USR1 `cat /letv/logs/nginx/nginx.pid`            

結合crontab定時執行
[root@letv-backup ~]# crontab -e
#nginx日誌切割
00 00 * * * cd /letv/logs;/bin/bash /letv/sh/cut_nginx_log.sh > /dev/null 2>$1

3)嘗試解決logrotate無法自動輪詢日誌的辦法
現象說明:
使用logrotate輪詢nginx日誌,配置好之後,發現nginx日誌連續兩天沒被切割,這是為什麼呢??
然後開始檢查日誌切割的配置檔案是否有問題,檢查後確定配置檔案一切正常。
於是懷疑是logrotate預定的cron沒執行,檢視了cron的日誌,發現有一條Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)這樣的日誌,證明cron在04:02分時已經執行/etc/cron.daily目錄下的程式。
接著檢視/etc /cron.daily/logrotate(這是logrotate自動輪轉的指令碼)的內容:

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
 
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

沒有發現異常,配置好的日誌輪轉操作都是由這個指令碼完成的,一切執行正常,指令碼應該就沒問題。
直接執行命令:
[root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf
這些系統日誌是正常輪詢了,但nginx日誌卻還是沒輪詢

接著強行啟動記錄檔案維護操作,縱使logrotate指令認為沒有需要,應該有可能是logroate認為nginx日誌太小,不進行輪詢。
故需要強制輪詢,即在/etc/cron.daily/logrotate指令碼中將 -t 引數替換成 -f 引數

[root@huanqiu_test ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
 
/usr/sbin/logrotate /etc/logrotate.conf >/dev/null 2>&1
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
    /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

最後最後重啟下cron服務:
[root@huanqiu_test ~]# /etc/init.d/crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]

===============logrotate預設自動切割生效時間==============

Logrotate是基於CRON來執行的,其指令碼是/etc/cron.daily/logrotate,實際執行時,Logrotate會呼叫配置檔案/etc/logrotate.conf。
[root@test ~]# 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
  
 
Logrotate是基於CRON執行的,所以這個時間是由CRON控制的,具體可以查詢CRON的配置檔案/etc/anacrontab(老版本的檔案是/etc/crontab)
[root@test ~]# cat /etc/anacrontab
# /etc/anacrontab: configuration file for anacron
  
# See anacron(8) and anacrontab(5) for details.
  
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# the maximal random delay added to the base delay of the jobs
RANDOM_DELAY=45                                                                  //這個是隨機的延遲時間,表示最大45分鐘
# the jobs will be started during the following hours only
START_HOURS_RANGE=3-22                                                           //這個是開始時間
  
#period in days   delay in minutes   job-identifier   command
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
  
第一個是Recurrence period
第二個是延遲時間
所以cron.daily會在3:22+(5,45)這個時間段執行,/etc/cron.daily是個資料夾
  
通過預設/etc/anacrontab檔案配置,會發現logrotate自動切割日誌檔案的預設時間是凌晨3點多。
  
==================================================================================================
現在需要將切割時間調整到每天的晚上12點,即每天切割的日誌是前一天的0-24點之間的內容。
操作如下:
[root@kevin ~]# mv /etc/anacrontab /etc/anacrontab.bak          //取消日誌自動輪轉的設定

[root@G6-bs02 logrotate.d]# cat nstc_nohup.out 
/data/nstc/nohup.out {
rotate 30
dateext
daily
copytruncate
compress
notifempty
missingok
}

[root@G6-bs02 logrotate.d]# cat syslog 
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/history
{
    sharedscripts
    compress
    rotate 30
    daily
    dateext
    postrotate
    /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}

結合crontab進行自定義的定時輪轉操作
[root@kevin ~]# crontab -l
#log logrotate
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/syslog >/dev/null 2>&1
59 23 * * * /usr/sbin/logrotate -f /etc/logrotate.d/nstc_nohup.out >/dev/null 2>&1

[root@G6-bs02 ~]# ll /data/nstc/nohup.out*
-rw------- 1 app app 33218 1月  25 09:43 /data/nstc/nohup.out
-rw------- 1 app app 67678 1月  25 23:59 /data/nstc/nohup.out-20180125.gz

---------------------------------------------------------------------------------------------------------------------------------------

除了利用自帶的Logrotate工具實現日誌切割之外,還可以編寫python指令碼或shell指令碼以實現日誌切割。下面就簡單列出幾個例項說明下:

一、Python指令碼實現日誌切割

例項1:對jumpserver日誌進行切割
[root@test-vm01 mnt]# cat log_rotate.py 
#!/usr/bin/env python
  
import datetime,os,sys,shutil
  
log_path = '/opt/jumpserver/logs/'
log_file = 'jumpserver.log'
  
yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1))
  
try:
    os.makedirs(log_path + yesterday.strftime('%Y') + os.sep + \
                yesterday.strftime('%m'))
  
except OSError,e:
    print
    print e
    sys.exit()
  
  
shutil.move(log_path + log_file,log_path \
            + yesterday.strftime('%Y') + os.sep \
            + yesterday.strftime('%m') + os.sep \
            + log_file + '_' + yesterday.strftime('%Y%m%d') + '.log')
  
  
os.popen("sudo /opt/jumpserver/service.sh restart")

手動執行這個指令碼:
[root@test-vm01 mnt]# chmod 755 log_rotate.py
[root@test-vm01 mnt]# python log_rotate.py

檢視日誌切割後的效果:
[root@test-vm01 mnt]# ls /opt/jumpserver/logs/
2017  jumpserver.log  
[root@test-vm01 mnt]# ls /opt/jumpserver/logs/2017/
09
[root@test-vm01 mnt]# ls /opt/jumpserver/logs/2017/09/
jumpserver.log_20170916.log

然後做每日的定時切割任務:
[root@test-vm01 mnt]# crontab -e
30 1 * * * /usr/bin/python /mnt/log_rotate.py > /dev/null 2>&1

--------------------------------------------------------------------------------------
例項2:對nginx日誌進行切割
[root@test-vm01 mnt]# vim log_rotate.py
#!/usr/bin/env python
  
import datetime,os,sys,shutil
  
log_path = '/app/nginx/logs/'
log_file = 'www_access.log'
  
yesterday = (datetime.datetime.now() - datetime.timedelta(days = 1))
  
try:
    os.makedirs(log_path + yesterday.strftime('%Y') + os.sep + \
                yesterday.strftime('%m'))
  
except OSError,e:
    print
    print e
    sys.exit()
  
  
shutil.move(log_path + log_file,log_path \
            + yesterday.strftime('%Y') + os.sep \
            + yesterday.strftime('%m') + os.sep \
            + log_file + '_' + yesterday.strftime('%Y%m%d') + '.log')
  
  
os.popen("sudo kill -USR1 `cat /app/nginx/logs/nginx.pid`")

--------------------------------------------------------------------------------------
其他業務日誌的切割指令碼跟上面做法相同

二、shell指令碼實現日誌切割

[root@qd-vpc-op-consumer01 ~]# cat /app/script/log_rotate.sh 
#!/bin/sh

function rotate() {
logs_path=$1

echo Rotating Log: $1
cp ${logs_path} ${logs_path}.$(date -d "yesterday" +"%Y%m%d")
> ${logs_path}
    rm -f ${logs_path}.$(date -d "7 days ago" +"%Y%m%d")
}

for i in $*
do
        rotate $i
done

--------------------------------------------------------------------------------------------------------------
每天定時切割日誌的任務制定(比如對python的一個業務/data/log/xcspam/下的日誌進行切割,0K的日誌不進行切割):
[root@qd-vpc-op-consumer01 ~]# crontab -e
#xcspam 日誌切割
30 0 * * * find /data/log/xcspam/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh

手動執行切割:
[root@qd-vpc-op-consumer01 ~]# find /data/log/xcspam/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh

切割後的日誌效果:
[root@qd-vpc-op-consumer01 ~]# ls /data/log/xcspam/
xcspam_error.log  xcspam_error.log-20170926

--------------------------------------------------------------------------------------------------------------
比如對maridb日誌進行切割
[root@qd-vpc-op-consumer01 ~]# crontab -e
#xcspam 日誌切割
30 0 * * * find /var/log/mariadb/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh

[root@qd-vpc-op-consumer01 ~]# find /var/log/mariadb/ -size +0 -name '*.log' | xargs /app/script/log_rotate.sh
[root@qd-vpc-op-consumer01 ~]# ll /var/log/mariadb/
總用量 8
-rw-r-----. 1 mysql mysql    0 9月  17 20:31 mariadb.log
-rw-r-----. 1 root  root  4532 9月  17 20:31 mariadb.log.20170916
--------------------------------------------------------------------------------------------------------------

相關文章