Log4j2提供exceptionexceptionRootCause事件模板解析器.然而,这些只访问顶层和底层的异常.

所以当我有了这个

Throwable a = new RuntimeException("a");
Throwable b = new RuntimeException("b", a);
Throwable c = new RuntimeException("c", b);
log.error("Exception", c);

我只能看到ac,但我看不到中间的任何东西.Java对c.printStackTrace();本身就支持这一点.

java.lang.RuntimeException: c
Caused by: java.lang.RuntimeException: b
Caused by: java.lang.RuntimeException: a

如何在log4j中获取此信息?

我的配置:

{
  "exception": {
    "class_name": {
      "$resolver": "exception",
      "field": "className"
    },
    "message": {
      "$resolver": "exception",
      "field": "message"
    },
    "cause": {
      "class_name": {
        "$resolver": "exceptionRootCause",
        "field": "className"
      },
      "message": {
        "$resolver": "exceptionRootCause",
        "field": "message"
      },
      "stack_trace": {
        "$resolver": "exceptionRootCause",
        "field": "stackTrace",
        "stackTrace": {
          "elementTemplate": {
            "class_name": {
              "$resolver": "stackTraceElement",
              "field": "className"
            },
            "method": {
              "$resolver": "stackTraceElement",
              "field": "methodName"
            },
            "file": {
              "$resolver": "stackTraceElement",
              "field": "fileName"
            },
            "line": {
              "$resolver": "stackTraceElement",
              "field": "lineNumber"
            }
          }
        }
      }
    }
  },
  "line": {
    "$resolver": "source",
    "field": "lineNumber"
  },
  "class_name": {
    "$resolver": "source",
    "field": "className"
  },
  "@version": 1,
  "source_host": "${hostName}",
  "message": {
    "$resolver": "message"
  },
  "thread_name": {
    "$resolver": "thread",
    "field": "name"
  },
  "@timestamp": {
    "$resolver": "timestamp"
  },
  "level": {
    "$resolver": "level",
    "field": "name"
  },
  "file": {
    "$resolver": "source",
    "field": "fileName"
  },
  "method": {
    "$resolver": "source",
    "field": "methodName"
  },
  "logger_name": {
    "$resolver": "logger",
    "field": "name"
  }
}

推荐答案

在当前版本的JsonTemplateLayout中,这是不可能的.使用对象(即非-stringified)的堆栈跟踪解析由StackTraceObjectResolver执行.在那里,您可以看到只使用了throwable.getStackTrace(),也就是说,因果关系链没有被遍历.我认为你可以 Select 几个选项:

  1. 您可以实现自己的解析器.在这个问题上有extensive documentation个.
  2. 您可以将此功能作为功能贡献给项目.我强烈建议您先从公关开始讨论这个 idea ,然后再编写任何代码行.
  3. 您也可以赞助某个维护人员来开发此应用程序.有关详细信息,请参阅the support page.

Disclaimer:我是JTL的作者.

Java相关问答推荐

Spring Webocket:尽管凭据设置为False,但MLhttpsify和Fetch请求之间的CORS行为存在差异

Java JAR环境(JRE)是否支持模块?

现场观看Android Studio中的变化

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

不推荐使用的Environment.getExternalStorageDirectory().getAbsolutePath()返回的值不同于新的getExternalFilesDir(空)?

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

放气总是压缩整个街区吗?

在Java中如何从Executors.newFixedThreadPool(MAX_THREAD_COUNT())迁移到虚拟线程

Spring @Value default无法计算表达式

用OSQL创建索引

如何读取3个CSV文件并在控制台中按顺序显示?(Java)

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

在JDK Flight Recorder中只记录单个线程

除0错误/抱歉我的句子是PT

在一行中检索字符分隔字符串的第n个值

Java嵌套流查找任意值

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

持续时间--为什么在秒为负数的情况下还要做额外的工作?

Bash数组的单引号元素并使用空格连接

使用StringBuilder和append方法创建字符串时Java字符串内部方法的问题