Linux 日志切割神器 Logrotate 原理和配置詳解(附多生產(chǎn)實例)
??“Python貓” ,一個值得加星標的公眾號

對于 Linux 系統(tǒng)安全來說,日志文件是極其重要的工具。不知為何,我發(fā)現(xiàn)很多運維同學的服務器上都運行著一些諸如每天切分 Nginx日志之類的 CRON 腳本,大家似乎遺忘了 Logrotate,爭相發(fā)明自己的輪子,這真是讓人沮喪??!就好比明明身邊躺著現(xiàn)成的性感美女,大家卻忙著自娛自樂,罪過!
logrotate 程序是一個日志文件管理工具。用于分割日志文件,刪除舊的日志文件,并創(chuàng)建新的日志文件,起到“轉(zhuǎn)儲”作用??梢怨?jié)省磁盤空間。下面就對 logrotate 日志輪轉(zhuǎn)操作做一梳理記錄。
1、配置文件介紹
Linux系統(tǒng)默認安裝logrotate工具,它默認的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/logrotate.conf 才主要的配置文件,logrotate.d 是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執(zhí)行。
另外,如果 /etc/logrotate.d/ 里面的文件中沒有設(shè)定一些細節(jié),則會以/etc/logrotate.conf這個文件的設(shè)定來作為默認值。
Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉(zhuǎn)是系統(tǒng)自動完成的。實際運行時,Logrotate會調(diào)用配置文件/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自動執(zhí)行日志輪轉(zhuǎn),想手動強制切割日志,需要加-f參數(shù);不過正式執(zhí)行前最好通過Debug選項來驗證一下(-d參數(shù)),這對調(diào)試也很重要:
#?/usr/sbin/logrotate?-f?/etc/logrotate.d/nginx
#?/usr/sbin/logrotate?-d?-f?/etc/logrotate.d/nginxlogrotate 命令格式:
logrotate?[OPTION...]?
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉(zhuǎn)儲文件。
-m, --mail=command :壓縮日志后,發(fā)送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態(tài)文件。
-v, --verbose :顯示轉(zhuǎn)儲過程。根據(jù)日志切割設(shè)置進行操作,并顯示詳細信息:
[root@huanqiu_web1?~]#?/usr/sbin/logrotate?-v?/etc/logrotate.conf
[root@huanqiu_web1?~]#?/usr/sbin/logrotate?-v?/etc/logrotate.d/php根據(jù)日志切割設(shè)置進行執(zhí)行,并顯示詳細信息,但是不進行具體操作,debug模式
[root@huanqiu_web1?~]#?/usr/sbin/logrotate?-d?/etc/logrotate.conf
[root@huanqiu_web1?~]#?/usr/sbin/logrotate?-d?/etc/logrotate.d/nginx查看各log文件的具體執(zhí)行情況
[root@fangfull_web1?~]#?cat?/var/lib/logrotate.status2、切割介紹
比如以系統(tǒng)日志/var/log/message做切割來簡單說明下:
第一次執(zhí)行完rotate(輪轉(zhuǎn))之后,原本的messages會變成messages.1,而且會制造一個空的messages給系統(tǒng)來儲存日志;
第二次執(zhí)行之后,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日志!
如果僅設(shè)定保留三個日志(即輪轉(zhuǎn)3次)的話,那么執(zhí)行第三次時,則 messages.3這個檔案就會被刪除,并由后面的較新的保存日志所取代!也就是會保存最新的幾個日志。
日志究竟輪換幾次,這個是根據(jù)配置文件中的dateext 參數(shù)來判定的。
看下logrotate.conf配置:
#?cat?/etc/logrotate.conf
#?底下的設(shè)定是?"logrotate?的默認值"?,如果別的文件設(shè)定了其他的值,
#?就會以其它文件的設(shè)定為主
weekly??????????//默認每一周執(zhí)行一次rotate輪轉(zhuǎn)工作
rotate?4???????//保留多少個日志文件(輪轉(zhuǎn)幾次).默認保留四個.就是指定日志文件刪除之前輪轉(zhuǎn)的次數(shù),0?指沒有備份
create?????????//自動創(chuàng)建新的日志文件,新的日志文件具有和原來的文件相同的權(quán)限;因為日志被改名,因此要創(chuàng)建一個新的來繼續(xù)存儲之前的日志
dateext???????//這個參數(shù)很重要!就是切割后的日志文件以當前日期為格式結(jié)尾,如xxx.log-20131216這樣,如果注釋掉,切割出來是按數(shù)字遞增,即前面說的 xxx.log-1這種格式
compress??????//是否通過gzip壓縮轉(zhuǎn)儲以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行
include?/etc/logrotate.d
#?將?/etc/logrotate.d/?目錄中的所有文件都加載進來
/var/log/wtmp?{?????????????????//僅針對?/var/log/wtmp?所設(shè)定的參數(shù)
monthly????????????????????//每月一次切割,取代默認的一周
minsize?1M??????????????//文件大小超過?1M?后才會切割
create?0664?root?utmp????????????//指定新建的日志文件權(quán)限以及所屬用戶和組
rotate?1????????????????????//只保留一個日志.
}
#?這個?wtmp?可記錄用戶登錄系統(tǒng)及系統(tǒng)重啟的時間
#?因為有 minsize 的參數(shù),因此不見得每個月一定會執(zhí)行一次喔.要看文件大小。由這個文件的設(shè)定可以知道/etc/logrotate.d其實就是由/etc/logrotate.conf 所規(guī)劃出來的目錄,雖然可以將所有的配置都寫入 /etc/logrotate.conf ,但是這樣一來這個文件就實在是太復雜了,尤其是當使用很多的服務在系統(tǒng)上面時, 每個服務都要去修改 /etc/logrotate.conf 的設(shè)定也似乎不太合理了。
所以,如果獨立出來一個目錄,那么每個要切割日志的服務, 就可以獨自成為一個文件,并且放置到 /etc/logrotate.d/ 當中。
其他重要參數(shù)說明:
compress????????????????????????????#通過gzip?壓縮轉(zhuǎn)儲以后的日志
nocompress??????????????????????????#不做gzip壓縮處理
copytruncate ???????????????????????#用于還在打開中的日志文件,把當前日志備份并截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日志數(shù)據(jù)。
nocopytruncate??????????????????????#備份日志文件不過不截斷
create?mode?owner?group?????????????#輪轉(zhuǎn)時指定創(chuàng)建新文件的屬性,如create?0777?nobody?nobody
nocreate????????????????????????????#不建立新的日志文件
delaycompress??????????????????????#和compress?一起使用時,轉(zhuǎn)儲的日志文件到下一次轉(zhuǎn)儲時才壓縮
nodelaycompress ???????????????????#覆蓋 delaycompress 選項,轉(zhuǎn)儲同時壓縮。
missingok??????????????????????????#如果日志丟失,不報錯繼續(xù)滾動下一個日志
errors?address?????????????????????#專儲時的錯誤信息發(fā)送到指定的Email?地址
ifempty ???????????????????????????#即使日志文件為空文件也做輪轉(zhuǎn),這個是logrotate的缺省選項。
notifempty?????????????????????????#當日志文件為空時,不進行輪轉(zhuǎn)
mail?address???????????????????????#把轉(zhuǎn)儲的日志文件發(fā)送到指定的E-mail?地址
nomail?????????????????????????????#轉(zhuǎn)儲時不發(fā)送日志文件
olddir?directory???????????????????#轉(zhuǎn)儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統(tǒng)
noolddir???????????????????????????#轉(zhuǎn)儲后的日志文件和當前日志文件放在同一個目錄下
sharedscripts ?????????????????????#運行postrotate腳本,作用是在所有日志都輪轉(zhuǎn)后統(tǒng)一執(zhí)行一次腳本。如果沒有配置這個,那么每個日志輪轉(zhuǎn)后都會執(zhí)行一次腳本
prerotate ?????????????????????????#在logrotate轉(zhuǎn)儲之前需要執(zhí)行的指令,例如修改文件的屬性等動作;必須獨立成行
postrotate?????????????????????????#在logrotate轉(zhuǎn)儲之后需要執(zhí)行的指令,例如重新啟動?(kill?-HUP)?某個服務!必須獨立成行
daily??????????????????????????????#指定轉(zhuǎn)儲周期為每天
weekly?????????????????????????????#指定轉(zhuǎn)儲周期為每周
monthly????????????????????????????#指定轉(zhuǎn)儲周期為每月
rotate?count???????????????????????#指定日志文件刪除之前轉(zhuǎn)儲的次數(shù),0?指沒有備份,5?指保留5?個備份
dateext????????????????????????????#使用當期日期作為命名格式
dateformat?.%s?????????????????????#配合dateext使用,緊跟在下一行出現(xiàn),定義文件切割后的文件名,必須配合dateext使用,只支持?%Y?%m?%d?%s?這四個參數(shù)
size(或minsize)?log-size???????????#當日志文件到達指定的大小時才轉(zhuǎn)儲,log-size能指定bytes(缺省)及KB?(sizek)或MB(sizem).
當日志文件?>=?log-size?的時候就轉(zhuǎn)儲。?以下為合法格式:(其他格式的單位大小寫沒有試過)
size?=?5?或?size?5?(>=?5?個字節(jié)就轉(zhuǎn)儲)
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
}分享一例曾經(jīng)使用過的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
#創(chuàng)建轉(zhuǎn)儲日志壓縮存放目錄
mkdir?-p?/data/nginx_logs/days
#手工對nginx日志進行切割轉(zhuǎn)換
/usr/sbin/logrotate?-vf?/etc/logrotate.d/nginx
#當前時間
time=$(date?-d?"yesterday"?+"%Y-%m-%d")
#進入轉(zhuǎn)儲日志存放目錄
cd?/data/nginx_logs/days
#對目錄中的轉(zhuǎn)儲日志文件的文件名進行統(tǒng)一轉(zhuǎn)換
for?i?in?$(ls?./?|?grep?"^\(.*\)\.[[:digit:]]$")
do
mv?${i}?./$(echo?${i}|sed?-n?'s/^\(.*\)\.\([[:digit:]]\)$/\1/p')-$(echo?$time)
done
#對轉(zhuǎn)儲的日志文件進行壓縮存放,并刪除原有轉(zhuǎn)儲的日志文件,只保存壓縮后的日志文件。以節(jié)約存儲空間
for?i?in?$(ls?./?|?grep?"^\(.*\)\-\([[:digit:]-]\+\)$")
do
tar?jcvf?${i}.bz2?./${i}
rm?-rf?./${i}
done
#只保留最近7天的壓縮轉(zhuǎn)儲日志文件
find?/data/nginx_logs/days/*?-name?"*.bz2"?-mtime?7?-type?f?-exec?rm?-rf?{}?\;3)crontab定時執(zhí)行
[root@bastion-IDC?~#?crontab?-e
#logrotate
0?0?*?*?*?/bin/bash?-x?/usr/local/sbin/logrotate-nginx.sh?>?/dev/null?2>手動執(zhí)行腳本,測試下看看:
[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.bz2php腳本切割一例:
[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系統(tǒng)日志切割一例
[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-20170115tomcat日志切割一例
[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;ido
mv?${logs_path}${logs_names[i]}.log?${logs_path}$dates/${logs_names[i]}.log
done
#nginx平滑重啟
kill?-USR1?`cat?/letv/logs/nginx/nginx.pid`???????????
結(jié)合crontab定時執(zhí)行
[root@letv-backup?~]#?crontab?-e
#nginx日志切割
00?00?*?*?*?cd?/letv/logs;/bin/bash?/letv/sh/cut_nginx_log.sh?>?/dev/null?2>$13、嘗試解決logrotate無法自動輪詢?nèi)罩镜霓k法
現(xiàn)象說明:
使用logrotate輪詢nginx日志,配置好之后,發(fā)現(xiàn)nginx日志連續(xù)兩天沒被切割,這是為什么呢??
然后開始檢查日志切割的配置文件是否有問題,檢查后確定配置文件一切正常。
于是懷疑是logrotate預定的cron沒執(zhí)行,查看了cron的日志,發(fā)現(xiàn)有一條Dec 7 04:02:01 www crond[18959]: (root) CMD (run-parts /etc/cron.daily)這樣的日志,證明cron在04:02分時已經(jīng)執(zhí)行/etc/cron.daily目錄下的程序。
接著查看/etc /cron.daily/logrotate(這是logrotate自動輪轉(zhuǎn)的腳本)的內(nèi)容:
[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沒有發(fā)現(xiàn)異常,配置好的日志輪轉(zhuǎn)操作都是由這個腳本完成的,一切運行正常,腳本應該就沒問題。
直接執(zhí)行命令:
[root@huanqiu_test?~]#?/usr/sbin/logrotate?/etc/logrotate.conf這些系統(tǒng)日志是正常輪詢了,但nginx日志卻還是沒輪詢。
接著強行啟動記錄文件維護操作,縱使logrotate指令認為沒有需要,應該有可能是logroate認為nginx日志太小,不進行輪詢。
故需要強制輪詢,即在/etc/cron.daily/logrotate腳本中將 -t 參數(shù)替換成 -f 參數(shù)
[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?最后最后重啟下cron服務:
[root@huanqiu_test?~]#?/etc/init.d/crond?restart
Stopping?crond:?[?OK?]
Starting?crond:?[?OK?]
logrotate默認自動切割生效時間
Logrotate是基于CRON來運行的,其腳本是/etc/cron.daily/logrotate,實際運行時,Logrotate會調(diào)用配置文件/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)這個時間段執(zhí)行,/etc/cron.daily是個文件夾
通過默認/etc/anacrontab文件配置,會發(fā)現(xiàn)logrotate自動切割日志文件的默認時間是凌晨3點多。
==================================================================================================
現(xiàn)在需要將切割時間調(diào)整到每天的晚上12點,即每天切割的日志是前一天的0-24點之間的內(nèi)容。
操作如下:
[root@kevin?~]#?mv?/etc/anacrontab?/etc/anacrontab.bak??????????//取消日志自動輪轉(zhuǎn)的設(shè)置
[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
}
結(jié)合crontab進行自定義的定時輪轉(zhuǎn)操作
[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工具實現(xiàn)日志切割之外,還可以編寫python腳本或shell腳本以實現(xiàn)日志切割。下面就簡單列出幾個實例說明下:
一、Python腳本實現(xiàn)日志切割
實例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")
手動執(zhí)行這個腳本:
[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`")
--------------------------------------------------------------------------------------
其他業(yè)務日志的切割腳本跟上面做法相同
二、shell腳本實現(xiàn)日志切割
[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的一個業(yè)務/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
手動執(zhí)行切割:
[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
--------------------------------------------------------------------------------------------------------------
日志壓縮腳本:
[root@localhost?~]#?ls?/var/log/fss/nginx/
nginx.20190506.log??nginx.20190507.log??nginx.20190508.log
[root@localhost?~]#?cat?/root/log_clean.sh
#!/usr/bin/sh
#根據(jù)系統(tǒng)/服務/日志保留天數(shù)三個參數(shù)壓縮日志
#usage:?sh?clearlog.sh?sysname?appname?keepdays
sysName=$1
appName=$2
keepDay=$3
logDir=/var/log/${sysName}/${appName}
logFile=${appName}.*[0-9][0-9].log
cd?${logDir}
find?./?-name?"${logFile}"?-mtime?-${keepDay}?-exec?gzip?{}?\;
[root@localhost?~]#?sh?/root/log_clean.sh?fss?nginx?3
[root@localhost?~]#?ls?/var/log/fss/nginx/
nginx.20190506.log.gz??nginx.20190507.log.gz??nginx.20190508.log.gz
還可以針對日志保留策略,調(diào)整成日志清理腳本。
推薦用的Nginx日志輪轉(zhuǎn)方法? ?[部署在nginx的日志目錄下]
#!/bin/bash
yesterday=`date?-d?"-1?days"?+'%Y%m%d'`
cd?`dirname?$0`
basedir=`pwd`
logdir="${basedir}/bak"
bindir="${basedir%/*}/sbin"
mkdir?-p?${logdir}
for?log?in?`ls?*.log?2>/dev/null`
do
????mv?${log}?${logdir}/${log}.${yesterday}.bak
????#?gzip?${logdir}/${log}.${yesterday}
done
${bindir}/nginx?-s?reload
cd?${logdir}
find?.?-type?f?-name?"*.bak"?-mtime?+7?|?xargs?rm?-f轉(zhuǎn)自:散盡浮華
https://www.cnblogs.com/kevingrace/p/6307298.html

優(yōu)質(zhì)文章,推薦閱讀:

