Tomcatのログをローテートさせて一定期間で削除する。

Tomcatのアクセスログが膨らむので、早めに捨ててしまいたいなあ、と思いしました。

ログは定期的にログサーバに転送しているので、アプリケーションサーバ用のホストに残しておく必要はないという状況です。

スクリーンショット 2014-07-04 20.42.34

logrotateの設定

パッケージ管理ツールでインストールしているTomcatなんですが、標準出力とエラー出力のログであるcatalina.outはもともとローテートの設定が入っていました。

vim /etc/logrotate.d/tomcat7

もともと1年くらい残す設定になっていたんですが、1週間くらいで破棄するようにします。

/var/log/tomcat7/catalina.out
/var/log/tomcat7/access_log.txt
{
    copytruncate
    daily
    rotate 7
    compress
    missingok
    create 0644 tomcat tomcat
}

と、ここでaccess_log.txtと書いたんですが、Tomcatのデフォルト設定では、アクセスログの方は元々ローテートされるようになっていて、毎日ファイル名が変わってしまうようになっています。

アクセスログのローテートもlogrotateでおこなう

Tomcatは、catalina.outは単に吐き続けていて、logrotateがローテートをしています。

一方、アクセスログは、Tomcat自身がローテートさせています。

$ ls localhost_access_log.2014-07-*
localhost_access_log.2014-07-01.txt  localhost_access_log.2014-07-02.txt  localhost_access_log.2014-07-03.txt  localhost_access_log.2014-07-04.txt

ローテートしているのは良いですが、古いログを破棄できないですし、ファイル名が毎日変わっているせいで、logrotateの設定も書けない・・・。

ということで、どちらもまとめてlogrotateでローテートさせてしまうために、Tomcatにはアクセスログをローテートしないでもらって、access_log.txtという単一のファイルに吐き続けてもらうことにします。

Tomcatのアクセスログを固定のファイルに吐き出す

Tomcatのアクセスログの設定は、server.xmlにあります。

vim /etc/tomcat7/server.xml

server.xmlからAccessLogValveの設定を探して、rotatableをfalseにしたら、Tomcat自身はアクセスログをローテートしなくなります。

<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
    prefix="access_log" suffix=".txt"
    rotatable="false"
    pattern="combined"
    requestAttributesEnabled="true" />

あとファイル名に日付が入っていると、logrotateの設定が書きにくいので、日付もつかないようにして、access_log.txtという固定のファイル名に保存するようにします。

あとはlogrotateに任せる

Tomcat自身がアクセスログをローテートしないようにしたら、あとはlogrotateに任せます。

$ ls -h access_log.txt-*
access_log.txt-20140628.gz  access_log.txt-20140629.gz  access_log.txt-20140630.gz  access_log.txt-20140701.gz  access_log.txt-20140702.gz  access_log.txt-20140703.gz  access_log.txt-20140704.gz

ちゃんと7日分だけ残るようになりました!

About katty0324

Comments are closed.

Scroll To Top