我正在使用JsonTemplateLayout,并设置了一个JSON模板,该模板将堆栈跟踪信息添加到stack字段。
但是,在记录异常时,除了放置在堆栈字段中的字符串化堆栈跟踪之外,它还会附加到模板中指定的其他自定义字段中。
我不确定是哪一点配置(或缺少配置)导致了这种情况。
我无法在模板中找到可以避免这种情况的设置。
下面是我的模板:
{
"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布局。
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<JsonTemplateLayout eventTemplateUri="classpath:log4j2-layout.json"/>
</Console>
</Appenders>下面是一个记录异常的示例。如果仔细观察,您将看到一些字段(如service和component )正在设置它们指定的环境变量值,但它们也有字符串化的堆栈跟踪。
{"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.component和foo.service,但这也没有帮助。
我使用的是最新的log4j2版本-- 2.19.0 (也尝试了稍早的版本)。
发布于 2022-11-03 17:01:12
经过相当一段时间的堆叠溢出后,我发现了这种行为的原因。
请参阅:使用json模板布局log4j2在Json日志中写入串行no时处理异常堆栈跟踪
tldr;
堆栈跟踪被附加到使用pattern解析器的所有字段。
例如:
"component": {
"$resolver": "pattern",
"pattern": "${env:FOO_COMPONENT}"
}之所以会发生这种情况,是因为在为每个包含异常堆栈跟踪的日志事件从主JsonTemplateLayout委托给PatternLayout时,会继承JsonTemplateLayout(默认情况下是真/启用)。
快速解决方法是对每个使用pattern解析器的字段禁用它。
例如:
"component": {
"$resolver": "pattern",
"pattern": "${env:FOO_COMPONENT}",
"stackTraceEnabled": false
}https://stackoverflow.com/questions/74295431
复制相似问题