對於Linux系統安全來講,日誌文件是極其重要的工具。不知爲什麼,我發現不少運維同窗的服務器上都運行着一些諸如天天切分Nginx日誌之類的CRON腳本,你們彷佛遺忘了Logrotate,爭相發明本身的輪子,這真是讓人沮喪啊!就比如明明身邊躺着現成的性感美女,你們卻忙着自娛自樂,罪過!logrotate程序是一個日誌文件管理工具。用於分割日誌文件,刪除舊的日誌文件,並建立新的日誌文件,起到「轉儲」做用。能夠節省磁盤空間。下面就對logrotate日誌輪轉操做作一梳理記錄:php
1. 配置文件介紹
Linux系統默認安裝logrotate工具,它默認的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/node
logrotate.conf 才主要的配置文件,logrotate.d 是一個目錄,該目錄裏的全部文件都會被主動的讀入/etc/logrotate.conf中執行。
另外,若是 /etc/logrotate.d/ 裏面的文件中沒有設定一些細節,則會以/etc/logrotate.conf這個文件的設定來做爲默認值。python
Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。
能夠在/etc/logrotate.d目錄裏放置自定義好的配置文件,用來覆蓋Logrotate的缺省值。mysql
[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/nginxnginx
logrotate命令格式:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日誌後,發送日誌到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程。git
根據日誌切割設置進行操做,並顯示詳細信息
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.conf
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -v /etc/logrotate.d/php web
根據日誌切割設置進行執行,並顯示詳細信息,可是不進行具體操做,debug模式
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.conf
[root@huanqiu_web1 ~]# /usr/sbin/logrotate -d /etc/logrotate.d/nginx sql
查看各log文件的具體執行狀況
[root@fangfull_web1 ~]# cat /var/lib/logrotate.status shell
2. 切割介紹
好比以系統日誌/var/log/message作切割來簡單說明下:
第一次執行完rotate(輪轉)以後,本來的messages會變成messages.1,並且會製造一個空的messages給系統來儲存日誌;
第二次執行以後,messages.1會變成messages.2,而messages會變成messages.1,又形成一個空的messages來儲存日誌!
若是僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的保存日誌所取代!也就是會保存最新的幾個日誌。
日誌究竟輪換幾回,這個是根據配置文件中的rotate參數來斷定的。vim
看下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腳本以實現日誌切割。下面就簡單列出幾個實例說明下:
1、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`") -------------------------------------------------------------------------------------- 其餘業務日誌的切割腳本跟上面作法相同
2、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 --------------------------------------------------------------------------------------------------------------
日誌壓縮腳本: [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/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