Linux 日誌切割工具 Logrotate 配置詳解

Logrotate 程序是一個日誌文件管理工具。用於分割日誌文件,壓縮轉存、刪除舊的日誌文件,並創建新的日誌文件,下面就對 logrotate 日誌輪轉的記錄:

1.1 Logrotate 配置文件介紹
Linux 系統默認安裝 logrotate,默認的配置文件:

/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf:爲主配置文件
logrotate.d:爲配置相關子系統,用於隔離每個應用配置(Nginx、PHP、Tomcat...)

Logrotate 是基於 CRON 來運行的,其腳本是 / etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
實際運行時,Logrotate 會調用配置文件 / etc/logrotate.conf。

Logrotate 可以由自動或者手動觸發日誌輪轉:

logrotate -f /etc/logrotate.d/nginx
logrotate -f /etc/logrotate.d/php
不過正式執行前最好通過 Debug 選項來驗證一下(-d 參數)
具體 logrotate 命令格式如下:

logrotate [OPTION...]
-d, --debug :debug 模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日誌後,發送日誌到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程。

1.2 Logrotater 日誌文件切割策略
查看 logrotate.conf 配置:

cat /etc/logrotate.conf
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/ 目錄中的各個應用配置
/var/log/wtmp { // 僅針對 /var/log/wtmp 所設定的參數
monthly // 每月一次切割, 取代默認的一週
minsize 1M // 文件大小超過 1M 後纔會切割
create 0664 root utmp // 指定新建的日誌文件權限以及所屬用戶和組
rotate 1 // 只保留一個日誌.
}

這個 wtmp 可記錄用戶登錄系統及系統重啓的時間

因爲有 minsize 的參數,因此不見得每個月一定會執行一次喔. 要看文件大小。

Logrotate 中其他可配置參數,具體如下:

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 腳本,作用是在所有日誌都輪轉後統一執行一次腳本。如果沒有配置這個,那麼每個日誌輪轉後都會執行一次腳本
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

1.3 NGINX 日誌的配置實例參考:
vim /etc/logrotate.d/nginx
/var/log/weblog/*.log {

daily  //指定轉儲週期爲每天
compress  //通過gzip 壓縮轉儲以後的日誌
rotate 7  //保存7天的日誌
missingok  //如果日誌文件丟失,不要顯示錯誤
notifempty  //當日志文件爲空時,不進行輪轉
dateext  //使用當期日期作爲命名格式,exp: nginx_access.log-20190120
sharedscripts  //運行postrotate腳本
postrotate  //執行的指令
        if [ -f /run/nginx.pid ]; then
                kill -USR1 `cat /run/nginx.pid`
        fi
endscript  //結束指令

}

1.4 PHP-FPM 日誌的配置實例參考:
vim /etc/logrotate.d/nginx
/usr/local/php/var/log/*.log {
daily
compress
rotate 7
missingok
notifempty
dateext
sharedscripts
postrotate

if [ -f /usr/local/php/var/run/php-fpm.pid ]; then
    kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid`
fi

endscript
}

1.5 Logrotater 日誌切割輪詢
由於 Logrotate 是基於 CRON 運行的,所以這個日誌輪轉的時間是由 CRON 控制的,具體可以查詢 CRON 的配置文件 / etc/anacrontab,過往的老版本的文件爲(/etc/crontab)

查看輪轉文件:/etc/anacrontab

cat /etc/anacrontab

SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
RANDOM_DELAY=45
START_HOURS_RANGE=3-22
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

使用 anacrontab 輪轉的配置文件,日誌切割的生效時間是在凌晨 3 點到 22 點之間,而且隨機延遲時間是 45 分鐘,但是這樣配置無法滿足我們在現實中的應用

現在的需求是將切割時間調整到每天的晚上 12 點,即每天切割的日誌是前一天的 0-24 點之間的內容,操作如下:

mv /etc/anacrontab /etc/anacrontab.bak // 取消日誌自動輪轉的設置
使用 crontab 來作爲日誌輪轉的觸發容器來修改 Logrotate 默認執行時間

vi /etc/crontab 
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

run-parts

01 root run-parts /etc/cron.hourly
59 23 * root run-parts /etc/cron.daily
22 4 0 root run-parts /etc/cron.weekly
42 4 1 root run-parts /etc/cron.monthly
1.6 解決 logrotate 無法自動輪詢日誌的辦法
現象說明:
使用 logrotate 輪詢 nginx 日誌,配置好之後,發現 nginx 日誌連續兩天沒被切割,檢查後確定配置文件一切正常,這是爲什麼呢??

強行啓動記錄文件維護操作,縱使 logrotate 指令認爲沒有需要,應該有可能是 logroate 認爲 nginx 日誌太小,不進行輪詢。
故需要強制輪詢,即在 / etc/cron.daily/logrotate 腳本中將 -t 參數替換成 -f 參數

vim /etc/cron.daily/logrotate

!/bin/sh

/usr/sbin/logrotate /etc/logrotate.conf
EXITVALUE=$?
if [$EXITVALUE != 0]; then

/usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"

fi
exit 0
最後最後重啓下 cron 服務:

/etc/init.d/crond restart
Stopping crond: [OK]
Starting crond: [OK]

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://blog.csdn.net/qq_40573385/article/details/108592381