2016-05-08 2 views
4

私たちのcatalina.outファイルは非常に大きくなります(これを防ぐために私のアプリケーションではslf4jとlogbackを実装しています)。しかし今のところ、ログを循環させるとき、catalina.outをcatalina {date}にコピーし、cat /dev/null > catalina.outを実行します。問題は、Tomcatが次の朝に再起動するまで、Tomcatがそれ以降ログを取得しないことです。これは理想的ではありません。なぜこれが起こるのですか?それを避ける方法はありますか?さらなるロギングを無効にすることなくcatalina.outをクリアするには?

+0

古いcatalina.outをバックアップするときに 'mp'ではなく' cp'を実行していますか? –

答えて

7

ケーキとして簡単:echo > catalina.out。ファイル記述子は変更されず、javaはそのファイルへの書き込みを続けることができます。

+0

cat/dev/nullがそれを変更するのはなぜ、エコーはしないのかなど、ファイル記述子の変更はしないでください。 – Jibbyj

+0

@ジビービー、正直言って。私は知らない。それはその仕事をします。 –

1

あなたが探しているのはログのローテーションです。プロセスが実行されている間は低レベルのsignal supportが必要なので、これを間接的に行う必要があります。これを実現するにはthis procedureを使用できます。これはTomcat Wikiにも記載されています。

6

伝統的な方法は、それは、ログファイルをクリアし、現在開いているファイルハンドルを保持しているプロセスは中断されません

cat /dev/null > catalina.out 

にあります。

より良い方法は、ログファイルを回転させることによって、ログ情報を失わないことです。これを行うには、ファイル/etc/logrotate.d/tomcatを作成または編集し、その内容を持っているために、

/var/log/tomcat/catalina.out { copytruncate daily rotate 7 compress missingok size 5M } 

は、次に(ルートとして)コマンドを使用して、logrotateの

/usr/sbin/logrotate /etc/logrotate.conf 

を再起動して読み、あなたはログファイルが毎日出て回転させる必要がありますまたはサイズが5Mを超えた場合、デバッグの目的で最後の7つのログが保持されます。

+0

tomcat catalina.outファイルのパスが異なる場合は、ログファイルの場所を変更する必要があります。同様に、あなたはlogrotateについて読むことができ、好きなように他の値を変更することができます。 –

+0

私は伝統的な方法を使用しましたが、間違いなく現在開いているファイルハンドルを保持しているプロセスを混乱させるようです... – Jibbyj

+0

作成しているlogrotateファイルの内容を説明すると非常に役に立ちます。また、 'tomcat'というファイルを作成するのは、プロセス名が正しい場合にのみ適切です。例えば、tomcat7のUbuntu 14では、プロセスは実際には 'tomcat7'です。 – Madbreaks

3

ファイルを切り捨てることができます。これは本質的にあなたがしようとしているものなので、論理的にも意味があります。

truncate -s 0 M catalina.out

FYI:cat /dev/null > fileを行うと、ファイルのinodeを変更しません。

logs]$ls -i test.log 
19794063 test.log 
logs]$ 
logs]$cat /dev/null > test.log 
logs]$ls -i test.log 
19794063 test.log 

また、私はこれらのコマンドの間にtest.logにライブデータを尾行別のコマンドを持っていました。これらのコマンドを実行した後、test.logへのテールは問題なく動作しました。これはなぜそれが動作を停止したとしてあなたの質問に答えることはありませんが、inodeの変更を排除するのに役立ちます。

+0

切り詰めがcat/dev/nullより優れている理由を教えてください。 – Jibbyj

+0

@Jibbyj opはファイルを切り捨てる方法を尋ねました。私は疑問はなぜ 'truncate'を使うのではなく、' echo/dev/null> catalina.out'だと思います。後者は意味的にも技術的にも正しい方法です。 – Madbreaks

関連する問題