rsyslog with logrotate

之前我們提到了利用 rsyslog 把各地的機器 Log 檔案傳回一台管理機器上,但是這些檔案會越長越大,必須適當的讓檔案定時的刪減,要不然一個檔案包含了 20-30 個月的資料,管理者也沒有辦法輕易的經過調查 Log,因此定時的將資料一份一份的抽離很重要的,尤其是依照時間方式分離,可以很有效的減低日後反查資料的困難度。

Environment
OS:CentOS 7.5
logrotate:3.8.6

logrotate 設定

logrotate 的設定都在 /etc/logrotate.conf 下面,並把個人設定放到 /etc/logrotate.d/ 這個目錄下,個人覺得這樣的設定非常方便。

logrote 預先設定

weekly
rotate 4
create
dateext

我們可以看一下各項設定是甚麼意思

  1. compress:壓縮文件,但不會壓縮現行版本
  2. delaycompress:壓縮文件,但不會壓縮現行版本以及最近的版本
  3. daily,weekly,monthly:執行腳本週期,一天、一個禮拜、一個月
  4. errors “E-mail”:當錯誤發生時,會將錯誤訊息發送出去
  5. missingok:當找不到文件時不要回報錯誤
  6. notifempty:當文件沒有內容的時候,就不執行 rotate 工作
  7. olddir “to folder”:將舊版本的文件送入其他資料夾內
  8. rotate ‘n’:會保存幾個版本,而超過的會從 didk 中移除
  9. size=’logsize’:在文件大於某個大小後進行 rotate

這邊要對三個指令特別討論,分別為 sharedscripts, prerotate, postrotate

  • prerotate:在執行 rotate 前,執行後面所帶的腳本
  • postrotate:在執行 rotate 後,執行後面所帶的腳本
  • sharedscripts:在完成整體 rotate 後在一次執行

以下是我們對於 rsyslog 所做的設定

/var/log/remote/*/*.log /var/log/remote/httpd/*/*.log {
    daily
    rotate 5
    missingok
    postrotate
        reload rsyslog >/dev/null 2>&1 || true
    endscript
}

每日都會執行一次,並且只保存五天的資料,並且當找不到文件時,不會回報錯誤。最後在執行文 rotate 會執行一次 reload rsyslog。讓 rsyslog 可以繼續寫入新的檔案內。

以上就完成基本設定,可以利用以下指令確認指令是否有錯誤。

$ /usr/sbin/logrotate /etc/logrotate.conf

如果沒有輸出任何結果代表 rotate 設定沒有問題。之後就可以等待每天的 rotate 工作是否完成。
如果不確定是否完成可以藉由查看 /var/lib/logrotate/logrotate.status,可以看到每次 logrotate 執行的狀況。像是以下是我機器的執行結果。

"/var/log/remote/httpd/www02/access.log" 2018-8-17-3:17:1
"/var/log/yum.log" 2018-8-16-19:55:33
"/var/log/remote/httpd/www01/error.log" 2018-8-17-3:17:1
"/var/log/remote/splunk/secure.log" 2018-8-20-0:23:6
"/var/log/remote/dns01/cron.log" 2018-8-20-0:0:0
"/var/log/remote/www02/cron.log" 2018-8-20-0:0:0
"/var/log/boot.log" 2018-8-18-3:21:1
"/var/log/remote/httpd/www01/access.log" 2018-8-17-3:17:1
"/var/log/remote/httpd/www02/error.log" 2018-8-17-3:17:1
"/var/log/wtmp" 2018-8-16-19:55:33
"/var/log/remote/www02/secure.log" 2018-8-20-0:0:0
"/var/log/spooler" 2018-8-19-3:29:1
"/var/log/remote/www01/cron.log" 2018-8-20-0:0:0
"/var/log/btmp" 2018-8-16-19:55:33
"/var/log/remote/www01/secure.log" 2018-8-20-0:0:0
"/var/log/maillog" 2018-8-19-3:29:1
"/var/log/remote/splunk/cron.log" 2018-8-20-0:0:0
"/var/log/wpa_supplicant.log" 2018-8-14-16:0:0
"/var/log/remote/dns01/secure.log" 2018-8-20-0:23:6
"/var/log/secure" 2018-8-19-3:29:1
"/var/log/messages" 2018-8-19-3:29:1
"/var/log/cron" 2018-8-19-3:29:1

後記

基本上到這裡已經可以讓 log 自己不斷的進行分離,不過我自己測是起來有一些小狀況,還沒有找出問題點。就是系統說他有執行 rotate,但是卻沒有看到 rotate 的結果。就的資料並沒有被分離出來,目前還在尋找錯誤中。

資料來源

配置 logrotate 的終極指導
鳥哥的 Linux 私房菜

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *