拒絕腳本分割日誌,從Logrotate做起


大家可能都有管理日誌的需要,比如定時壓縮日誌,或者當日志超過一定大小時就自動分裂成兩個文件等。之前我都是程序裏面自帶的日誌切割功能去實現,比如說apache,而沒有自帶這種功能的程序則寫一個腳本放在定時任務裏面執行,但後來我發現其實Linux自帶的logrotate命令就能夠實現這樣的功能,所以今天和大家一起探討研究一下這個非常方便的工具。

  簡介

logrotate實用程序旨在簡化系統上日誌文件的管理,從而生成大量日誌文件。 Logrotate允許自動輪換壓縮,刪除和郵寄日誌文件。可以將Logrotate設置爲每天,每週,每月或當日志文件達到特定大小時處理日誌文件。

  安裝方式

yum -y install logrotate

  使用說明

logrotate的配置文件是/etc/logrotate.conf,而/etc/logrotate.d/是用於存儲其他配置文件的目錄。該目錄裏的所有文件都會被主動的讀入 /etc/logrotate.conf中執行。

vim /etc/logrotate.conf
weekly
rotate 4
create
dateext
include /etc/logrotate.d

ls /etc/logrotate.d/
ConsoleKit  dracut  exim  iscsiuiolog  nginx  php-fpm  ppp  syslog  yum

vim /etc/logrotate.d/nginx
/var/log/nginx/*log {     #爲nginx日誌的存儲目錄,可以根據實際情況進行修改
    daily    #日誌文件將按天輪循
    rotate 10    #一次存儲10個日誌文件。對於第11個日誌文件,時間最久的那個日誌文件將被刪除
    missingok    #在日誌輪循期間,任何錯誤將被忽略,例如“文件無法找到”之類的錯誤
    notifempty    #如果是空文件的話,不進行轉儲
    compress    #在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮
    sharedscripts    #運行postrotate腳本,作用是在所有日誌都輪轉後統一執行一次腳本。如果沒有配置這個,那麼每個日誌輪轉後都會執行一次腳本
    postrotate     #在所有其它指令完成後,postrotate和endscript裏面指定的命令將被執行。在這種情況下,rsyslogd進程將立即再次讀取其配置並繼續運行
        /bin/kill -USR1 $(cat /var/run/nginx.pid 2>/dev/null) 2>/dev/null || :
    endscript
}

daily:日誌文件將按天輪循
weekly:日誌文件將按周輪循
monthly:日誌文件將按月輪循
nocompress:不需要壓縮時,用這個參數
copytruncate:用於還在打開中的日誌文件,把當前日誌備份並截斷
nocopytruncate:備份日誌文件但是不截斷
create mode owner group:轉儲文件,使用指定的文件模式創建新的日誌文件
nocreate:不建立新的日誌文件
delaycompress 和 compress 一起使用時,轉儲的日誌文件到下一次轉儲時才壓縮
nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。
size size 當日志文件到達指定的大小時才轉儲,Size 可以指定 bytes (缺省)以及KB (sizek)或者MB (sizem).
dateext:定義日誌文件後綴是日期格式,也就是切割後文件是:xxx.log-20160402.gz這樣的格式。如果該參數被註釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式
delaycompress:總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循週期進行。這在你或任何軟件仍然需要讀取最新歸檔時很有用
create 640 nginx adm:以指定的權限和用書屬性,創建全新的日誌文件,同時logrotate也會重命名原始日誌文件。
rotate count 指定日誌文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

  配置切割時間

logrotate的切割時間默認是在 /etc/anacrontab 裏面配置的,而START_HOURS_RANGE 就是配置的 logrotate 的執行時間

vim /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
# 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

一般使用腳本都是執行完了切割日誌的命令之後是對 nginx 進行平滑重啓,即 reload
下面提供一種新的方法:請在測試環境下測試完成之後在進行生產環境的更改,根據所在環境或者配置不同可能存在差異
向nginx主進程發送USR1信號,重新打開日誌文件,否則會繼續往mv後的文件寫數據的。原因在於:linux系統中,內核是根據文件描述符來找文件的。如果不這樣操作導致日誌切割失敗。
kill -USR1 `ps axu | grep "nginx: master process" | grep -v grep | awk '{print $2}'`


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章