Valveを介してアクセスログを作成するTomcatサーバーがあります( org.Apache.catalina.valves.FastCommonAccessLogValve )。このバルブは、アクセスログファイルのローテーションを処理しますが、しばらくした後の圧縮や削除は行いません。
現時点では、find [...] -mtime +30 [...]
を使用してログを圧縮および削除するcronジョブがあります。私はむしろlogrotateを使用したいので、ログローテーションはすべてのログの中央の場所にあります。 Tomcatのためだけに別のソリューションを用意するのは好きではありません。
Logrotateのドキュメントを読みましたが、まだ少し迷っています。ログファイルを圧縮してクリーンアップするためだけにlogrotateを使用できますか?どうすればいいですか?
または問題を解決し、ログファイルを圧縮してクリーンアップするTomcatアクセスログバルブはありますか?
お手伝いありがとうございます !
私が見たかなりシンプルなものはこのように動作します。
/etc/logrotate.dにTomcatと呼ばれる次のファイルを作成します。
/var/log/Tomcat/catalina.out {
copytruncate
daily
rotate 7
compress
missingok
}
これはdaily、compress esを実行し、7日間の価値を維持します(rotate 7)。 copytruncateは、元のファイルをコピーしてから切り捨てるため、Tomcatを再起動する必要がないことを意味します。 missing okがない場合でもエラーにはなりません。
Rotatable = falseを追加して、access.logバルブを回転しないように変更できます:-
<Valve className="org.Apache.catalina.valves.AccessLogValve
...
...
suffix="log" 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
驚くほど簡単です。特に回転させたいファイルをlogrotateに伝えてください。 nocreate
は、古いファイルを移動した後に空のファイルを再作成しないようにlogrotateに指示します(ファイルをサブフォルダーにローテーションしている場合)。
/var/log/Tomcat/catalina.out.* {
daily
nocreate
compress
missingok
}
Tomcatの設定を変更したくなかったので、回転したファイルを圧縮するスクリプトを作成しました
#!/ bin/bash # #TPP 2013-02-21 # #Tomcatアプリは、主にさまざまなロガーを使用しますlog4j。 #これらは、UNIXのログローテーションシステムであるlogrotateと競合して回転します。 # #一部のファイル(例:catalina.out #)は、日付を含むバックアップにローテーションされます。例: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` $のf (catalina * | grep -v bz2 | grep -v '$ DATE' | grep $ YEAR) do echo "bzip2 $ f" bzip2 $ f 完了 #ただし、日付を含んでいる間はアクティブなものもあります #。すべてが見つかり、「localhost *」のlの最新のものを圧縮しません'' opt-db * '' opt * '' Host-manager * '' manager * ' do export previous = for f for $(find $ l | grep -v bz2 | sort) do if ["$ {previous}"!= ""] then echo "bzip2 $ {previous}" bzip2 $ previous fi export previous = $ f done done exit 0
ここに提供される簡単な解決策。これには、s3アップロードオプションも含まれます。
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