本文**自:
對於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
/opt/tomcat7.0.75/parking_log/logs/parking_api_entry.log
/opt/tomcat7.0.75/parking_log/logs/parking_collect_entry.log
過了幾天之後我檢視的效果如下: tomcat日誌切割 logrotate
每天晚上,cron daemon會自動執行 etc cron.daily目錄下的任務 這個會觸發 etc cron.daily logrotate檔案,logrotate一般是隨linux按安裝的。它會執行這個命令 etc sbin logrotate etc logrotate.conf 注意空格...
logrotate 日誌切割 原理
logrotate 是怎麼做到滾動日誌時不影響程式正常的日誌輸出呢?logrotate 提供了兩種解決方案。create copytruncate 介紹一下相關的 linux 下的檔案操作機制。linux 檔案系統裡檔案和檔名的關係如下圖。目錄也是檔案,檔案裡存著檔名和對應的 inode 編號。通過...
logrotate切割nohup日誌大小不變
阿里雲1000元通用代金券點此領取 昨天線上伺服器磁碟報警,登入後檢視發現單個應用日誌nohup.out達到了十幾個g,明明做了logrotate日誌切割,日誌還是在不斷的增大 logrotate配置檔案如下 data tomcat log檢視 var lib logrotate.status 確實...