1、把自己的日誌加入日誌輪替
使用RPM包方式安裝服務的日誌會自動的加入logrotate
輪替,一般不需要你介入。
而使用原始碼包方式安裝服務的日誌,需要手工把該服務的日誌加入到logrotate.conf
配置檔案中。
所以原始碼包方式安裝服務的日誌和手動指定的日誌,是需要自己手動加入logrotate
日誌輪替。
(1)操作方式
有兩個方法:
- 第一種方法是直接在
/etc/logrotate.conf
配置檔案中寫入該日誌的輪替策略,從而把日誌加入logrotate
輪替。 - 第二種方法是在
/etc/logrotate.d/
目錄中新建立該日誌的輪替檔案,在該輪替檔案中寫入正確的輪替策略,因為該目錄中的檔案都會被"include"
到主配置檔案中,所以也可以把日誌加入輪替。
推薦第二種方法,因為系統中需要輪替的日誌非常多,如果全都直接寫入/etc/logrotate.conf
配置檔案,那麼這個檔案的可管理性就會非常差,不利於此檔案的維護。
(2)示例
我們在/var/log/
目錄中建立要給testerr.log
日誌檔案,這個日誌不是系統預設日誌,所以預設這個日誌是不會輪替的,那麼我們需要把這個日誌加入日誌輪替的策略。
擴充:
- 有個典型應用就是給予特定的日誌加入
chattr
的a
屬性,如果系統檔案加入了a
屬性,那麼這個檔案就只能增加資料,但是不能刪除和修改已有的資料了,而且root
使用者也不能例外。- 所以我們會給重要的日誌檔案加入
a
屬性,這樣的話可以保護日誌檔案不被惡意修改。不過一旦加入了a
屬性,那麼日誌輪替時,這個日誌檔案是不能被改名的,當然也就不能進行日誌輪替了。所以我們可以利用prerotate
和postrotate
來修改日誌檔案的chattr
的a
屬性。在下一個小節,我們會具體說明下這兩個引數的使用。
採用第二種方式實現,如下:
#先給日誌檔案賦予chattr的a屬性,保證日誌的安全。
[root@localhost ~]# chattr +a /var/log/testerr.log
# 建立testerr輪替檔案,
[root@localhost ~]# vim /etc/logrotate.d/testerr
# 把/var/log/testerr.log日誌檔案加入輪替。
/var/log/testerr.log{
weekly <-- 每週輪替一次
rotate 6 <-- 保留6個輪替日誌
sharedscripts <-- 以下命令只執行一次
prerotate <-- 在日誌輪替之前執行
# 在日誌輪替之前取消a屬性,以便讓日誌可以輪替。
usr/bin/chattr -a /var/log/testerr.1og
endscript <-- 指令碼結束
sharedscripts
postrotate <-- 在日誌輪替之後執行
# 日誌輪替之後,重新加入a屬性。
/usr/bin/chattr +a /var/log/testerr.log
endscript
sharedscripts
postrotate
# 重啟rsyslog服務,保證日誌輪替正常。
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2>/dev/null) &>/dev/null
endscript
練習2:把Nginx服務的日誌加入日誌輪替,需要重啟Nginx服務。
# 假設Nginx的日誌放在/date目錄下
/date/logs/nginx/access/access.log
/date/logs/nginx/access/default.log
{
daily
rotate 15
sharedscripts
postrotate
#重啟rsyslog服務
/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) &>/dev/null
#重啟Nginx服務
/bin/kill -HUP $(/bin/cat /usr/local/nginx/1ogs/nginx.pid) &>/dev/null
endscript
}
實際工作中就可以以此為例。
提示:Linux系統自身日誌或者使用RPM包方式安裝服務的日誌,需要重啟。
2、logrotate命令
我們日誌輪替之所以可以在指定的時間備份日誌,其實也要依賴系統定時任務。如果大家還記得/etc/cron.daily/
目錄,就會發現這個目錄中是有logrotate
檔案,logrotate
命令通過這個檔案依賴定時任務執行的。
logrotate
命令的格式:
[root@localhost ~]# logrotate [選項] 配置檔名
選項:
如果此命令沒有選項,則會按照配置檔案中的條件進行日誌輪替。
-v:顯示日誌輪替過程。
-f:強制進行日誌輪替。不管日誌輪替的條件是否已經符合,強制配置檔案中所有的日誌進行輪替。
注意:
logrotate
命令一般不需要我們執行,需要強制輪替的時候才需要執行。
我們執行logrotate
命令,並檢視下執行過程:
# 檢視日誌輪替的流程
[root@localhost ~]# logrotate -v /etc/logrotate.conf
# 擷取一個日誌輪替說明
# 這就是我們自己加入輪替的testerr.log日誌。
rotating pattern:/var/log/testerr.log weekly(6 rotations)
empty log files are rotated,old logs are removed
considering log/var/log/testerr.log
log does not need rotating <-- 時間不夠一週,所以不進行日誌輪替
我們發現/var/log/testerr.log
加入了日誌輪替,已經被logrotate
識別並呼叫了。只是時間沒有達到輪替的標準,所以沒有進行輪替。
那我們強制進行一次日誌輪替,看看有什麼結果:
# 強制進行日誌輪替,不管是否符合輪替條件
[root@localhost ~]# logrotate -vf /etc/logrotate.conf
# 目標testerr.log日誌檔案片段
rotating pattern:/var/log/testerr.1og forced from command line(6 rotations)
empty log files are rotated,old logs are removed
considering 1og/var/log/testerr.log
log needs rotating <-- 日誌需要輪替
rotating log/var/log/testerr.log,log->rotateCount is 1
dateext suffix'-20200618' <-- 提取日期引數
glob pattern'-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
running prerotate script
fscreate context set to unconfined_u:object_r:var_log_t:s0
# 舊的日誌被重新命名
renaming/var/log/testerr.log to /var/log/testerr.log-20200618
# 建立新日誌檔案,同時制定許可權、所有者和屬組
creating new/var/log/testerr.log mode= 0600 uid =0 gid=0
running postrotate script
我們發現testerr.log
日誌已經完成了日誌輪替。
我們檢視下新產生的日誌和舊日誌:
[root@localhost ~]# ll /var/log/testerr.log*
# 舊日誌檔案已經轉儲
-rw-------. 1 root root 0 6月 7 10:07/var/log/testerr.log
-rw-------. 1 root root 237 6月 18 09:58/var/log/testerr.log-20200618
# 新的日誌檔案被自動加入了chattr的a屬性。
[root@localhost ~]# lsattr /var/1og/testerr.log
-a------e- /var/1og/alert.log
logrotate
命令使用“-f"
選項之後,就不管日誌是否已經符合了日誌輪替條件,而強制把所有的日誌都進行了輪替。