1. 程式人生 > 其它 >Linux日誌切割Logrotate

Linux日誌切割Logrotate

1、關於日誌切割

  日誌檔案包含了關於系統中發生的事件的有用資訊,在排障過程中或者系統性能分析時經常被用到。對於忙碌的伺服器,日誌檔案大小會增長極快,伺服器會很快消耗磁碟空間,這成了個問題。除此之外,處理一個單個的龐大日誌檔案也常常是件十分棘手的事。
  logrotate是個十分有用的工具,它可以自動對日誌進行截斷(或輪循)、壓縮以及刪除舊的日誌檔案。例如,你可以設定logrotate,讓/var/log/foo日誌檔案每30天輪循,並刪除超過6個月的日誌。配置完後,logrotate的運作完全自動化,不必進行任何進一步的人為干預。

2、安裝logrotate

系統版本說明

[root@clsn6 ~]#
cat /etc/redhat-release CentOS release 6.9 (Final) [root@clsn6 ~]# uname -r 2.6.32-696.el6.x86_64

  預設centos系統安裝自帶logrotate,安裝方法如下

yum -y install logrotate crontabs 

軟體包資訊說明

[root@clsn6 ~]# rpm -ql  logrotate
/etc/cron.daily/logrotate
/etc/logrotate.conf  # 主配置檔案
/etc/logrotate.d   # 配置目錄

  logrotate的配置檔案是/etc/logrotate.conf,通常不需要對它進行修改。日誌檔案的輪循設定在獨立的配置檔案中,它(們)放在/etc/logrotate.d/目錄下。

3、實踐配置logrotate

3.1 測試logrotate如何管理日誌

  這裡我們將建立一個10MB的日誌檔案/var/log/log-file。我們將展示怎樣使用logrotate來管理該日誌檔案。

我們從建立一個日誌檔案開始吧,然後在其中填入一個10MB的隨機位元流資料檔案。

[root@clsn6 ~]# touch /var/log/log-file
[root@clsn6 ~]# head -c 10M < /dev/urandom > /var/log/log-file 

  由於現在日誌檔案已經準備好,我們將配置logrotate來輪循該日誌檔案。讓我們為該檔案建立一個配置檔案。

[root@clsn6 ~]#
vim /etc/logrotate.d/log-file /var/log/log-file { monthly rotate 5 compress delaycompress missingok notifempty create 644 root root postrotate /usr/bin/killall -HUP rsyslogd endscript }
  上面的模板是通用的,而配置引數則根據你的需求進行調整,不是所有的引數都是必要的。也可以通過man手冊中的例子進行配置。

3.2配置檔案說明

配置引數

說明

monthly

日誌檔案將按月輪循。其它可用值為'daily''weekly'或者'yearly'

rotate 5

一次將儲存5個歸檔日誌。對於第六個歸檔,時間最久的歸檔將被刪除。

compress

在輪循任務完成後,已輪循的歸檔將使用gzip進行壓縮。

delaycompress

總是與compress選項一起用,delaycompress選項指示logrotate不要將最近的歸檔壓縮,壓縮將在下一次輪循週期進行。這在你或任何軟體仍然需要讀取最新歸檔時很有用。

missingok

在日誌輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤。

notifempty

如果日誌檔案為空,輪循不會進行。

create 644 root root

以指定的許可權建立全新的日誌檔案,同時logrotate也會重新命名原始日誌檔案。

postrotate/endscript

在所有其它指令完成後,postrotateendscript裡面指定的命令將被執行。在這種情況下,rsyslogd 程序將立即再次讀取其配置並繼續執行。

以上資訊來源 "man logrotate"

3.3手動執行logrotate

  logrotate可以在任何時候從命令列手動呼叫。要呼叫為/etc/lograte.d/下配置的所有日誌呼叫logrotate:

[root@clsn6 ~]# logrotate /etc/logrotate.conf

要為某個特定的配置呼叫logrotate,執行一次切割任務測試

[root@clsn6 ~]# ll /var/log/log-file 
-rw-r--r-- 1 root root 10485760 Feb  7 18:50 /var/log/log-file
[root@clsn6 ~]# logrotate -vf /etc/logrotate.d/log-file 
[root@clsn6 ~]# ll /var/log/log-file* 
-rw-r--r-- 1 root root        0 Feb  7 19:17 /var/log/log-file
-rw-r--r-- 1 root root 10485760 Feb  7 18:50 /var/log/log-file.1

  即使輪循條件沒有滿足,我們也可以通過使用‘-f’選項來強制logrotate輪循日誌檔案,‘-v’引數提供了詳細的輸出。

3.4Logrotate的記錄日誌

  logrotate自身的日誌通常存放於/var/lib/logrotate/status目錄。如果處於排障目的,我們想要logrotate記錄到任何指定的檔案,我們可以指定像下面這樣從命令列指定。

[root@clsn6 ~]# logrotate -vf -s /var/log/logrotate-status /etc/logrotate.d/log-file
reading config file /etc/logrotate.d/log-file
reading config info for /var/log/log-file 

Handling 1 logs

rotating pattern: /var/log/log-file forced from command line (5 rotations)
empty log files are
not rotated, old logs are removed
considering log
/var/log/log-file
log does
not need rotating
not running postrotate script, since no logs were rotated

3.5 Logrotate定時任務

  logrotate需要的cron任務應該在安裝時就自動建立了,我把cron檔案的內容貼出來,以供大家參考。

[root@clsn6 ~]# 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

4、logrotate生產應用

4.1為nginx設定日誌切割

  防止訪問日誌檔案過大

[root@clsn nginx]# cat /etc/logrotate.d/nginx 
/var/log/nginx/*.log {
    daily
    rotate 5
    missingok
    notifempty
    create 644 www www
    postrotate
      if [ -f /application/nginx/logs/nginx.pid ]; then
          kill -USR1 `cat /application/nginx/logs/nginx.pid`
      fi
endscript
}

  logrotate工具對於防止因龐大的日誌檔案而耗盡儲存空間是十分有用的。配置完畢後,程序是全自動的,可以長時間在不需要人為干預下執行。本教程重點關注幾個使用logrotate的幾個基本樣例,你也可以定製它以滿足你的需求。

  對於其他服務日誌切割後續補充

5、附錄

5.1關於USR1訊號解釋

  摘自: http://www.xuebuyuan.com/323422.html

USR1亦通常被用來告知應用程式過載配置檔案;例如,向Apache HTTP伺服器傳送一個USR1訊號將導致以下步驟的發生:停止接受新的連線,等待當前連線停止,重新載入配置檔案,重新開啟日誌檔案,重啟伺服器,從而實現相對平滑的不關機的更改。內容摘自wiki:http://zh.wikipedia.org/wiki/SIGUSR1%E5%92%8CSIGUSR2  

  對於USR1和2都可以使用者自定義的,在POSIX相容的平臺上,SIGUSR1和SIGUSR2是傳送給一個程序的訊號,它表示了使用者定義的情況。它們的符號常量在標頭檔案signal.h中定義。在不同的平臺上,訊號的編號可能發生變化,因此需要使用符號名稱。

kill -HUP pid 或者 killall -HUP pName:

  其中pid是程序標識,pName是程序的名稱。
  如果想要更改配置而不需停止並重新啟動服務,可以使用上面兩個命令。在對配置檔案作必要的更改後,發出該命令以動態更新服務配置。根據約定,當你傳送一個掛起訊號(訊號1或HUP)時,大多數伺服器程序(所有常用的程序)都會進行復位操作並重新載入它們的配置檔案。

5.2常見配置引數小結

配置引數

說明

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

在轉儲以前需要執行的命令可以放入這個對,這兩個關鍵字必須單獨成行

daily

指定轉儲週期為每天

weekly

指定轉儲週期為每週

monthly

指定轉儲週期為每月

rotate count

指定日誌檔案刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份

tabooext [+] list

logrotate不轉儲指定副檔名的檔案,預設的副檔名是:.rpm-orig, .rpmsave, v, ~

size size

當日志文件到達指定的大小時才轉儲,bytes(預設)KB(sizek)MB(sizem)

missingok

在日誌輪循期間,任何錯誤將被忽略,例如“檔案無法找到”之類的錯誤。

6、參考文獻

[1]https://linux.cn/article-4126-1.html
[2]http://xmodulo.com/2014/09/logrotate-manage-log-files-linux.html
[3]http://blog.csdn.net/fuming0210sc/article/details/50906372
[4]http://blog.csdn.net/forthemyth/article/details/44062529
[5]https://www.cnblogs.com/clsn/p/8428257.html