在Tomcat中记录Web应用程序中的所有抛出的异常

时间:2013-10-30 13:00:43

标签: java exception-handling tomcat7 nfs

你知道吗并记录所有抛出的异常(无论是否被捕获和处理)?

这是我的问题:有一个应用程序,我无法更改,有时它会出现创建锁文件的问题(下面的相关代码)。当它调用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,并显示消息:“没有锁可用”。

对Hans Maes的称赞

1 个答案:

答案 0 :(得分: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);
    }
}

}

编译成一个类文件,然后将-Xbootclasspath:/ directoryWhereClassFileIsLocated /添加到tomcat选项中。