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

标签 java exception-handling tomcat7 nfs

您知道在 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 守护进程死机了。 因此, native 锁定机制在 NFS 上失败。 症状是带有消息的 IOException:“没有可用的锁”。

感谢汉斯梅斯

最佳答案

您可以创建自己的 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/。

关于java - 在 Tomcat 的 Web 应用程序中记录所有抛出的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19682952/

相关文章:

java - .class 语法 MainActivity.class.getSimpleName();

asp.net - 捕获 System.Data.SqlClient.SqlException 错误

java - 使用来自另一个异常的堆栈跟踪初始化异常?

安装 SSL 证书时 Tomcat 没有响应

java - 将逗号分隔的字符串转换为 Json 字符串

java - 递归阶乘公式

java - 公钥和 keystore 不匹配

c - 纯 C 中的异常处理

Tomcat 不启动

spring - 在没有 Spring Security 的情况下,DelegatingFilterProxy 在 Spring MVC 应用程序上调用了两次