tomcat中的项目一般都会配置日志打印,方便调试与bug追踪定位,但是如果项目日志不定期清理,可能会导致日志文件越来越大,最后甚至撑爆硬盘,因此实现tomcat日志自动清理还是很有必要的,实现方案也很多,有些方案就不细说了,可以提供些思路,根据自己的需求可以自行选择使用。
一、配置滚动日志实现
一般日志都是使用log4j或log4j2来实现,现在很多基本都在逐步过渡到1og4j2,springboot默认集成logback,但性能都不及log4j2,有兴趣的可以看下这篇文章:
文章目录展开 一、常用日志框架类型 二、常用日志框架与slf4j的区别 三、为什么选择Log4j2 四、Spr […]
针对log4j,我们一般常用的日志配置是
DailyRollingFileAppender
和RollingFileAppender
,DailyRollingFileAppender
可以对日志按日期指定monthly(每月)、 weekly(每周)、daily(每天)、half-daily(每半天)、hourly(每小时)和minutely(每分钟)六个频度来存储,便于查找,但缺点就是不能自动清理,随着时间的推移越积累越多。RollingFileAppender
可以配置MaxFileSize
和MaxBackupIndex
这两个属性来实现自动清理的目的,比如配置如下:
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日志自动定时清理有很多种方式,选择一种适合自己的最好!