一、logrotate介紹
logrotate程序是一個日志文件管理工具。用於分割日志文件,刪除舊的日志文件,並創建新的日志文件,起到"轉儲"作用。可以節省磁盤空間。例如,你可以設置logrotate,讓/var/log/logfile日志文件每30天輪循,並刪除超過6個月的日志。配置完后,logrotate的運作完全自動化,不必進行任何進一步的人為干預。
二、logrotae配置使用
2.1、logrotate安裝
1)系統版本
[root@test206 ~]#cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core) [root@test206 ~]#uname -r 3.10.0-957.21.3.el7.x86_64
2)默認centos系統安裝自帶logrotate,直接使用yum 安裝
3)安裝包說明
[root@test206 ~]#rpm -ql logrotate /etc/cron.daily/logrotate #Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate /etc/logrotate.conf #logrotate 自身的配置文件 /etc/logrotate.d #配置切割設置的目錄 /etc/rwtab.d/logrotate /usr/sbin/logrotate /usr/share/doc/logrotate-3.8.6 /usr/share/doc/logrotate-3.8.6/CHANGES /usr/share/doc/logrotate-3.8.6/COPYING /usr/share/man/man5/logrotate.conf.5.gz /usr/share/man/man8/logrotate.8.gz /var/lib/logrotate /var/lib/logrotate/logrotate.status #日志切割的狀態信息 #注意 logrotate的配置文件是/etc/logrotate.conf,通常不需要對它進行修改。 日志文件的輪循設置在獨立的配置文件中,它(們)放在/etc/logrotate.d/目錄下。
2.2、配置參數說明
2.2.1、主配置文件
[root@test206 ~]#cat /etc/logrotate.conf
weekly #默認每一周執行一次rotate輪轉工作
rotate 4 #保留多少個日志文件(輪轉幾次).默認保留四個.就是指定日志文件刪除之前輪轉的次數,0 指沒有備份
create #自動創建新的日志文件,新的日志文件具有和原來的文件相同的權限;因為日志被改名,因此要創建一個新的來繼續存儲之前的日志
dateext #切割后的日志文件以當前日期為格式結尾,如xxx.log-20131216,注釋掉,切割出來是按數字遞增,即xxx.log-1這種格式
compress #是否通過gzip壓縮轉儲以后的日志文件,如xxx.log-20131216.gz ;如果不需要壓縮,注釋掉就行
include /etc/logrotate.d #將 /etc/logrotate.d/ 目錄中的所有文件都加載進來
# 這個 wtmp 可記錄用戶登錄系統及系統重啟的時間
# 因為有 minsize 的參數,因此不見得每個月一定會執行一次喔.要看文件大小。
/var/log/wtmp { #僅針對 /var/log/wtmp 所設定的參數
monthly #每月一次切割,取代默認的一周
create 0664 root utmp #文件大小超過 1M 后才會切割
minsize 1M #指定新建的日志文件權限以及所屬用戶和組
rotate 1 #只保留一個日志.
}
/var/log/btmp { ##僅針對 /var/log/wtmp 所設定的參數
missingok
monthly
create 0600 root utmp
rotate 1
}
2.2.2、日志輪轉腳本
#Logrotate是基於CRON來運行的,其腳本是/etc/cron.daily/logrotate,日志輪轉是系統自動完成的。
[root@test206 ~]#cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
2.2.2、其他重要參數說明
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
2.3、logrotate相關命令
#logrotate命令格式: logrotate [OPTION...] <configfile> -d, --debug #debug模式,測試配置文件是否有錯誤。 -f, --force #強制轉儲文件。 -m, --mail=command #壓縮日志后,發送日志到指定郵箱。 -s, --state=statefile #使用指定的狀態文件。 -v, --verbose #顯示轉儲過程。 #如果等不及cron自動執行日志輪轉,想手動強制切割日志,需要加-f參數;不過正式執行前最好通過Debug選項來驗證一下(-d參數),這對調試也很重要 /usr/sbin/logrotate -f /etc/logrotate.d/nginx /usr/sbin/logrotate -d -f /etc/logrotate.d/nginx #根據日志切割設置進行操作,並顯示詳細信息 /usr/sbin/logrotate -v /etc/logrotate.conf /usr/sbin/logrotate -v /etc/logrotate.d/php #根據日志切割設置進行執行,並顯示詳細信息,但是不進行具體操作,debug模式 /usr/sbin/logrotate -d /etc/logrotate.conf /usr/sbin/logrotate -d /etc/logrotate.d/nginx #查看各log文件的具體執行情況 cat /var/lib/logrotate/logrotate.status
三、logrotate切割tomcat catalina.out日志
一般在部署Tomcat后,運行久了,catalina.out文件會越來越大,甚至上G,對系統的穩定造成了一定的影響
3.1、定義tomcat pid文件
[root@test206 ~]#vim /usr/java/tomcat/dianchou-app-boss/bin/catalina.sh # Get standard environment variables PRGDIR=`dirname "$PRG"` CATALINA_PID=/usr/java/tomcat/dianchou-app-boss/tomcat.pid
3.2、重啟tomcat並查看pid文件
[root@test206 bin]#./shutdown.sh [root@test206 bin]#./startup.sh [root@test206 bin]#cd ../ [root@test206 dianchou-app-boss]#ll tomcat.pid -rw-r--r-- 1 root root 6 Nov 12 20:48 tomcat.pid [root@test206 dianchou-app-boss]#cat tomcat.pid 19472
3.3、配置logrotate切割文件
[root@test206 ~]#vim /etc/logrotate.d/tomcat_appboss_catalina
/usr/java/tomcat/dianchou-app-boss/logs/catalina.out {
daily
rotate 15
missingok
notifempty
dateext
compress
delaycompress
sharedscripts
create 644 root root
postrotate
if [ -f /usr/java/tomcat/dianchou-app-boss/tomcat.pid ]; then
kill -USR1 `cat /usr/java/tomcat/dianchou-app-boss/tomcat.pid` #測試殺死了進程,但沒重新啟動
rm -f /usr/java/tomcat/dianchou-app-boss/tomcat.pid #刪除pid文件,不然報錯
/usr/java/tomcat/dianchou-app-boss/bin/startup.sh #重啟tomcat,重新生成pid文件
fi
endscript
}
#USR1信號解釋
1、USR1亦通常被用來告知應用程序重載配置文件;例如,向Apache HTTP服務器發送一個USR1信號將導致以下步驟的發生:停止接受新的連接,等待當前連接停止,重新載入配置文件,重新打開日志文件,重啟服務器,從而實現相對平滑的不關機的更改。
2、在沒有執行kill -USR1 `cat ${pid_path}`之前,即便已經對文件執行了mv命令而改變了文件名稱,tomcat還是會向新命名的文件" xxx.out_ 20180619"照常寫入日志數據的。原因在於:linux系統中,內核是根據文件描述符來找文件的。
3.4、測試執行
[root@test206 logs]#ll catalina.out* -rw-r--r-- 1 root root 6241051 Nov 12 20:48 catalina.out [root@test206 logs]#logrotate -vf /etc/logrotate.d/tomcat_appboss_catalina reading config file /etc/logrotate.d/tomcat_appboss_catalina Allocating hash table for state file, size 15360 B Handling 1 logs rotating pattern: /usr/java/tomcat/dianchou-app-boss/logs/catalina.out forced from command line (15 rotations) empty log files are not rotated, old logs are removed considering log /usr/java/tomcat/dianchou-app-boss/logs/catalina.out log needs rotating rotating log /usr/java/tomcat/dianchou-app-boss/logs/catalina.out, log->rotateCount is 15 dateext suffix '-20191112' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' glob finding logs to compress failed glob finding old rotated logs failed renaming /usr/java/tomcat/dianchou-app-boss/logs/catalina.out to /usr/java/tomcat/dianchou-app-boss/logs/catalina.out-20191112 creating new /usr/java/tomcat/dianchou-app-boss/logs/catalina.out mode = 0644 uid = 0 gid = 0 running postrotate script Using CATALINA_BASE: /usr/java/tomcat/dianchou-app-boss Using CATALINA_HOME: /usr/java/tomcat/dianchou-app-boss Using CATALINA_TMPDIR: /usr/java/tomcat/dianchou-app-boss/temp Using JRE_HOME: /usr Using CLASSPATH: /usr/java/tomcat/dianchou-app-boss/bin/bootstrap.jar:/usr/java/tomcat/dianchou-app-boss/bin/tomcat-juli.jar Using CATALINA_PID: /usr/java/tomcat/dianchou-app-boss/tomcat.pid Tomcat started. [root@test206 logs]#ll catalina.out* -rw-r--r-- 1 root root 4594 Nov 12 20:56 catalina.out -rw-r--r-- 1 root root 6241051 Nov 12 20:48 catalina.out-20191112 #后續切割時會對前面的日志進行壓縮
3.5、設置定時任務
[root@test206 ~]#crontab -l #logrotate tomcat 59 23 * * * /usr/sbin/logrotate -vf /etc/logrotate.d/tomcat_appboss_catalina &>/dev/null
參考文檔:
