<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 詳解

          共 33011字,需瀏覽 67分鐘

           ·

          2021-08-18 21:57

          點擊上方“程序員大白”,選擇“星標”公眾號

          重磅干貨,第一時間送達

          轉(zhuǎn)自:散盡浮華

          鏈接:http://r6e.cn/hnjF

          對于 Linux 系統(tǒng)安全來說,日志文件是極其重要的工具。不知為何,我發(fā)現(xiàn)很多運維同學的服務(wù)器上都運行著一些諸如每天切分 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...] <configfile>
          -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 ,但是這樣一來這個文件就實在是太復(fù)雜了,尤其是當使用很多的服務(wù)在系統(tǒng)上面時, 每個服務(wù)都要去修改 /etc/logrotate.conf 的設(shè)定也似乎不太合理了。

          所以,如果獨立出來一個目錄,那么每個要切割日志的服務(wù), 就可以獨自成為一個文件,并且放置到 /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) 某個服務(wù)!必須獨立成行
          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/null2> /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`           

          結(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預(yù)定的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)操作都是由這個腳本完成的,一切運行正常,腳本應(yīng)該就沒問題。

          直接執(zhí)行命令:

          [root@huanqiu_test ~]# /usr/sbin/logrotate /etc/logrotate.conf

          這些系統(tǒng)日志是正常輪詢了,但nginx日志卻還是沒輪詢。

          接著強行啟動記錄文件維護操作,縱使logrotate指令認為沒有需要,應(yīng)該有可能是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服務(wù):

          [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

          然后做每日的定時切割任務(wù):
          [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è)務(wù)日志的切割腳本跟上面做法相同

          二、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

          --------------------------------------------------------------------------------------------------------------
          每天定時切割日志的任務(wù)制定(比如對python的一個業(yè)務(wù)/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)/服務(wù)/日志保留天數(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

          “拍一拍” 能撤回了 ?。。?/a>

          5款Chrome插件,第1款絕對良心!

          為開發(fā)色情游戲,這家公司赴日尋找AV女優(yōu)拍攝,期望暴力賺錢結(jié)果...

          拼多多終于釀成慘劇

          華為阿里下班時間曝光:所有的光鮮,都有加班的味道


          關(guān)


          ,,西,質(zhì),結(jié),關(guān)[],!


          瀏覽 65
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  亚洲成人视频免费观看 | 免费看成人做爰视频 | 黄片大全 byrwqs41.xyz | 一本色道久久 | 丰满老妇高潮一级A片 |