親バカエンジニアのナレッジ帳

webのエンジニアをやっており、日頃の開発で詰まったことや書き残しておきたいことを載せています。

Tomcatのログファイルを整理せよ!


Tomcatのデフォルトのログ設定

タイトルの通りですが、今回はTomcatのログファイルに関する設定についてです。
Tomcatはデフォルトの設定のままでは多くのログファイルを出力します。
ただ、中には運用上不要なものが多く、ログを出しっぱなしだとファイル数が増えるばかりでリソースを圧迫してしまいます。

そこで、今回はその設定方法を記します。
今回は以下の記事を参考にさせていただきました。

Tomcat の初期設定まとめ - Qiita

Tomcatで出力されるログファイル

  • catalina.out
  • catalina.YYYY-MM-DD.log
  • localhost.YYYY-MM-DD.log
  • manager.YYYY-MM-DD.log
  • host-manager.YYYY-MM-DD.log
  • localhost_access_log.YYYY-MM-DD.txt

このうち残すログファイルは以下2つで十分でしょう。

  • catalina.out
  • catalina.YYYY-MM-DD.log

ただしNginxやApacheなどと連携していない場合はlocalhost_access_log.YYYY-MM-DD.txtも残しておいた方がいいかもしれません。



catalina.outのローテート設定

ログファイルのローテート設定

今回はTomcat8で実施しているので、以下のファイルを編集します。(環境に合わせてください)

vim /etc/logrotate.d/tomcat8
/var/log/tomcat8/catalina.out {
    copytruncate
    daily
    rotate 10
    compress
    missingok
    dateext
    create 0644 tomcat tomcat

内容を簡単に説明しますと、

  • copytruncate:コピー後、元のログファイルの内容を消去する
  • daily:1日1回ローテーションを実行する
  • rotate:残す世代数(ファイル数と考えてもらえれば...環境に合わせて変更してください。)
  • compress:最新世代以外は圧縮する
  • missingok:指定のログファイルが存在していなくてもエラーを出さない
  • dateext:ファイル名の末尾に日付をつける
  • create 0644 tomcat tomcat:ログファイルの権限

となります。
なんのこっちゃっと思われるパラメータもあると思います。
もっと詳しく知りたい方は調べてみてください。

logrotateの設定確認

次に以下のコマンドで実行確認をしてみます。

logrotate -d /etc/logrotate.d/tomcat8

このコマンドはあくまで設定の確認であり、実際にローテーションされるわけではありません。
とりあえず実行前の確認用として見てみましょう。
以下のようにエラーなどが特に出力されていなければ問題ありません。

reading config file /etc/logrotate.d/tomcat8
reading config info for /var/log/tomcat8/catalina.out

Handling 1 logs

rotating pattern: /var/log/tomcat8/catalina.out  after 1 days (30 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/tomcat8/catalina.out
  log needs rotating
rotating log /var/log/tomcat8/catalina.out, log->rotateCount is 30
dateext suffix '-20190130'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
removing /var/log/tomcat8/catalina.out-20180513.gz
removing old log /var/log/tomcat8/catalina.out-20180513.gz
removing /var/log/tomcat8/catalina.out-20180520.gz
removing old log /var/log/tomcat8/catalina.out-20180520.gz
removing /var/log/tomcat8/catalina.out-20180527.gz
removing old log /var/log/tomcat8/catalina.out-20180527.gz
removing /var/log/tomcat8/catalina.out-20180603.gz
removing old log /var/log/tomcat8/catalina.out-20180603.gz
removing /var/log/tomcat8/catalina.out-20180610.gz
removing old log /var/log/tomcat8/catalina.out-20180610.gz
removing /var/log/tomcat8/catalina.out-20180617.gz
removing old log /var/log/tomcat8/catalina.out-20180617.gz
removing /var/log/tomcat8/catalina.out-20180624.gz
removing old log /var/log/tomcat8/catalina.out-20180624.gz
removing /var/log/tomcat8/catalina.out-20180701.gz
removing old log /var/log/tomcat8/catalina.out-20180701.gz
copying /var/log/tomcat8/catalina.out to /var/log/tomcat8/catalina.out-20190130
truncating /var/log/tomcat8/catalina.out
compressing log with: /bin/gzip
removing old log /var/log/tomcat8/catalina.out-20180708.gz

「log needs rotating」と表示されているように、実際にlogrotateを実行すればローテーションされるようになります。
以下のように「log does not need rotating」などが出ても、現時点でローテーションをする分のファイル数がないというだけで気にする必要はありません。

reading config file /etc/logrotate.d/tomcat8
reading config info for /var/log/tomcat8/catalina.out

Handling 1 logs

rotating pattern: /var/log/tomcat8/catalina.out  after 1 days (10 rotations)
empty log files are rotated, old logs are removed
considering log /var/log/tomcat8/catalina.out
  log does not need rotating

logrotateの実行

それでは以下のコマンドでlogrotateを実際に実行してみましょう。
本来はcronで実行されるものですが、実行タイミングまで待っていられない場合は以下コマンドで実行してみてください。

logrotate -f /etc/logrotate.d/tomcat

これでcatalina.outのファイルはローテート設定されるはずです。
すでにファイルが溜まっている方はファイルが減っていることを確認してください。



localhost.YYYY-MM-DD.logのローテート設定

localhost.YYYY-MM-DD.logの設定に関しては探してもイマイチわかりませんでした。。。
なので、以下を参考にcronでshellを実行しています。

Tomcatログローテートメモ書き - Qiita

shellファイルの場所に関しては、それぞれ環境に合わせて設置してください。

mkdir -p /etc/tomcat8/shell
vim /etc/tomcat8/shell/logDel.sh

過去10日分のログファイルのみ残す設定にしています。

#!/bin/bash
LOG_DIR=/var/log/tomcat8/
delfiles=`find ${LOG_DIR}*.log -mtime +10`
for a in $delfiles
do
    echo -e "delete file: ${a}" > /dev/null 2>&1
    rm -f ${a}
done

あとはこのファイルをcronで実行するようにスケジューリングすれば大丈夫です。
今回は4時に実行されるように設定しました。

0 4 * * * sh /etc/tomcat8/shell/logDel.sh



まとめ

だいぶ大胆にログファイルは整理しましたが、不要なものが大半だったので身軽になりました。
私の環境では2ファイルのみ残すようにしていますが、人によっては当然必要なログファイルの種類や過去分の数は変わってくると思うので、それぞれ環境に合わせて設定してみてください。


男の隠れ家 特別編集 必す?観たい注目の美術展2018-2019

男の隠れ家 特別編集 必す?観たい注目の美術展2018-2019

今、注目の超高濃度ビタミンC点滴療法

今、注目の超高濃度ビタミンC点滴療法

命の格差は止められるか ハーバード日本人教授の、世界が注目する授業(小学館101新書)

命の格差は止められるか ハーバード日本人教授の、世界が注目する授業(小学館101新書)