<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Linux 日志切割神器 Logrotate 原理和配置詳解(附多生產(chǎn)實例)

          共 18734字,需瀏覽 38分鐘

           ·

          2020-10-13 08:02

          ??Python貓” ,一個值得加星標的公眾號

          花下貓語:最近看群里有聊到日志切割的話題,我特找了一篇文章分享,希望對其他同學也有幫助。PS:后臺回復“交流群”,獲取加群方式~

          劇照 | 《鬼滅之刃》

          對于 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/nginx


          logrotate 命令格式:


          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.status


          2、切割介紹


          比如以系統(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.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


          系統(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-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;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>$1


          3、嘗試解決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ì)文章,推薦閱讀:

          Python 為什么不支持 switch 語句?

          同步與異步 Python 有何不同?

          Python初學者的自我修養(yǎng),找到自己的方向

          群友原創(chuàng):萬字長文入門 Pytorch 深度學習框架

          感謝創(chuàng)作者的好文
          瀏覽 50
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91福利网站 | 美女插穴 | 国产乱伦一区二区三区 | 国产91人妻精 | 大香蕉网伊人在线 |