日誌切分神器–logrotate
概述
還在自己寫定時切分日誌的腳本?試試系統自帶的logrotate工具吧!
logrotate是一個日誌文件管理工具。用於分割日誌文件,刪除舊的日誌文件,並創建新的日誌文件,起到轉儲的作用,便於節省磁碟空間。
配置
配置文件
Linux系統默認安裝logrotate,默認配置文件如下:
- /etc/logrotate.conf:主配置文件,logrotate.d是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執行。
- /etc/logrotate.d/:用於存放不同程式自定義切分配置
運行原理
Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。
實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。可以在/etc/logrotate.d目錄里放置自定義好的配置文件,用來覆蓋Logrotate的預設值。
/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 $EXITVALUE
配置參數說明
配置參數 | 說明 |
---|---|
create | 自動創建新的日誌文件,新的日誌文件具有和原來的文件相同的許可權;因為日誌被改名,因此要創建一個新的來繼續存儲之前的日誌 |
rotate n | 保留多少個日誌文件(輪轉幾次),n可以是0,1,2,3…,如果n為0,則沒有備份。 |
dateext | 就是切割後的日誌文件以當前日期為格式結尾 |
compress | 是否通過gzip壓縮轉儲以後的日誌文件,如xxx.log-20201111.gz |
nocompress | 不做gzip壓縮處理,與compress互斥 |
missingok | 在日誌輪循期間,任何錯誤將被忽略,例如「文件無法找到」之類的錯誤。 |
notifempty | 如果日誌文件為空,輪循不會進行。 |
create 0664 nginx root | 以指定的許可權創建全新的日誌文件,同時logrotate也會重命名原始日誌文件。 |
postrotate | 在所有其它指令完成後,postrotate裡面指定的命令將被執行。 |
lograte命令
語法格式如下:
logrotate [OPTION...] <configfile>
參數說明
參數 | 說明 |
---|---|
-d | debug模式,測試配置文件是否有錯誤。 |
-f | 強制轉儲文件。 |
-m | 壓縮日誌後,發送日誌到指定郵箱。 |
-s | 使用指定的狀態文件。 |
-v | 顯示轉儲過程。 |
案例
以nginx日誌切分為例,創建/etc/logrotate.d/nginx:
/var/log/nginx/*log {
create 0664 nginx root
daily
rotate 10
dateext
missingok
notifempty
compress
sharedscripts
postrotate
/bin/kill -USR1 `cat /run/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
手動強制切分日誌:
/usr/sbin/logrotate -d -f /etc/logrotate.d/nginx
效果如下: