Nginx日誌切割

Tomcat nginx log日誌按天分割切割
利用 Linux 自帶的 logrotate 工具來實現按天切割日誌.下方已 centos 7 系統爲例來實踐講解.html

原理
Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日誌輪轉是系統自動完成的。node

每晚 cron 後臺執行/etc/cron.daily/目錄下的任務
這會觸發/etc/cron.daily/logrotate文件,一般這在 linux 安裝的時候包含了。 它會執行命令 /etc/cron.daily/logrotate
/etc/logrotate.conf 這個配置文件包含了全部在/etc/logrotate.d/的腳本。
這會觸發咱們下面寫的 /etc/logrotate.d/tomcat-log-cut 文件。
Tomcat 日誌分割腳本(按天)
1.在/etc/logrotate.d/下面新建一個文件,文件名隨意,此處以 tomcat-log-cut 爲例.
vim /etc/logrotate.d/tomcat-log-cut
2.腳本內容
/opt/web/apache-tomcat/logs/catalina.out { #此處的 tomcat 路徑請自行更換爲你本身的linux

daily # 天天切割
rotate 5 # 保留 5 個備份
dateext # 這個參數很重要!就是切割後的日誌文件以當前日期爲格式結尾,如 xxx.log-20131216 這樣,若是註釋掉,切割出來是按數字遞增,即 xxx.log-1 這種格式
dateformat .%Y%m%d # 配合 dateext 使用,緊跟在下一行出現,定義文件切割後的文件名,必須配合 dateext 使用,只支持 %Y %m %d %s 這四個參數
#size 100M # 大小到達 size 開始轉存
notifempty # 若是是空文件的話,不轉儲
missingok # 在日誌輪循期間,任何錯誤將被忽略,例如「文件沒法找到」之類的錯誤。
copytruncate # 拷貝原日誌文件,而且將其變成大小爲0的文件。
}
3.重啓 tomcat 服務.
4.執行下面的命令測試一下.
/usr/sbin/logrotate /etc/logrotate.confnginx

5.若是沒有成功,再執行下面的命令排查問題
/usr/sbin/logrotate -v -f -d /etc/logrotate.d/tomcat-log-cutgit

logrotate 參數說明
參數 說明
compress #經過gzip 壓縮轉儲之後的日誌
nocompress #不作gzip壓縮處理
create mode owner group #輪轉時指定建立新文件的屬性,如create 0777 nobody nobody
nocreate #不創建新的日誌文件
delaycompress #和compress 一塊兒使用時,轉儲的日誌文件到下一次轉儲時才壓縮
nodelaycompress #覆蓋 delaycompress 選項,轉儲同時壓縮。
missingok #若是日誌丟失,不報錯繼續滾動下一個日誌
ifempty #即便日誌文件爲空文件也作輪轉,這個是logrotate的缺省選項。
notifempty #當日志文件爲空時,不進行輪轉
mail address #把轉儲的日誌文件發送到指定的E-mail 地址
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 100Mgithub

值得注意的一個配置是:copytruncateweb

copytruncate 若是沒有這個選項的話,操做方式:是將原log日誌文件,移動成相似log.1的舊文件, 而後建立一個新的文件。 若是設置了,操做方式:拷貝原日誌文件,而且將其變成大小爲0的文件。apache

區別是若是進程,好比 Tomcat 使用了一個文件寫日誌,沒有 copytruncate 的話,切割日誌時, 把舊日誌 Catalina.out->Catalina.out.1 ,而後建立新日誌Catalina.out。這時候 tomcat 打開的文件描述符依然時Catalina.out.1,因爲沒有信號通知tomcat 要換日誌描述符,因此它會繼續向 Catalina.out.1 寫日誌,這樣就不符合咱們的要求了。 由於咱們想切割日誌後,tomcat 自動會向新的 Catalina.out 文件寫日誌,而不是舊的 Catalina.out.1 文件.vim

解決方法有兩個:centos

向上面的 tomcat 切割日誌配置,再 postrotate 裏面寫個腳本
postrotate # 在logrotate轉儲以後須要執行的指令,例如從新啓動 (kill -HUP) 某個服務!必須獨立成行

[ -s /run/tomcat.pid ] && kill -USR1 `cat /run/tomcat.pid`

endscript
這樣就是發信號給tomcat ,讓 tomcat 關閉舊日誌文件描述符,從新打開新的日誌文件描述,並寫入日誌

使用 copytruncate 參數,向上面說的,配置了它之後,操做方式是把 Catalina.out 複製一份 成爲 Catalina.out.1,而後清空 log 的內容,使大小爲0,那此時 log 依然時原來的舊 log,對進程(tomcat)來講,依然打開的是原來的文件描述符,能夠繼續往裏面寫日誌,而不用發送信號給 tomcat
copytruncate 這種方式操做的時候, 拷貝和清空之間有一個時間差,可能會丟失部分日誌數據。

nocopytruncate 備份日誌文件不過不截斷。

本文參考:https://www.cnblogs.com/276815076/p/7053640.html(主要) 與 https://blog.csdn.net/seelye/article/details/79276216.作了整理優化.
https://www.cnblogs.com/jonnyan/p/9389513.html
https://jaminzhang.github.io/categories/#ELK 全量

相關文章
相關標籤/搜索