中間件學習之定時清理Tomcat日志檔案
- 引言
- 解決方案
-
- Linux定時任務
-
- 操作步驟
- 指令詳解
-
- crontab
- find
- 配置過期日志自動删除
- 參考連結
引言
-
場景描述
部署在tomcat下的web項目,随着項目運作時間的延長,會産生大量的日志檔案,如果不進行定期清理過期的日志檔案,磁盤會經常被占滿。
解決方案
Linux定時任務
- 方案說明
- 建立以.sh結尾的shell腳本;
- 為腳本賦權;
- 建立并開啟linux定時任務
操作步驟
-
新增shell腳本
腳本名稱:auto-clean-10day-ago-log.sh
#! /bin/bash #tomcat目錄路徑 tomcat_url=/home/server/tomcat/apache-tomcat-8.5.71 #遞歸删除logs目錄下以.log結尾的10天之前的所有日志檔案,後面加";"來标明詞句已結束 find ${tomcat_url}/logs/ -mtime +10 -name "*.log" -exec rm -rf {} \;
- 将腳本加入到crontab定時執行
# 賦予腳本可執行權限 chmod +x /home/server/scripts/auto-clean-10day-ago-log.sh #編輯定時任務 crontab -e #加上如下内容(實作每天淩晨1點執行)儲存 0 1 * * * /home/server/scripts/auto-clean-10day-log.sh #重新開機生效 /etc/init.d/cron restart #檢視是否設定成功 crontab -l ## 0 1 * * * /home/server/scripts/auto-clean-10day-log.sh
指令詳解
crontab
-
基本格式
crontab檔案的格式(共計6個字段):M H D m d CMD
- 格式說明
M:分鐘(0-59) H:小時(0-23) D:日期(1-31) m:月份(1-12) d:一個星期中的某天(0-6,0代表周日)
(1) 前5個時間字段用空格隔開,其值可以是一個數字,也可以用逗号隔開的多個數字(或其他),如果不需設定,則預設為"*";
(2) 最後一個CMD就是所要執行的程式,如xxx.sh。
- 常用指令
“-d”:基本不用,會把使用者所有的時間表都删除了,一般采用"-e"編輯,逐行删除無用的時間表# 列出時間表 crontab -l # 編輯時間表 crontab -e # 删除時間表 crontab -d
find
-
基本格式
find path expression
- 常用指令
按照檔案名查找
# 在根目錄下(整個硬碟)查找檔案httpd.conf find / -name httpd.conf # 在/etc目錄下檔案httpd.conf find /etc -name httpd.conf # 使用通配符*(0或者任意多個)。表示在/etc目錄下查找檔案名中含有字元串'srm'的檔案 find /etc -name '*srm*' # 在目前目錄下查找檔案名開頭是字元串'srm'的檔案 find . -name 'srm*'
按照檔案特征查找
# 查找在系統中最後10分鐘通路的檔案(access time) find / -amin -10 # 查找在系統中最後48小時通路的檔案 find / -atime -2 # 查找在系統中為空的檔案或者檔案夾 find / -empty # 查找在系統中屬于 group為cat的檔案 find / -group cat # 查找在系統中最後5分鐘裡修改過的檔案(modify time) find / -mmin -5 # 查找在系統中最後24小時裡修改過的檔案 find / -mtime -1 # 查找在系統中屬于fred這個使用者的檔案 find / -user fred # 查找出大于10000000位元組的檔案(c:位元組,w:雙字,k:KB,M:MB,G:GB) find / -size +10000c # 查找出小于1000KB的檔案 find / -size -1000k
-
常用補充配合指令
對查找到的檔案再進行操作
# 查找并執行指令 -exec command; # 列印檔案完整檔案名 -fprint file # 列印檔案格式 -fprintf file format # 給使用者指令執行操作,根據使用者的Y 确認輸入執行 -ok command; # 列印同種檔案格式的檔案 -ls
- 樣例
# 查找根目錄下名稱包含xxx的檔案并顯示資訊 find / -name "*xxx*" -ls # 查找出符合條件的日志檔案并删除 find /opt/java/tomcat7/logs/ -mtime +5 -name "*201?*" -exec rm -rf {} \;
配置過期日志自動删除
-
概述
以Logback為例,結合RollingFileAppender配置滾動政策,選擇SizeAndTimeBasedRollingPolicy基于日志大小和時間滾動。
- 配置樣例
<configuration> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_FILE}</file> <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> <!--日志檔案輸出的檔案名--> <fileNamePattern>${LOG_FILE}-%d{yyyy-MM-dd}.%i.gz</fileNamePattern> <!--日志大小--> <maxFileSize>100MB</maxFileSize> <!--日志保留時長--> <maxHistory>30</maxHistory> <totalSizeCap>20GB</totalSizeCap> <cleanHistoryOnStart>true</cleanHistoryOnStart> </rollingPolicy> <encoder> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> <charset>utf8</charset> </encoder> </appender> <root level="DEBUG"> <appender-ref ref="FILE" /> </root> <configuration>
-
參數介紹
file: 生成的日志名稱
rollingPolicy: 滾動政策,這裡采用的SizeAndTimeBasedRollingPolicy,基于日志檔案大小和時間滾動。
fileNamePattern: 定義翻轉(歸檔)日志檔案的名稱。它的值應該包括檔案的名稱以及适當放置的% d 轉換說明符。% d 轉換說明符可能包含日期和時間模式。如果省略了日期和時間模式,則假定使用預設模式 yyyy-MM-dd。翻轉周期是從 fileNamePattern 的值推斷出來的。這裡的滾動周期需要和maxHistory配合使用。
maxFileSize: 單個日志檔案的最大體積,到達最大體積後就會觸發日志滾動操作,生成新的日志檔案
maxHistory: 要儲存的歸檔檔案的最大數量,以異步方式删除舊檔案。例如,如果通過fileNamePattern中的%d{yyyy-MM}指定滾動周期為月度滾動,并将 maxHistory 設定為6,那麼存檔檔案中超過6個月的檔案将被删除。
totalSizeCap: 控制所有歸檔日志檔案的總大小。當超出總大小上限時,将異步删除最早的歸檔日志檔案。設定totalSizeCap 屬性還要求設定 maxHistory 屬性。優先“最大曆史”限制,其次是“總大小上限”的限制。按照實際業務情況配置 totalSizeCap ,可以有效避免占用過大的磁盤空間。比如你希望 maxHistory 保留7天日志檔案,但是可能這7個檔案總大小超出磁盤容量,是以可以通過 totalSizeCap 來控制總大小,這樣系統會判斷大于此值時進行自動覆寫。
注意⚠️:單獨配置totalSizeCap是沒有意義的,一定要同時配置maxHistory屬性,且大于0,才能實作超過總大小上限異步删除。
cleanHistoryOnStart: 是否在應用啟動的時候删除曆史日志。如果設定為真,将在啟動應用程式時執行檔案删除。預設情況下,此屬性設定為 false。歸檔日志移除通常在滾動期間執行。但是,有些應用程式的存活時間可能不夠長,無法觸發滾動。是以,對于如此短命的應用程式,删除存檔可能永遠沒有機會執行。通過将 cleanHistoryOnStart 設定為 true,将在啟動 appender 時執行檔案删除。
encoder: 控制輸出日志的格式和編碼。
參考連結
- linux定時清理tomcat日志檔案
- 如何實作tomcat日志自動定時清理
- linux定時任務之清理tomcat catalina.out日志
- logback過期日志檔案自動删除
- Linux(CentOS)定時任務删除Tomcat日志資訊(一)