1. 程式人生 > >linux使用logrotate工具管理日誌輪替

linux使用logrotate工具管理日誌輪替

對於Linux系統安全來說,日誌檔案是極其重要的工具。logrotate程式是一個日誌檔案管理工具。用於分割日誌檔案,刪除舊的日誌檔案,並建立新的日誌檔案,起到“轉儲”作用。可以節省磁碟空間。

配置檔案介紹

Linux系統預設安裝logrotate工具,它預設的配置檔案在:
/etc/logrotate.conf
/etc/logrotate.d/

logrotate.conf 才主要的配置檔案,logrotate.d 是一個目錄,該目錄裡的所有檔案都會被主動的讀入/etc/logrotate.conf中執行。
另外,如果 /etc/logrotate.d/ 裡面的檔案中沒有設定一些細節,則以/etc/logrotate.conf這個檔案的設定來作為預設值。

Logrotate是基於CRON來執行的,其指令碼是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
實際執行時,Logrotate會呼叫配置檔案/etc/logrotate.conf。
可以在/etc/logrotate.d目錄裡放置自定義好的配置檔案,用來覆蓋Logrotate的預設值。

vim /etc/cron.daily/logrotate

#!/bin/sh

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0

如果想手動強制切割日誌,需要加-f引數;不過正式執行前最好通過Debug選項來驗證一下(-d引數),這對除錯也很重要

# /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 :強制轉儲檔案。
-m, --mail=command :壓縮日誌後,傳送日誌到指定郵箱。
-s, --state=statefile :使用指定的狀態檔案。
-v, --verbose :顯示轉儲過程。

根據日誌切割設定進行操作,並顯示詳細資訊

# /usr/sbin/logrotate -v /etc/logrotate.conf
# /usr/sbin/logrotate -v /etc/logrotate.d/php

根據日誌切割設定進行執行,並顯示詳細資訊,但是不進行具體操作,debug模式

# /usr/sbin/logrotate -d /etc/logrotate.conf
# /usr/sbin/logrotate -d /etc/logrotate.d/nginx

檢視各log檔案的具體執行情況

# cat /var/lib/logrotate.status

切割介紹

比如以系統日誌/var/log/message做切割來簡單說明下:
第一次執行完rotate(輪轉)之後,原本的messages會變成messages.1,而且會製造一個空的messages給系統來儲存日誌;

第二次執行之後,messages.1會變成messages.2,而messages會變成messages.1,又造成一個空的messages來儲存日誌!

如果僅設定保留三個日誌(即輪轉3次)的話,那麼執行第三次時,則 messages.3這個檔案就會被刪除,並由後面的較新的儲存日誌所取代!也就是會儲存最新的幾個日誌。

日誌究竟輪換幾次,這個是根據配置檔案中的dateext 引數來判定的。

logrotate.conf配置:
# cat /etc/logrotate.conf
# 底下的設定是 "logrotate 的預設值" ,如果別的檔案設定了其他的值,
# 就會以其它檔案的設定為主
weekly //預設每一週執行一次rotate輪轉工作
rotate 4 //保留多少個日誌檔案(輪轉幾次).預設保留四個.就是指定日誌檔案刪除之前輪轉的次數,0 指沒有備份
create //自動建立新的日誌檔案,新的日誌檔案具有和原來的檔案相同的許可權;因為日誌被改名,因此要建立一個新的來繼續儲存之前的日誌
dateext //這個引數很重要!就是切割後的日誌檔案以當前日期為格式結尾,如xxx.log-20131216這樣,如果註釋掉,切割出來是按數字遞增,即前面說的 xxx.log-1這種格式
compress //是否通過gzip壓縮轉儲以後的日誌檔案,如xxx.log-20131216.gz ;如果不需要壓縮,註釋掉就行

include /etc/logrotate.d
# 將 /etc/logrotate.d/ 目錄中的所有檔案都載入進來
# 這個 wtmp 可記錄使用者登入系統及系統重啟的時間
# 因為有 minsize 的引數,因此不見得每個月一定會執行一次喔.要看檔案大小。

/var/log/wtmp { //僅針對 /var/log/wtmp 所設定的引數
monthly //每月一次切割,取代預設的一週
minsize 1M //檔案大小超過 1M 後才會切割
create 0664 root utmp //指定新建的日誌檔案許可權以及所屬使用者和組
rotate 1 //只保留一個日誌.
}
nginx輪替配置檔案

/data/wwwlogs/*nginx.log { # 指定日誌檔案目錄和檔案
daily # 每天輪替
rotate 5 # 保留五份
missingok # 如果日誌丟失,不報錯繼續滾動下一個日誌
dateext # 使用當期日期作為命名格式
compress # 通過gzip 壓縮轉儲以後的日誌
notifempty # 當日志文件為空時不進行輪替
sharedscripts # 所有日誌輪替完成後,執行postrotate命令
postrotate # 輪替後執行命令
[ -e /var/run/nginx.pid ] && kill -USR1 cat /var/run/nginx.pid
endscript
}

系統日誌的輪替配置檔案
vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
sharedscripts
dateext
rotate 25
size 40M
compress
dateformat -%Y%m%d%s
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}

其他引數說明

compress 通過gzip 壓縮轉儲以後的日誌
nocompress 不做gzip壓縮處理
copytruncate 用於還在開啟中的日誌檔案,把當前日誌備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日誌資料。
nocopytruncate 備份日誌檔案不過不截斷
create mode owner group 輪轉時指定建立新檔案的屬性,如create 0777 nobody nobody
nocreate 不建立新的日誌檔案
delaycompress 和compress 一起使用時,轉儲的日誌檔案到下一次轉儲時才壓縮
nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。
missingok 如果日誌丟失,不報錯繼續滾動下一個日誌
errors address 專儲時的錯誤資訊傳送到指定的Email 地址
ifempty 即使日誌檔案為空檔案也做輪轉,這個是logrotate的預設選項。
notifempty 當日志文件為空時,不進行輪轉
mail address 把轉儲的日誌檔案傳送到指定的E-mail 地址
nomail 轉儲時不傳送日誌檔案
olddir directory 轉儲後的日誌檔案放入指定的目錄,必須和當前日誌檔案在同一個檔案系統
noolddir 轉儲後的日誌檔案和當前日誌檔案放在同一個目錄下
sharedscripts 執行postrotate指令碼,作用是在所有日誌都輪轉後統一執行一次指令碼。如果沒有配置這個,那麼每個日誌輪轉後都會執行一次指令碼

這裡很重要,假如nginx有多個虛擬主機,有多個日誌,就需要使用這個引數,因為第一個日誌輪替後,就重新整理新日誌,那麼所有的虛擬主機的日誌都會重新整理,後面的輪替就會是失敗

prerotate 在logrotate轉儲之前需要執行的指令,例如修改檔案的屬性等動作;必須獨立成行
postrotate 在logrotate轉儲之後需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
daily 指定轉儲週期為每天
weekly 指定轉儲週期為每週
monthly 指定轉儲週期為每月
rotate count 指定日誌檔案刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
dateext 使用當期日期作為命名格式
dateformat .%s 配合dateext使用,緊跟在下一行出現,定義檔案切割後的檔名,必須配合dateext使用,只支援 %Y %m %d %s 這四個引數
size(或minsize) log-size 當日志文件到達指定的大小時才轉儲,log-size能指定bytes(預設)及KB (sizek)或MB(sizem).
當日志文件 >= log-size 的時候就轉儲。
以下為合法格式:
size = 5 或 size 5 (>= 5 個位元組就轉儲)
size = 100k 或 size 100k
size = 100M 或 size 100M