在 Linux 系統中手動捲動紀錄檔

2020-03-25 22:40:00

紀錄檔卷動log rotation在 Linux 系統上是再常見不過的一個功能了,它為系統監控和故障排查保留必要的紀錄檔內容,同時又防止過多的紀錄檔造成單個紀錄檔檔案太大。

紀錄檔卷動的過程是這樣的:在一組紀錄檔檔案之中,編號最大的(最舊的)一個紀錄檔檔案會被刪除,其餘的紀錄檔檔案編號則依次增大並取代較舊的紀錄檔檔案,而較新的檔案則取代它作為當前的紀錄檔檔案。這一個過程很容易就可以實現自動化,在細節上還能按需作出微調。

使用 logrotate 命令可以手動執行紀錄檔卷動的操作。本文將要介紹的就是手動進行紀錄檔卷動的方法,以及預期產生的結果。

文中出現的範例適用於 Ubuntu 等 Linux 系統,對於其它型別的系統,紀錄檔檔案和組態檔可能會有所不同,但紀錄檔卷動的過程是大同小異的。

為什麼需要捲動紀錄檔

一般情況下,無需手動旋轉紀錄檔檔案。Linux 系統會每隔一天(或間隔更長的時間)或根據紀錄檔檔案的大小自動進行一次紀錄檔卷動。如果你需要捲動紀錄檔以釋放儲存空間,又或者將某一部分紀錄檔從當前的活動中分割出來,這很容易做到,具體要取決於檔案卷動規則。

一點背景介紹

在 Linux 系統安裝完成後就已經有很多紀錄檔檔案被納入到紀錄檔卷動的範圍內了。另外,一些應用程式在安裝時也會為自己產生的紀錄檔檔案設定捲動規則。一般來說,紀錄檔卷動的組態檔會放置在 /etc/logrotate.d。如果你想了解紀錄檔卷動的詳細實現,可以參考這篇以前的文章

在紀錄檔卷動的過程中,活動紀錄檔會以一個新名稱命名,例如 log.1,之前被命名為 log.1 的檔案則會被重新命名為 log.2,依此類推。在這一組檔案中,最舊的紀錄檔檔案(假如名為 log.7)會從系統中刪除。紀錄檔卷動時檔案的命名方式、保留紀錄檔檔案的數量等引數是由 /etc/logrotate.d 目錄中的組態檔決定的,因此你可能會看到有些紀錄檔檔案只保留少數幾次捲動,而有些紀錄檔檔案的捲動次數會到 7 次或更多。

例如 syslog 在經過紀錄檔卷動之後可能會如下所示(注意,行尾的注釋部分只是說明捲動過程是如何對檔名產生影響的):

$ ls -l /var/log/syslog*-rw-r----- 1 syslog adm  128674 Mar 10 08:00 /var/log/syslog      <== 新檔案-rw-r----- 1 syslog adm 2405968 Mar  9 16:09 /var/log/syslog.1    <== 之前的 syslog-rw-r----- 1 syslog adm  206451 Mar  9 00:00 /var/log/syslog.2.gz <== 之前的 syslog.1-rw-r----- 1 syslog adm  216852 Mar  8 00:00 /var/log/syslog.3.gz <== 之前的 syslog.2.gz-rw-r----- 1 syslog adm  212889 Mar  7 00:00 /var/log/syslog.4.gz <== 之前的 syslog.3.gz-rw-r----- 1 syslog adm  219106 Mar  6 00:00 /var/log/syslog.5.gz <== 之前的 syslog.4.gz-rw-r----- 1 syslog adm  218596 Mar  5 00:00 /var/log/syslog.6.gz <== 之前的 syslog.5.gz-rw-r----- 1 syslog adm  211074 Mar  4 00:00 /var/log/syslog.7.gz <== 之前的 syslog.6.gz

你可能會發現,除了當前活動的紀錄檔和最新一次捲動的紀錄檔檔案之外,其餘的檔案都已經被壓縮以節省儲存空間。這樣設計的原因是大部分系統管理員都只需要查閱最新的紀錄檔檔案,其餘的紀錄檔檔案壓縮起來,需要的時候可以解壓查閱,這是一個很好的折中方案。

手動紀錄檔卷動

你可以這樣執行 logrotate 命令進行手動紀錄檔卷動:

$ sudo logrotate -f /etc/logrotate.d/rsyslog

值得一提的是,logrotate 命令使用 /etc/logrotate.d/rsyslog 這個組態檔,並通過了 -f 引數實行“強制捲動”。因此,整個過程將會是:

  • 刪除 syslog.7.gz
  • 將原來的 syslog.6.gz 命名為 syslog.7.gz
  • 將原來的 syslog.5.gz 命名為 syslog.6.gz
  • 將原來的 syslog.4.gz 命名為 syslog.5.gz
  • 將原來的 syslog.3.gz 命名為 syslog.4.gz
  • 將原來的 syslog.2.gz 命名為 syslog.3.gz
  • 將原來的 syslog.1.gz 命名為 syslog.2.gz
  • 但新的 syslog 檔案不一定必須建立。

你可以按照下面的幾條命令執行操作,以確保檔案的屬主和許可權正確:

$ sudo touch /var/log/syslog$ sudo chown syslog:adm /var/log/syslog$ sudo chmod 640 /var/log/syslog

你也可以把以下這一行內容新增到 /etc/logrotate.d/rsyslog 當中,由 logrotate 來幫你完成上面三條命令的操作:

create 0640 syslog adm

整個組態檔的內容是這樣的:

/var/log/syslog{rotate 7dailymissingoknotifemptycreate 0640 syslog adm           <==delaycompresscompresspostrotate/usr/lib/rsyslog/rsyslog-rotateendscript}

下面是手動捲動記錄使用者登入資訊的 wtmp 紀錄檔的範例。由於 /etc/logrotate.d/wtmp 中有 rotate 2 的設定,因此系統中只保留了兩份 wtmp 紀錄檔檔案。

捲動前:

$ ls -l wtmp*-rw-r----- 1 root utmp  1152 Mar 12 11:49 wtmp-rw-r----- 1 root utmp   768 Mar 11 17:04 wtmp.1

執行捲動命令:

$ sudo logrotate -f /etc/logrotate.d/wtmp

捲動後:

$ ls -l /var/log/wtmp*-rw-r----- 1 root utmp     0 Mar 12 11:52 /var/log/wtmp-rw-r----- 1 root utmp  1152 Mar 12 11:49 /var/log/wtmp.1-rw-r----- 1 root adm  99726 Feb 21 07:46 /var/log/wtmp.report

需要知道的是,無論發生的紀錄檔卷動是自動捲動還是手動捲動,最近一次的捲動時間都會記錄在 logrorate 的狀態檔案中。

$ grep wtmp /var/lib/logrotate/status"/var/log/wtmp" 2020-3-12-11:52:57