首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >防止log4j2 JsonTemplateLayout将堆栈跟踪追加到其他JSON字段

防止log4j2 JsonTemplateLayout将堆栈跟踪追加到其他JSON字段
EN

Stack Overflow用户
提问于 2022-11-02 20:45:13
回答 1查看 17关注 0票数 0

我正在使用JsonTemplateLayout,并设置了一个JSON模板,该模板将堆栈跟踪信息添加到stack字段。

但是,在记录异常时,除了放置在堆栈字段中的字符串化堆栈跟踪之外,它还会附加到模板中指定的其他自定义字段中。

我不确定是哪一点配置(或缺少配置)导致了这种情况。

我无法在模板中找到可以避免这种情况的设置。

下面是我的模板:

代码语言:javascript
复制
{
  "level": {
    "$resolver": "level",
    "field": "name"
  },
  "message": {
    "$resolver": "message",
    "stringified": true
  },
  "timestamp": {
    "$resolver": "timestamp",
    "pattern": {
      "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
      "timeZone": "UTC"
    }
  },
  "logger": {
    "$resolver": "logger",
    "field": "name"
  },
  "service": {
    "$resolver": "pattern",
    "pattern": "${env:FOO_SERVICE}"
  },
  "component": {
    "$resolver": "pattern",
    "pattern": "${env:FOO_COMPONENT}"
  },
  "exception": {
    "exception_class": {
      "$resolver": "exception",
      "field": "className"
    },
    "exception_message": {
      "$resolver": "exception",
      "field": "message"
    },
    "stacktrace": {
      "$resolver": "exception",
      "field": "stackTrace",
      "stackTrace": {
        "stringified": true
      }
    }
  },
  "line_number": {
    "$resolver": "source",
    "field": "lineNumber"
  }
}

控制台附录是设置的,默认情况下包括堆栈跟踪信息。它引用了位于类路径上的上述log4j2布局。

代码语言:javascript
复制
<Appenders>
  <Console name="Console" target="SYSTEM_OUT">
    <JsonTemplateLayout eventTemplateUri="classpath:log4j2-layout.json"/>
  </Console>
</Appenders>

下面是一个记录异常的示例。如果仔细观察,您将看到一些字段(如servicecomponent )正在设置它们指定的环境变量值,但它们也有字符串化的堆栈跟踪。

代码语言:javascript
复制
{"level":"INFO","message":"Force trigger exception","timestamp":"2022-11-02T20:37:35.270Z","logger":"foo.example.acme.system.connector.dataset.EchoAPI","service":"example1 java.lang.Exception: This is a forced exception\n\tat foo.example.acme.system.connector.dataset.EchoAPI.handle(EchoAPI.java:18) ~[classes/:?]\n\tat foo.example.acme.system.connector.ConnectorApi.handle(ConnectorApi.java:33) ~[classes/:?]\n\tat somesystem.com.connector.undertow.UndertowHandler.handleBody(UndertowHandler.java:131) ~[classes/:?]\n\tat io.undertow.io.AsyncReceiverImpl.receiveFullBytes(AsyncReceiverImpl.java:366) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat somesystem.com.connector.undertow.UndertowHandler.handleRequest(UndertowHandler.java:61) ~[classes/:?]\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:387) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282) ~[xnio-api-3.8.7.Final.jar:3.8.7.Final]\n\tat java.lang.Thread.run(Thread.java:832) ~[?:?]\n","component":"example2 java.lang.Exception: This is a forced exception\n\tat foo.example.acme.system.connector.dataset.EchoAPI.handle(EchoAPI.java:18) ~[classes/:?]\n\tat foo.example.acme.system.connector.ConnectorApi.handle(ConnectorApi.java:33) ~[classes/:?]\n\tat somesystem.com.connector.undertow.UndertowHandler.handleBody(UndertowHandler.java:131) ~[classes/:?]\n\tat io.undertow.io.AsyncReceiverImpl.receiveFullBytes(AsyncReceiverImpl.java:366) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat somesystem.com.connector.undertow.UndertowHandler.handleRequest(UndertowHandler.java:61) ~[classes/:?]\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:387) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852) ~[undertow-core-2.2.19.Final.jar:2.2.19.Final]\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423) ~[jboss-threads-3.1.0.Final.jar:3.1.0.Final]\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282) ~[xnio-api-3.8.7.Final.jar:3.8.7.Final]\n\tat java.lang.Thread.run(Thread.java:832) ~[?:?]\n","exception":{"exception_class":"java.lang.Exception","exception_message":"This is a forced exception","stacktrace":"java.lang.Exception: This is a forced exception\n\tat foo.example.acme.system.connector.dataset.EchoAPI.handle(EchoAPI.java:18)\n\tat foo.example.acme.system.connector.ConnectorApi.handle(ConnectorApi.java:33)\n\tat somesystem.com.connector.undertow.UndertowHandler.handleBody(UndertowHandler.java:131)\n\tat io.undertow.io.AsyncReceiverImpl.receiveFullBytes(AsyncReceiverImpl.java:366)\n\tat somesystem.com.connector.undertow.UndertowHandler.handleRequest(UndertowHandler.java:61)\n\tat io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)\n\tat io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:852)\n\tat org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)\n\tat org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2019)\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1558)\n\tat org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1423)\n\tat org.xnio.XnioWorker$WorkerThreadFactory$1$1.run(XnioWorker.java:1282)\n\tat java.base/java.lang.Thread.run(Thread.java:832)\n"}}

我还尝试将stringified设置为false,并设置添加到的自定义字段,以便嵌套--例如foo.componentfoo.service,但这也没有帮助。

我使用的是最新的log4j2版本-- 2.19.0 (也尝试了稍早的版本)。

EN

回答 1

Stack Overflow用户

发布于 2022-11-03 17:01:12

经过相当一段时间的堆叠溢出后,我发现了这种行为的原因。

请参阅:使用json模板布局log4j2在Json日志中写入串行no时处理异常堆栈跟踪

tldr;

堆栈跟踪被附加到使用pattern解析器的所有字段。

例如:

代码语言:javascript
复制
"component": {
    "$resolver": "pattern",
    "pattern": "${env:FOO_COMPONENT}"
}

之所以会发生这种情况,是因为在为每个包含异常堆栈跟踪的日志事件从主JsonTemplateLayout委托给PatternLayout时,会继承JsonTemplateLayout(默认情况下是真/启用)。

快速解决方法是对每个使用pattern解析器的字段禁用它。

例如:

代码语言:javascript
复制
"component": {
    "$resolver": "pattern",
    "pattern": "${env:FOO_COMPONENT}",
    "stackTraceEnabled": false
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74295431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档