本文轉載自: https://www.93bok.com
對於Linux系統安全來說,日志文件是極其重要的工具。不知為何,我發現很多運維同學的服務器上都運行着一些諸如每天切分Nginx日志之類的CRON腳本,大家似乎遺忘了Logrotate,爭相發明自己的輪子,這真是讓人沮喪啊!就好比明明身邊躺着現成的性感美女,大家卻忙着自娛自樂,罪過!logrotate程序是一個日志文件管理工具。用於分割日志文件,刪除舊的日志文件,並創建新的日志文件,起到“轉儲”作用。可以節省磁盤空間。下面就對logrotate日志輪轉操作做一梳理記錄。
Logrotate介紹
Linux系統默認安裝logrotate工具,它默認的配置文件在:
/etc/logrotate.conf
/etc/logrotate.d/
logrotate.conf 是主要的配置文件,logrotate.d 是一個目錄,該目錄里的所有文件都會被主動的讀入/etc/logrotate.conf中執行。
另外,如果 /etc/logrotate.d/ 里面的文件中沒有設定一些細節,則會以/etc/logrotate.conf這個文件的設定來作為默認值。
Logrotate是基於cron來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉是系統自動完成的。
實際運行時,Logrotate會調用配置文件/etc/logrotate.conf。
可以在/etc/logrotate.d目錄里放置自定義好的配置文件,用來覆蓋Logrotate的缺省值。
如果等不及cron自動執行日志輪轉,想手動強制切割日志,需要加-f參數;不過正式執行前最好通過Debug選項來驗證一下(-d參數),這對調試也很重要:
/usr/sbin/logrotate -d /etc/logrotate.d/nginx
/usr/sbin/logrotate -f /etc/logrotate.d/nginx
logrotate命令參數說明:
-d, --debug :debug模式,測試配置文件是否有錯誤。
-f, --force :強制轉儲文件。
-m, --mail=command :壓縮日志后,發送日志到指定郵箱。
-s, --state=statefile :使用指定的狀態文件。
-v, --verbose :顯示轉儲過程。
查看各log文件的具體執行情況
cat /var/lib/logrotate.status
tomcat日志切割實例
/etc/logrotate.d其實就是由/etc/logrotate.conf所規划出來的目錄,雖然可以將所有的配置都寫入/etc/logrotate.conf,但是這樣一來這個文件就實在是太復雜了,尤其是當使用很多的服務在系統上面時,每個服務都要去修改/etc/logrotate.conf的設定也似乎不太合理了。所以,如果獨立出來一個目錄,那么每個要切割日志的服務,就可以獨自成為一個文件,並且放置到 /etc/logrotate.d/ 當中。
重要參數說明
compress 通過gzip 壓縮轉儲以后的日志
nocompress 不做gzip壓縮處理
copytruncate 用於還在打開中的日志文件,把當前日志備份並截斷;是先拷貝再清空的方式,拷貝和清空之間有一個時間差,可能會丟失部分日志數據。
nocopytruncate 備份日志文件不過不截斷
create mode owner group 輪轉時指定創建新文件的屬性,如create 0777 nobody nobody
nocreate 不建立新的日志文件
delaycompress 和compress 一起使用時,轉儲的日志文件到下一次轉儲時才壓縮
nodelaycompress 覆蓋 delaycompress 選項,轉儲同時壓縮。
missingok 如果日志丟失,不報錯繼續滾動下一個日志
errors address 專儲時的錯誤信息發送到指定的Email 地址
ifempty 即使日志文件為空文件也做輪轉,這個是logrotate的缺省選項。
notifempty 當日志文件為空時,不進行輪轉
mail address 把轉儲的日志文件發送到指定的E-mail 地址
nomail 轉儲時不發送日志文件
olddir directory 轉儲后的日志文件放入指定的目錄,必須和當前日志文件在同一個文件系統
noolddir 轉儲后的日志文件和當前日志文件放在同一個目錄下
sharedscripts 運行postrotate腳本,作用是在所有日志都輪轉后統一執行一次腳本。如果沒有配置這個,那么每個日志輪轉后都會執行一次腳本
prerotate 在logrotate轉儲之前需要執行的指令,例如修改文件的屬性等動作;必須獨立成行
postrotate 在logrotate轉儲之后需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行
daily 指定轉儲周期為每天
weekly 指定轉儲周期為每周
monthly 指定轉儲周期為每月
rotate count 指定日志文件刪除之前轉儲的次數,0 指沒有備份,5 指保留5 個備份
dateext 使用當期日期作為命名格式
dateformat .%s 配合dateext使用,緊跟在下一行出現,定義文件切割后的文件名,必須配合dateext使用,只支持 %Y %m %d %s 這四個參數
size(或minsize) log-size 當日志文件到達指定的大小時才轉儲,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
當日志文件 >= log-size 的時候就轉儲。 以下為合法格式:(其他格式的單位大小寫沒有試過)
size = 5 或 size 5 (>= 5 個字節就轉儲)
size = 100k 或 size 100k
size = 100M 或 size 100M
下面是我線上使用的tomcat日志切割的配置,很簡單,沒做過多的設置:
vim /etc/logrotate.d/tomcat
/opt/tomcat7.0.75/logs/catalina.out {
rotate 3
daily
copytruncate
missingok
}
/opt/tomcat7.0.75/parking_log/logs/parking_api_entry.log {
rotate 3
daily
copytruncate
missingok
}
/opt/tomcat7.0.75/parking_log/logs/parking_collect_entry.log {
rotate 3
daily
copytruncate
missingok
}
過了幾天之后我查看的效果如下: