logrotate command in Linux

2022-07-21 06:00:12

背景

在生產過程中,由於磁碟空間、保留週期等因素,會對系統、應用等紀錄檔提出要求,要求系統紀錄檔定期進行輪轉、壓縮和刪除,從而減少開銷,而系統自帶的logrotate  則是一個簡單又實用的小工具,下面著重介紹一下,滿足日常需求。

語法

Usage: logrotate [OPTION...] <configfile>  

常用引數 :

-f 非設定週期內強制執行

-d 偵錯,對紀錄檔模擬進行操作

-v 視覺化執行過程結果

其它引數不常用,詳情見下:

[root@test01 ~]# logrotate --help
Usage: logrotate [OPTION...] <configfile>
  -d, --debug               Don't do anything, just test (implies -v)
  -f, --force               Force file rotation
  -m, --mail=command        Command to send mail (instead of `/bin/mail')
  -s, --state=statefile     Path of state file
  -v, --verbose             Display messages during rotation
  -l, --log=STRING          Log file
  --version                 Display version information

Help options:
  -?, --help                Show this help message
  --usage                   Display brief usage message
[root@test01 ~]#

組態檔

logrotate  設定主要有兩個

  • 常規主組態檔地址/etc/logrotate.conf 不建議對其修改
  • 自定義組態檔 /etc/logrotate.d 這裡存放使用者自定義檔案,通常建議將個人檔案放到這裡
[root@test01 ~]# cd /etc/logrotate.d/
[root@test01 logrotate.d]# ll
total 16
-rw-r--r--. 1 root root  91 Aug  6  2019 bootlog
-rw-r--r--. 1 root root 224 Aug  6  2019 syslog
-rw-r--r--. 1 root root 100 Oct 31  2018 wpa_supplicant
-rw-r--r--. 1 root root 103 Aug  8  2019 yum
[root@test01 logrotate.d]#

為保證 /etc/logrotate.d 定義的檔案能夠執行生效,需要確保 /etc/logrotate.conf 這句話沒有註釋,如有註釋,需手動取消:

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

組態檔demo及引數

以下是我個人一個組態檔,可以直接拿來結合自己需求進行修改:

/var/log/linuxserver/linux.log {
        rotate 7
        size 200M
        daily
        compress
        delaycompress
        missingok
        notifempty
        noolddir
        copytruncate   
        dateext                  
        dateformat .%s
        create 660 root root
}

 檔案格式主要是以紀錄檔路徑和紀錄檔切割引陣列成:

第一行:指明 需要進行切割的紀錄檔路徑,可以結合正規表示式,例如 /path/*.log ,指定路徑下所有的紀錄檔

第二行:以{ } 包含logrotate 所需要的引數,demo包含了基本常用到的幾個引數,此外還有如下部分引數,引數含義如下:

# 紀錄檔壓縮引數 
compress                 通過gzip 壓縮轉儲以後的紀錄檔
delaycompress            和compress 一起使用時,轉儲的紀錄檔檔案到下一次轉儲時才壓縮
nodelaycompress          覆蓋 delaycompress 選項,轉儲同時壓縮
nocompress               不做gzip壓縮處理
# 對截斷後的紀錄檔處理引數
copytruncate             用於還在開啟中的紀錄檔檔案,把當前紀錄檔備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分紀錄檔資料。
nocopytruncate           備份紀錄檔檔案不過不截斷
create mode owner group  輪轉時指定建立新檔案的屬性,如create 0777 nobody nobody
nocreate                 不建立新的紀錄檔檔案
dateext                  使用當期日期作為命名格式
dateformat .%s           配合dateext使用,緊跟在下一行出現,定義檔案切割後的檔名,必須配合dateext使用,只支援 %Y %m %d %s 這四個引數
# 基本引數
missingok                如果紀錄檔丟失,不報錯繼續捲動下一個紀錄檔
errors address           專儲時的錯誤資訊傳送到指定的Email 地址
ifempty                  即使紀錄檔檔案為空檔案也做輪轉,這個是logrotate的預設選項。
notifempty               當紀錄檔檔案為空時,不進行輪轉
mail address             把轉儲的紀錄檔檔案傳送到指定的E-mail 地址
nomail                   轉儲時不傳送紀錄檔檔案
# 舊紀錄檔存放引數
olddir directory         轉儲後的紀錄檔檔案放入指定的目錄,必須和當前紀錄檔檔案在同一個檔案系統
noolddir                 轉儲後的紀錄檔檔案和當前紀錄檔檔案放在同一個目錄下
# logrotate 執行前後勾點引數
sharedscripts            執行postrotate指令碼,作用是在所有紀錄檔都輪轉後統一執行一次指令碼。如果沒有設定這個,那麼每個紀錄檔輪轉後都會執行一次指令碼
prerotate                在logrotate轉儲之前需要執行的指令,例如修改檔案的屬性等動作;必須獨立成行
postrotate               在logrotate轉儲之後需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
# 執行週期引數
daily                    指定轉儲週期為每天
weekly                   指定轉儲週期為每週
monthly                  指定轉儲週期為每月
# logrotate 觸發條件引數
rotate count             指定紀錄檔檔案刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
size(或minsize) log-size 當紀錄檔檔案到達指定的大小M、G時才轉儲

執行觸發時間

logrotate 預設走的是crond 服務 ,執行語句指令碼存放在/etc/cron.daily/ 目錄下,主要指令碼:/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

預設觸發時間組態檔存在 /etc/anacrontab ,預設執行時間 每日3.45-22.45 時間段隨機執行一次。缺點是具體執行時間不容易掌握,通常不建議使用者對該檔案進行修改,如果需要定期執行,建議使用者可以在vim /etc/crontabcrontab  -e 按照crond 格式設定執行時間,以便更好的分配指令碼執行時間,避免機器資源集中使用,減少機器負載。