Linux logrotateコマンドでJVMガベージコレクションログオプションを使用すると、奇妙な問題に遭遇しました。ローテーションが実行されると、JVMへの引数として指定されたファイルの最初の行のNUL(^ @)値が入力されます。
これがjava呼び出しだとしましょう(Test.classは/ home / test /にあります):
java -Xloggc:/home/test/test.log -cp / home / test / Test
このファイルのlogrotateの構成は次のとおりです。
/home/test/test.log {
56
個の
missingok
notifempty
copytruncate
nocreate nomailをローテーション
}
また、テストのために毎分ログを記録するcrontabエントリがあります。
* / 1 * * * * / usr / sbin / logrotate -f /etc/logrotate.d/gcLog
ファイルがlogrotateによって切り捨てられた場合でも、JVMは追加モードで書き込み、次の行を書き込むために使用されるある種のオフセットを保持するという結論に達しました(私は間違っている可能性があります)。
私の次のアイデアは、stdoutをtest.logファイルにリダイレクトしてみることです。私はこのjava呼び出しを使用し、logrotateとcronに同じ構成を維持しました。
java -verbose:gc -cp / home / test / Test> /home/test/test.log
ここでも、test.logがlogrotateによって切り捨てられると、新しく作成されたファイルの最初の行にNUL(^ @)値が入力されます。
グーグルを使って何も役に立たなかったと言う必要はありません。関連する一種のstackoverflowに関する別の質問を見つけましたが、Java Script Wrapperをセットアップすることができなかったため、これは機能しません。
誰かがこの問題に遭遇しましたか?なぜこれが起こっているのですか?より良い、回避策や解決策はありますか?アプリケーションへの呼び出しを出力を読み取るスクリプトにパイプして、Tomcatがログを記録し、catalina.outでstdoutをローテーションする方法を確認する必要があります(ここでいくつかのヘルプも評価されます)
Jboss7とJava6を実行している場所でも同じ問題が発生しました。GCファイルでNULLが取得され、それらは成長し続けました。
解決策は、GCをstdoutに記録し、次にstdoutをファイルに追加することでした。
簡単な例:
java -verbose:gc >> console.log
どうやら追加(>>)を使用すると、ファイル内の位置へのJava「ポインター」が取り除かれます。サーバーの再起動ごとにGCログがリセットされないようにすることで、時間の経過に伴う統計情報を取得できます。
少なくともIBM PMATツールは、sysoutをGC出力で解析するのに問題はありません。
最も簡単な解決策が最善の場合もあります:)
以前誰かが議論していたように、JavaがGCログのローテーションをサポートすることを望みますが、http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2011-April/002061.html
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加