Linux中國

在 Linux 系統中手動滾動日誌

日誌滾動 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 7
daily
missingok
notifempty
create 0640 syslog adm           <==
delaycompress
compress
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}

下面是手動滾動記錄用戶登錄信息的 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

via: https://www.networkworld.com/article/3531969/manually-rotating-log-files-on-linux.html

作者:Sandra Henry-Stocker 選題:lujun9972 譯者:HankChow 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國