推荐一款日志切割神器,好用到爆!!
點擊上方“朱小廝的博客”,選擇“設為星標”
當當滿200-40元優惠碼「?FV5YSU?」
來源:r6d.cn/QN53
對于 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/nginxlogrotate 命令格式:
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.status2、切割介紹
比如以系統日志/var/log/message做切割來簡單說明下:
第一次執行完rotate(輪轉)之后,原本的messages會變成messages.1,而且會制造一個空的messages給系統來儲存日志;
第二次執行之后,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日志!
如果僅設定保留三個日志(即輪轉3次)的話,那么執行第三次時,則 messages.3這個檔案就會被刪除,并由后面的較新的保存日志所取代!也就是會保存最新的幾個日志。
日志究竟輪換幾次,這個是根據配置文件中的dateext 參數來判定的。
看下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 postrotateif?[?-f?/usr/local/nginx/logs/nginx.pid?];?thenkill?-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>手動執行腳本,測試下看看:
[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?{dailyrotate?365missingoknotifemptycompressdateextsharedscriptspostrotateif?[?-f?/Data/app/php5.6.26/var/run/php-fpm.pid?];?thenkill?-USR1?`cat?/Data/app/php5.6.26/var/run/php-fpm.pid`fiendscriptpostrotate/bin/chmod?644?/Data/logs/php/*gzendscript }[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?{dailyrotate?365missingoknotifemptycompressdateextsharedscriptspostrotate/etc/init.d/nginx?reloadendscript }[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 {sharedscriptspostrotate/bin/kill?-HUP?`cat?/var/run/syslogd.pid?2>?/dev/null`?2>?/dev/null?||?trueendscript }[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;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>$13、嘗試解決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?最后最后重啟下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?0Logrotate是基于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 {sharedscriptscompressrotate?30dailydateextpostrotate/bin/kill?-HUP?`cat?/var/run/syslogd.pid?2>?/dev/null`?2>?/dev/null?||?trueendscript }結合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?pythonimport?datetime,os,sys,shutillog_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:printprint?esys.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?pythonimport?datetime,os,sys,shutillog_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:printprint?esys.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/shfunction?rotate()?{ logs_path=$1echo?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?$* dorotate?$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 -------------------------------------------------------------------------------------------------------------- 日志壓縮腳本: [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 #根據系統/服務/日志保留天數三個參數壓縮日志 #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還可以針對日志保留策略,調整成日志清理腳本。推薦用的Nginx日志輪轉方法? ?[部署在nginx的日志目錄下]
#!/bin/bashyesterday=`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` domv?${log}?${logdir}/${log}.${yesterday}.bak#?gzip?${logdir}/${log}.${yesterday} done${bindir}/nginx?-s?reloadcd?${logdir} find?.?-type?f?-name?"*.bak"?-mtime?+7?|?xargs?rm?-f想知道更多?掃描下面的二維碼關注我
當當雙12圖書優惠活動,活動時間是12月7~13號,力度是5折封頂。
這里有一個滿200-40元優惠碼「?FV5YSU?」
后臺回復"技術",加入技術群
點個贊+在看,少個 bug?????
總結
以上是生活随笔為你收集整理的推荐一款日志切割神器,好用到爆!!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 后悔!我早该把这1W字详解的 InnoD
- 下一篇: 推荐四款可视化工具