運維日志切割--logrotate


一、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

參考文檔:

https://www.cnblogs.com/kevingrace/p/6307298.html

https://www.cnblogs.com/along21/p/9198427.html


免責聲明!

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



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