日誌切分神器--logrotate

不羈的羅恩發表於2020-11-14

Blog:部落格園 個人

概述

還在自己寫定時切分日誌的指令碼?試試系統自帶的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

效果如下:

image-20201112110725767

相關文章