如何实现tomcat日志自动定时清理

Java技术 潘老师 3年前 (2021-10-26) 1613 ℃ (0) 扫码查看

tomcat中的项目一般都会配置日志打印,方便调试与bug追踪定位,但是如果项目日志不定期清理,可能会导致日志文件越来越大,最后甚至撑爆硬盘,因此实现tomcat日志自动清理还是很有必要的,实现方案也很多,有些方案就不细说了,可以提供些思路,根据自己的需求可以自行选择使用。

一、配置滚动日志实现

一般日志都是使用log4j或log4j2来实现,现在很多基本都在逐步过渡到1og4j2,springboot默认集成logback,但性能都不及log4j2,有兴趣的可以看下这篇文章:

SpringBoot如何整合Log4j2实现日志记录

文章目录 一、常用日志框架类型 二、常用日志框架与slf4j的区别 三、为什么选择Log4j2 四、Sprin […]

针对log4j,我们一般常用的日志配置是DailyRollingFileAppenderRollingFileAppenderDailyRollingFileAppender可以对日志按日期指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度来存储,便于查找,但缺点就是不能自动清理,随着时间的推移越积累越多。
RollingFileAppender可以配置MaxFileSizeMaxBackupIndex这两个属性来实现自动清理的目的,比如配置如下:

log4j.appender.R=org.apache.log4j.RollingFileAppender  
log4j.appender.R.Threshold=DEBUG  
log4j.appender.R.File=test.log  
log4j.appender.R.layout=org.apache.log4j.PatternLayout  
log4j.appender.R.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%5p] - %c -%F(%L) -%m%n
log4j.appender.R.MaxFileSize=20MB
log4j.appender.R.MaxBackupIndex=10

RollingFileAppender使用MaxFileSize设置一个日志文件的最大大小,当产生多个日志时,会在日志名称后面加上”.1″、”.2″、……这样的后缀,我们可以看到RollingFileAppender有个属性MaxBackupIndex,这个属性通过限制日志文件名后缀”.n”中的n大小来限制日志数量,比如上面MaxBackupIndex=10,其实最大日志数量为11。这样就实现了日志滚动覆盖,不会导致无限占用空间,存在空间上限。

<param name="MaxFileSize" value="1024000" /> 

二、shell脚本实现

如果偏要使用DailyRollingFileAppender实现日志定时清理,有两种方案,第一种就是在程序中写个定时任务去定时删除过期的日志文件,这个代码量有点多就不贴出来了,另外一种是使用Liunx系统中的shell脚本定时去实现删除指定目录的过期日志文件。
比如可以新建一个名为auto-clean-10day-ago-log.sh脚本,注意脚本要设置为unix格式,内容如下:

#! /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

三、使用log4j2

log4j不支持定时删除过期日志,但log4j2支持,可以通过DefaultRolloverStrategy配置实现,具体案例如下:

<?xml version="1.0" encoding="utf-8" ?>
<Configuration status="INFO">
    <Appenders>
        <RollingFile name="runtimeFile" fileName="./logs/active.log" filePattern="./logs/%d{yyyy-MM-dd.HH}.log" append="true">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS Z}\t%level\t%class\t%line\t%thread\t%msg%n" />
            <Policies>
                <TimeBasedTriggeringPolicy />
            </Policies>
            <!-- 此行以下为自动清理日志的配置 -->
            <DefaultRolloverStrategy>
                <Delete basePath="./logs">
                    <!-- glob 项为需要自动清理日志的pattern -->

                    <IfFileName glob="*.log"/>
                    <!-- 1d 表示自动清理掉1天以前的日志文件 -->
                    <IfLastModified age="24H"/>

                </Delete>
            </DefaultRolloverStrategy>
            <!-- 此行以上为自动清理日志的配置 -->
        </RollingFile>
    </Appenders>
    <Loggers>
        <Root level="INFO" additivity="false">
            <!--<AppenderRef ref="console" />-->
            <AppenderRef ref="runtimeFile" />
        </Root>
    </Loggers>
</Configuration> 

总而言之,实现tomcat日志自动定时清理有很多种方式,选择一种适合自己的最好!


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/java/3878.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】