Tomcat nginx log日志按天分割切割


利用 Linux 自帶的 logrotate 工具來實現按天切割日志.下方已 centos 7 系統為例來實踐講解.

原理

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

  1. 每晚 cron 后台執行/etc/cron.daily/目錄下的任務
  2. 這會觸發/etc/cron.daily/logrotate文件,通常這在 linux 安裝的時候包含了。 它會執行命令 /etc/cron.daily/logrotate
  3. /etc/logrotate.conf 這個配置文件包含了所有在/etc/logrotate.d/的腳本。
  4. 這會觸發我們下面寫的 /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 路徑請自行更換為你自己的

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.conf

  • 5.如果沒有成功,再執行下面的命令排查問題

/usr/sbin/logrotate -v -f -d /etc/logrotate.d/tomcat-log-cut


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 100M

**值得注意的一個配置是:copytruncate **

copytruncate 如果沒有這個選項的話,操作方式:是將原log日志文件,移動成類似log.1的舊文件, 然后創建一個新的文件。 如果設置了,操作方式:拷貝原日志文件,並且將其變成大小為0的文件。

區別是:如果進程,比如 Tomcat 使用了一個文件寫日志,沒有 copytruncate 的話,切割日志時, 把舊日志 Catalina.out->Catalina.out.1 ,然后創建新日志Catalina.out。這時候 tomcat 打開的文件描述符依然時Catalina.out.1,由於沒有信號通知tomcat 要換日志描述符,所以它會繼續向 Catalina.out.1 寫日志,這樣就不符合我們的要求了。 因為我們想切割日志后,tomcat 自動會向新的 Catalina.out 文件寫日志,而不是舊的 Catalina.out.1 文件.

解決方法有兩個:

  1. 向上面的 tomcat 切割日志配置,再 postrotate 里面寫個腳本

postrotate # 在logrotate轉儲之后需要執行的指令,例如重新啟動 (kill -HUP) 某個服務!必須獨立成行

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

endscript

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

2.使用 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.做了整理優化.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM