Nginx日誌切割之Logrotate篇

  不論是什麼日誌文件,都是會愈來愈大的,大到必定程度就是個可怕的事情了,因此要及早的作處理,方法之一就是按時間段來存儲,不過linux系統提供了Logrotate的日誌管理工具,很好用,不用寫計劃任務腳本了,不過弊端是轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件再同一個系統,下面是摘錄別人的。記錄下以備不時之需。node

 

      Logrotate是Linux下一款日誌管理工具,可用於日誌文件的轉儲(即刪除舊日誌文件,建立新日誌文件)。能夠根據日誌大小或者按照某時段間隔來轉儲,內部使用cron程序來執行。Logrotate還能夠在壓縮日誌,併發送到指定E-mail。linux

      Logrotate默認配置文件是/etc/logrotate.conf,其中第一行是:nginx

include /etc/logrotate.d

 

說明包含了該目錄下的配置,普通用戶的配置也在這裏,好比nginx日誌切割 /etc/logrotate.d/nginx。Logrotate有許多可配置參數,也可以使用man命令來查詢:apache

compress                        經過gzip壓縮轉儲之後的日誌
nocompress                      不壓縮
copytruncate                    用於還在打開中的日誌文件,把當前日誌備份並截斷
nocopytruncate                  備份日誌文件可是不截斷
create mode owner group         轉儲文件,使用指定的文件模式建立新的日誌文件
nocreate                        不創建新的日誌文件
delaycompress 和 compress        一塊兒使用時,轉儲的日誌文件到下一次轉儲時才壓縮
nodelaycompress                 覆蓋 delaycompress 選項,轉儲同時壓縮。
errors address                   專儲時的錯誤信息發送到指定的Email 地址
ifempty                         即便是空文件也轉儲,這個是 logrotate 的缺省選項。
notifempty                      若是是空文件的話,不轉儲
mail address                    把轉儲的日誌文件發送到指定的E-mail 地址
nomail                          轉儲時不發送日誌文件
olddir directory                轉儲後的日誌文件放入指定的目錄,必須和當前日誌文件在同一個文件系統
noolddir                        轉儲後的日誌文件和當前日誌文件放在同一個目錄下
prerotate/endscript             在轉儲之前須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
postrotate/endscript            在轉儲之後須要執行的命令能夠放入這個對,這兩個關鍵字必須單獨成行
daily                           指定轉儲週期爲天天
weekly                          指定轉儲週期爲每週
monthly                         指定轉儲週期爲每個月
rotate count                    指定日誌文件刪除以前轉儲的次數,0 指沒有備份,5 指保留5 個備份
tabootext [+] list 讓logrotate   不轉儲指定擴展名的文件,缺省的擴展名是:.rpm-orig, .rpmsave, v, 和 ~ 
size size                       當日志文件到達指定的大小時才轉儲,bytes(缺省)及KB(sizek)或MB(sizem)
 

先看看centOS安裝後的logrotate.conf部份內容:併發

/var/log/wtmp {             //用戶登陸和持續時間日誌
    monthly                 //按周切割
    minsize 1M              //最小達到1M
    create 0664 root utmp   //切割後日志文件屬性
    rotate 1                //保留副本
}

 

簡單明瞭。如您所料,include能夠批量指定配置文件,典型應用都包含在/etc/logrotate.d/目錄下,有:apache、linuxconf、syslog等。注意:include引入配置會覆蓋同名默認配置工具

若干要點:
  1. 每一個部分首括號可與其餘語句同行,尾行括號必須單獨成行
  2. prerotate和postrotate可指定轉儲先後(即切割先後)執行的linux腳本(endscript結束),如post

    /var/log/messages { 
        prerotate                               //轉儲以前腳本
        /usr/bin/chattr -a /var/log/messages    //去掉該文件-a屬性
        endscript                               //腳本結束
        postrotate                              //轉儲後腳本
        /usr/bin/kill -HUP syslogd              //從新初始化系統日誌守護程序 syslogd
        /usr/bin/chattr +a /var/log/messages    //添加-a屬性,防止文件被覆蓋
        endscript
    }

     

  3. Logrotate的備份策略(以兩個備份來講明,即rotate 2,文件error.log):原始文件error.log,通過一次轉儲,會生成error.log.1;第二次轉儲,生成error.log.2;第三次轉儲,error.log.n命名爲error.log.n+1,同時生成新的error.log.1,刪除error.log.n+1文件。測試

  4. 轉儲能夠經過強制執行來觀察工做過程spa

    logrotate -vf /etc/logrotate.d/nginx
     
  5. 日誌切割的執行時間是由cron程配置決定的,可查看/etc/crontab文件(cron時間戳格式:分時日月周), 個人測試:針對10.47.*.*上的nginx日誌進行按日切割,配置以下(/etc/logrotate.d/nginx文件):
  6. /var/log/nginx/*.log {      //注意:具體請以本身的nginx日誌爲準
        daily                   //天天切割
        dateext                 //%Y%m%d做爲後綴
        missingok               //日誌不存在,分析下一個
        rotate 2                //保留兩個備份
        compress                //轉儲以後壓縮.tar.gz
        notifempty              //空文件不轉儲
        create 640 nginx adm    //新日誌文件模式
        sharedscripts           //整個日誌組運行一次的腳本
        postrotate
                [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
                                //重啓nginx,從新加載日誌文件,防止不寫
                `cp -f /var/log/nginx/*.* /var/log/nginx/backup`
                                //自定義腳本,將舊日誌copy到backup文件夾(backup要存在)
        endscript
    }

     

  7.  默認logrotate是經過crontab按期執行的,咱們也能夠手動執行查看結果:日誌

    # logrotate -vf /data/log/nginx/access.log

    驗證是否執行,查看cron的日誌便可

    # grep logrotate /var/log/cron
  8. 使用logrotate管理nginx的日誌,優勢在於:

    1、不須要擔憂日誌文件會將目錄塞滿,logrotate會保留特定個數文件;
    
    2、天天的日誌放在一個文件中,不須要一直往前翻,方便查閱;
相關文章
相關標籤/搜索