之前我們提到了利用 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
我們可以看一下各項設定是甚麼意思
- compress:壓縮文件,但不會壓縮現行版本
- delaycompress:壓縮文件,但不會壓縮現行版本以及最近的版本
- daily,weekly,monthly:執行腳本週期,一天、一個禮拜、一個月
- errors “E-mail”:當錯誤發生時,會將錯誤訊息發送出去
- missingok:當找不到文件時不要回報錯誤
- notifempty:當文件沒有內容的時候,就不執行 rotate 工作
- olddir “to folder”:將舊版本的文件送入其他資料夾內
- rotate ‘n’:會保存幾個版本,而超過的會從 didk 中移除
- 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 的結果。就的資料並沒有被分離出來,目前還在尋找錯誤中。