中间件学习之定时清理Tomcat日志文件

引言

  • 场景描述

    部署在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: 控制输出日志的格式和编码。

参考链接

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值