『學了就忘』Linux日誌管理 — 93、日誌輪替補充

繁華似錦Fighting發表於2021-12-24

1、把自己的日誌加入日誌輪替

使用RPM包方式安裝服務的日誌會自動的加入logrotate輪替,一般不需要你介入。

而使用原始碼包方式安裝服務的日誌,需要手工把該服務的日誌加入到logrotate.conf配置檔案中。

所以原始碼包方式安裝服務的日誌和手動指定的日誌,是需要自己手動加入logrotate日誌輪替。

(1)操作方式

有兩個方法:

  • 第一種方法是直接在/etc/logrotate.conf配置檔案中寫入該日誌的輪替策略,從而把日誌加入logrotate輪替。
  • 第二種方法是在/etc/logrotate.d/目錄中新建立該日誌的輪替檔案,在該輪替檔案中寫入正確的輪替策略,因為該目錄中的檔案都會被"include"到主配置檔案中,所以也可以把日誌加入輪替。

推薦第二種方法,因為系統中需要輪替的日誌非常多,如果全都直接寫入/etc/logrotate.conf配置檔案,那麼這個檔案的可管理性就會非常差,不利於此檔案的維護。

(2)示例

我們在/var/log/目錄中建立要給testerr.log日誌檔案,這個日誌不是系統預設日誌,所以預設這個日誌是不會輪替的,那麼我們需要把這個日誌加入日誌輪替的策略。

擴充:

  • 有個典型應用就是給予特定的日誌加入chattra屬性,如果系統檔案加入了a屬性,那麼這個檔案就只能增加資料,但是不能刪除和修改已有的資料了,而且root使用者也不能例外。
  • 所以我們會給重要的日誌檔案加入a屬性,這樣的話可以保護日誌檔案不被惡意修改。不過一旦加入了a屬性,那麼日誌輪替時,這個日誌檔案是不能被改名的,當然也就不能進行日誌輪替了。所以我們可以利用prerotatepostrotate來修改日誌檔案的chattra屬性。在下一個小節,我們會具體說明下這兩個引數的使用。

採用第二種方式實現,如下:

#先給日誌檔案賦予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"選項之後,就不管日誌是否已經符合了日誌輪替條件,而強制把所有的日誌都進行了輪替。

相關文章