在Linux系統(tǒng)中手動滾動日志
日志滾動在 Linux系統(tǒng)上是再常見不過的一個功能了,它為系統(tǒng)監(jiān)控和故障排查保留必要的日志內(nèi)容,同時又防止過多的日志造成單個日志文件太大。
日志滾動的過程是這樣的:在一組日志文件之中,編號最大的(最舊的)一個日志文件會被刪除,其余的日志文件編號則依次增大并取代較舊的日志文件,而較新的文件則取代它作為當(dāng)前的日志文件。這一個過程很容易就可以實現(xiàn)自動化,在細(xì)節(jié)上還能按需作出微調(diào)。
使用 logrotate
命令可以手動執(zhí)行日志滾動的操作。本文將要介紹的就是手動進(jìn)行日志滾動的方法,以及預(yù)期產(chǎn)生的結(jié)果。
文中出現(xiàn)的示例適用于 Ubuntu 等 Linux 系統(tǒng),對于其它類型的系統(tǒng),日志文件和配置文件可能會有所不同,但日志滾動的過程是大同小異的。
為什么需要滾動日志
一般情況下,無需手動旋轉(zhuǎn)日志文件。Linux 系統(tǒng)會每隔一天(或間隔更長的時間)或根據(jù)日志文件的大小自動進(jìn)行一次日志滾動。如果你需要滾動日志以釋放存儲空間,又或者將某一部分日志從當(dāng)前的活動中分割出來,這很容易做到,具體要取決于文件滾動規(guī)則。
一點背景介紹
在 Linux 系統(tǒng)安裝完成后就已經(jīng)有很多日志文件被納入到日志滾動的范圍內(nèi)了。另外,一些應(yīng)用程序在安裝時也會為自己產(chǎn)生的日志文件設(shè)置滾動規(guī)則。一般來說,日志滾動的配置文件會放置在 /etc/logrotate.d
。如果你想了解日志滾動的詳細(xì)實現(xiàn),可以參考這篇以前的文章。
在日志滾動的過程中,活動日志會以一個新名稱命名,例如 log.1
,之前被命名為 log.1
的文件則會被重命名為 log.2
,依此類推。在這一組文件中,最舊的日志文件(假如名為 log.7
)會從系統(tǒng)中刪除。日志滾動時文件的命名方式、保留日志文件的數(shù)量等參數(shù)是由 /etc/logrotate.d
目錄中的配置文件決定的,因此你可能會看到有些日志文件只保留少數(shù)幾次滾動,而有些日志文件的滾動次數(shù)會到 7 次或更多。
例如 syslog
在經(jīng)過日志滾動之后可能會如下所示(注意,行尾的注釋部分只是說明滾動過程是如何對文件名產(chǎn)生影響的):
$ 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
你可能會發(fā)現(xiàn),除了當(dāng)前活動的日志和最新一次滾動的日志文件之外,其余的文件都已經(jīng)被壓縮以節(jié)省存儲空間。這樣設(shè)計的原因是大部分系統(tǒng)管理員都只需要查閱最新的日志文件,其余的日志文件壓縮起來,需要的時候可以解壓查閱,這是一個很好的折中方案。
手動日志滾動
你可以這樣執(zhí)行 logrotate
命令進(jìn)行手動日志滾動:
$ sudo logrotate -f /etc/logrotate.d/rsyslog
值得一提的是,logrotate
命令使用 /etc/logrotate.d/rsyslog
這個配置文件,并通過了 -f
參數(shù)實行“強(qiáng)制滾動”。因此,整個過程將會是:
- 刪除
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
文件不一定必須創(chuàng)建。
你可以按照下面的幾條命令執(zhí)行操作,以確保文件的屬主和權(quán)限正確:
$ sudo touch /var/log/syslog
$ sudo chown syslog:adm /var/log/syslog
$ sudo chmod 640 /var/log/syslog
你也可以把以下這一行內(nèi)容添加到 /etc/logrotate.d/rsyslog
當(dāng)中,由 logrotate
來幫你完成上面三條命令的操作:
create 0640 syslog adm
整個配置文件的內(nèi)容是這樣的:
/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
的配置,因此系統(tǒng)中只保留了兩份 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
執(zhí)行滾動命令:
$ 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
需要知道的是,無論發(fā)生的日志滾動是自動滾動還是手動滾動,最近一次的滾動時間都會記錄在 logrorate
的狀態(tài)文件中。
$ grep wtmp /var/lib/logrotate/status
"/var/log/wtmp" 2020-3-12-11:52:57