天天看點

中間件學習之定時清理Tomcat日志檔案引言解決方案參考連結

中間件學習之定時清理Tomcat日志檔案

  • 引言
  • 解決方案
    • Linux定時任務
      • 操作步驟
      • 指令詳解
        • crontab
        • find
    • 配置過期日志自動删除
  • 參考連結

引言

  • 場景描述

    部署在tomcat下的web項目,随着項目運作時間的延長,會産生大量的日志檔案,如果不進行定期清理過期的日志檔案,磁盤會經常被占滿。

解決方案

Linux定時任務

  • 方案說明
    1. 建立以.sh結尾的shell腳本;
    2. 為腳本賦權;
    3. 建立并開啟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。

  • 常用指令
    # 列出時間表
        crontab -l 
    
        # 編輯時間表
        crontab -e 
    
        # 删除時間表
        crontab -d
    
               
    “-d”:基本不用,會把使用者所有的時間表都删除了,一般采用"-e"編輯,逐行删除無用的時間表

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日志資訊(一)