我有一个Tomcat服务器,通过阀门创build访问日志( org.apache.catalina.valves.FastCommonAccessLogValve )。 此阀门负责旋转访问日志文件,但不会压缩或在一段时间后删除它们。
目前,我有一个使用find [...] -mtime +30 [...]压缩和删除日志的cron作业。 我宁愿使用logrotate,以便日志轮转处于所有日志的集中位置。 我不喜欢为Tomcat提供单独的解决scheme。
我试图读取logrotate文档,但我仍然有点失落。 我可以使用logrotate来压缩和清理日志文件吗? 我该怎么做?
或者绕过这个问题,有没有一个Tomcat的访问日志阀,将压缩和清理日志文件?
感谢您的帮助!
相当简单,我见过这样的作品。
在/etc/logrotate.d中创build一个名为tomcat的文件,其中包含以下内容:
/var/log/tomcat/catalina.out { copytruncate daily rotate 7 compress missingok }
这每天运行, 压缩文件,并保持7天价值( 旋转7 )。 copytruncate意味着它将复制,然后截断原始文件,以便不需要重新启动tomcat。 缺less好的不会错误,如果它不存在。
access.log Valve可以通过添加rotate = false来更改为不旋转: –
<Valve className="org.apache.catalina.valves.AccessLogValve ... ... rotatable=false/>
修改后的TimP脚本 – 添加删除非常旧的文件,添加扫描旧的压缩文件。
#!/bin/bash # # TPP 2013-02-21 # RJK 2014-08-14 # # Tomcat apps use a variety of loggers, mostly log4j. # These rotate, conflicting with logrotate, the unix log rotation system. # # Some files eg catalina.out # are rotated to a backup containing a date eg catalina.2013-01-06.log # which can then be compressed with bz2 to catalina.2013-01-06.log.bz2 # or removed if older than a given number of days(MTIME). # cd /var/log/tomcat6 # 2013-02-21 DATE=`date --rfc-3339=date` YEAR=`date +%Y` MILLENIUM=20 # 2014-08-14 MTIME=14 # 2014-08-14 #for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $YEAR) for f in $(find catalina* |grep -v bz2 |grep -v '$DATE' |grep $MILLENIUM) do # 2014-08-14 if test `find $f -mtime +$MTIME` then echo "rm -f $f" rm -f $f else echo "bzip2 $f" bzip2 $f fi done # However others are active whilst containing a date # so we will find all and not compress the most recent for l in 'localhost*' 'opt-db*' 'opt*' 'host-manager*' 'manager*' do export previous= for f in $(find $l |grep -v bz2 |sort) do if [ "${previous}" != "" ] then echo "bzip2 ${previous}" bzip2 $previous fi export previous=$f done done # 2014-08-14 for f in $(find *bz2) do if test `find $f -mtime +$MTIME` then echo "rm -f $f" rm -f $f fi done exit 0
我不想更改Tomcatconfiguration,所以创build了一个压缩旋转文件的脚本
#!/斌/庆典
#
#TPP 2013-02-21
#
#Tomcat应用程序使用各种logging器,大多数是log4j。
#这些旋转,与logrotate,unix日志旋转系统冲突。
#
#一些文件,例如catalina.out
#被旋转到包含date的备份,例如catalina.2013-01-06.log
#然后可以用bz2压缩到catalina.2013-01-06.log.bz2
#
cd / var / log / tomcat6
#2013-02-21
DATE =`date --rfc-3339 = date`
YEAR =`date+%Y`
for f in $(find catalina * | grep -v bz2 | grep -v'$ DATE'| grep $ YEAR)
做
回声“bzip2 $ f”
bzip2 $ f
DONE
#但是其他人在包含date的情况下是活跃的
#所以我们会find所有,而不是最近的压缩
在'本地主机*''opt-db *''opt *''host-manager *''manager *'
做
导出previous =
for $ in $(find $ l | grep -v bz2 | sort)
做
如果[“$ {previous}”!=“”]
然后
回声“bzip2 $ {previous}”
bzip2 $之前
科幻
以前导出= $ f
DONE
DONE
退出0
这非常简单。 只要告诉logrotate你特别想旋转的文件。 nocreate告诉logrotate在移动旧文件后不要重新创build一个空文件(如果你正在将文件旋转到子文件夹中)。
/var/log/tomcat/catalina.out.* { daily nocreate compress missingok }
对于local_access_log.YYYY-MM-DD.txt压缩我看到这篇文章后写了这个脚本:
#!/bin/bash # # If Tomcat uses server.xml config to rotate localhost_access_log, # the daily rotated logs will need compressing and old ones deleted to stop filling # the log partiton. Cannot use the system logrotate command as conficts with tomcat rotate # therefore run this script in a daily cronjob # # localhost_access_log.2015-09-03.txt # # Add this script in /etc/cron.daily/ owned by root # CATALINA_BASE=`ps aux | grep catalina.base | awk -F'catalina.base\=' '{print $2}' | awk '{print $1}'` if [ ! $CATALINA_BASE ] then if [ -r /var/lib/tomcat8 ] then CATALINA_BASE=/var/lib/tomcat8 else echo "Error: cannot find CATALINA_BASE" exit 1 fi fi cd ${CATALINA_BASE}/logs if [ $? -ne 0 ] then echo "Error, cannot cd to logs directory, quitting...." exit 1 fi # today's date (not to be gzipped) DATE=`date --rfc-3339=date` # number of days to keep MTIME=28 # Compress all previous days uncompressed logs for log in `ls localhost_access_log* | grep -v bz2 | grep -v $DATE` do bzip2 $log done # delete old logs find . -name "*.bz2" -mtime +$MTIME -exec rm {} \; exit 0
简单的解决scheme提供 这还包括s3上传选项。