如何使用 log4j2 (json) 记录所有“引起的”异常?

问题描述 投票:0回答:1

Log4j2 提供

exception
exceptionRootCause
事件模板解析器。然而,这些只能访问顶层和底层异常。

所以当我有这个

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

我只看到

a
c
,但我看不到中间的任何东西。 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"
  }
}
java log4j2
1个回答
0
投票

我可以为您提供一个将堆栈跟踪提取为

String
的功能。所以而不是做

log.error("Exception", c);

你可以做

log.error("Exception {}", TextUtils.getStacktrace(c));

log.error("Exception " + TextUtils.getStacktrace(c));

TextUtils
类是我编写和维护的 MgntUtils 开源 Java 库的一部分。方法
getStacktrace()
可以将 Stacktrace 提取为完整或智能过滤格式的
String
。您可以在TextUtils Javadoc中查看详细信息。该库本身可以在 Maven Central 上作为 Maven 工件 或在 GitHub 上找到(打包为 jar 文件,并且单独提供源代码和 Javadoc)

© www.soinside.com 2019 - 2024. All rights reserved.