3

javaでスローされたすべての例外(キャッチおよび処理されたかどうかにかかわらず)をログに記録する方法を知っていますか?

これが私の問題です:変更できないアプリケーションがあり、ロックファイルの作成に問題がある場合があります(以下の関連コード)。tryLock() メソッドを呼び出すと、30 秒間フリーズし (tryLock がノンブロッキングであるにもかかわらず)、失敗して戻ります (CANT_CREATE_LOCK)。ご覧のとおり、すべてのキャッチ層は、ログに記録することさえせずに、実際の問題を隠しています。

final File lockFile = new File(fooHomeDir, ".foo-home.lock");
try
{
    FileOutputStream stream = new FileOutputStream(lockFile);
    try
    {
        if (stream.getChannel().tryLock() == null)
        {
            return LockResult.HELD_BY_OTHERS;
        }
        this.fileOutputStream = stream;
        this.lockFile = lockFile;
        return LockResult.OK;
    }
    catch (OverlappingFileLockException overlappingFileLockException)
    {
        return LockResult.HELD_BY_OTHERS;
    }
    catch (IOException ie)
    {
        return LockResult.CANT_CREATE_LOCK;
    }
}
catch (FileNotFoundException fnfe)
{
    return LockResult.CANT_CREATE_LOCK;
}

私が望むこと: 例外の詳細を確認できます。

他の情報:

  • 環境はLinux、Java 1.7、Tomcat 7です。
  • fooHomeDir は、NFS でバックアップされたマウント ポイントを指します。
  • fooHomeDir の権限は変更されていません。
  • fooHomeDir の所有者は変更されていません。
  • fooHomeDir のファイル システムがいっぱいではありません。
  • SELinux など、干渉する可能性のあるものはありません。

基本的には、以前は動いていて、「突然」「理由もなく」止まってしまいました。というわけで現在調査中です。

アプリケーションのリモート デバッグを開始しますが、それまでは提案を歓迎します :-)

ありがとう、ジョー

アップデート

記録として、この問題の根本的な原因は、rpc.statd デーモンが停止したことです。したがって、ネイティブ ロック メカニズムは NFS で失敗しました。症状は、「利用可能なロックがありません」というメッセージを伴う IOException でした。

ハンス・メイスへの称賛

4

1 に答える 1

2

作成されたすべてのエラーをログに記録する Exception の独自の実装を作成できます。-Xbootclasspath:bootclasspathフラグを使用してクラスパスに追加します。「ベストプラクティス」としてはお勧めしませんが、少なくとも問題の原因を見つけることができます.

非常に簡単な例 (改善の余地あり)

package java.lang;

public class Exception extends Throwable {

public Exception() {
    super();
    String exception = "Exception";
    logWithStack(exception);

}

public Exception(String message) {
    super(message);
    logWithStack(message);
}

public Exception(String message, Throwable cause) {
    super(message, cause);
    logWithStack(message);
}

public Exception(Throwable cause) {
    super(cause);
    logWithStack(cause.getMessage());
}

protected Exception(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
    super(message, cause, enableSuppression, writableStackTrace);
    logWithStack(message);
}

private void logWithStack(String exception) {
    System.out.println(exception);
    for (StackTraceElement ste : Thread.currentThread().getStackTrace()) {
        System.out.println(ste);
    }
}

}

クラス ファイルにコンパイルしてから、Tomcat オプションに -Xbootclasspath:/directoryWhereClassFileIsLocated/ を追加します。

于 2013-10-30T13:19:21.213 に答える