Logstash/Gelf 未存储所有 MDC
Logstash/Gelf not stored all MDCs
我正在使用 Logstash/Gelf as a log-tools in my application. I follow this sample 将我的记录器设置为 JSON
文件。这是我的 wildfly 配置 (standalone.xml
):
<profile>
<subsystem xmlns="urn:jboss:domain:logging:3.0">
<periodic-rotating-file-handler name="JsonLog" autoflush="true">
<level name="ALL"/>
<formatter>
<named-formatter name="JsonFormatter"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.json"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
...
<logger category="org.somepackgs.SoapLogHandler" use-parent-handlers="true">
<level name="INFO"/>
<handlers>
<handler name="JsonLog"/>
</handlers>
</logger>
...
<formatter name="JsonFormatter">
<custom-formatter module="biz.paluch.logging" class="biz.paluch.logging.gelf.wildfly.WildFlyJsonFormatter">
<properties>
<property name="version" value="1.0"/>
<property name="facility" value="java-test"/>
<property name="fields" value="Time,Severity"/>
<property name="extractStackTrace" value="true"/>
<property name="filterStackTrace" value="true"/>
<property name="includeLogMessageParameters" value="true"/>
<property name="includeLocation" value="true"/>
<property name="mdcProfiling" value="true"/>
<property name="timestampPattern" value="yyyy-MM-dd HH:mm:ss,SSS"/>
<property name="mdcFields" value="requestId"/>
<property name="dynamicMdcFields" value="mdc.*,(mdc|MDC)fields"/>
<property name="includeFullMdc" value="true"/>
</properties>
</custom-formatter>
</formatter>
</subsystem>
</profile>
在 SoapLogHandler
中,我在 MDC
中放置了一些字段,我的应用程序有一个 GeneralInterceptor
用于检查一些业务逻辑,我想记录一些额外的字段(如结果、持续时间)处理请求后:
@AroundInvoke
public Object run(InvocationContext ictx) throws Exception {
MDC.put("requestId", UUID.randomUUID());
try{
//other codes & business checks...
obj = ictx.proceed();
} catch (Exception ex) {
} finally {
logAfterInvokation(ictx);
}
}
在logAfterInvokation
方法中,我在MDC
中添加了一些额外的字段(如结果、持续时间);但是当 obj = ictx.proceed();
行运行时,Logstash 会自动将一些字段存储在 server.json
文件中,而我的额外字段永远不会添加到该文件中,这是我的 server.json
文件的一个节点:
{
"short_message": "short message text...",
"full_message": "full message text...",
"timestamp": "1558244976.376",
"level": "6",
"facility": "java-test",
"logType": "entry",
"LoggerName": "org.somepackgs.SoapLogHandler",
"fieldName1": "fieldValue1",
"destination": "destination1",
"Time": "2019-05-19 10:19:36,376",
"Severity": "INFO",
"source": "my-App",
"Thread": "default task-1",
"SourceMethodName": "logMessage",
"SourceSimpleClassName": "SoapLogHandler",
"requestId": "d4d8482f-e9ae-4f31-acce-1629515a2ffd",
"SourceClassName": "org.somepackgs.SoapLogHandler"
}
那么为什么 Logstash 不存储所有 MDC
内容?或者如何将我的所有 MDC
内容存储到 json 文件?任何帮助将不胜感激!
更新: 我认为我的 JsonLog
(在 standalone.xml
中)放置在错误的位置,因为它记录了 org.somepackgs.SoapLogHandler
和主应用程序的流程发生在 interceptor
,但是当我为 org.somepackgs.GeneralInterceptor
放置 JsonLog
时,SOAP-XML 不再记录。
<property name="dynamicMdcFields" value="mdc.*,(mdc|MDC)fields"/>
dynamicMdcFields 评估您在其 value.
中提供的通过正则表达式输入的每个值
可能,您需要更新您的 regex 或更新您在 MDC
中输入的字段名称
我把我的 JsonLog(在 standalone.xml
中)放在错误的位置,因为在 org.somepackgs.SoapLogHandler
运行时所有 MDC
s 都没有初始化,所以我需要创建一个 class 使用名称 FinalLogger
并调用此 class 的一种方法在 obj = ictx.proceed();
行之后进行记录,如下所示:
FinalLogger.logInfo("some text.");
和FinalLogger
如下:
package org.somepackgs;
import org.apache.log4j.Logger;
public class FinalLogger {
private static Logger logger = Logger.getLogger(FinalLogger.class);
public static void logInfo(String message) {
logger.info(message);
}
}
并在 standalone.xml
中输入 json登录 FinalLogger
:
<logger category="org.somepackgs.FinalLogger" use-parent-handlers="true">
<level name="INFO"/>
<handlers>
<handler name="JsonLog"/>
</handlers>
</logger>
因为 FinalLogger
在每个 rquest 结束时调用,所以在 运行 时,所有 MDC
都已初始化,此时存储在 json日志文件。
我正在使用 Logstash/Gelf as a log-tools in my application. I follow this sample 将我的记录器设置为 JSON
文件。这是我的 wildfly 配置 (standalone.xml
):
<profile>
<subsystem xmlns="urn:jboss:domain:logging:3.0">
<periodic-rotating-file-handler name="JsonLog" autoflush="true">
<level name="ALL"/>
<formatter>
<named-formatter name="JsonFormatter"/>
</formatter>
<file relative-to="jboss.server.log.dir" path="server.json"/>
<suffix value=".yyyy-MM-dd"/>
<append value="true"/>
</periodic-rotating-file-handler>
...
<logger category="org.somepackgs.SoapLogHandler" use-parent-handlers="true">
<level name="INFO"/>
<handlers>
<handler name="JsonLog"/>
</handlers>
</logger>
...
<formatter name="JsonFormatter">
<custom-formatter module="biz.paluch.logging" class="biz.paluch.logging.gelf.wildfly.WildFlyJsonFormatter">
<properties>
<property name="version" value="1.0"/>
<property name="facility" value="java-test"/>
<property name="fields" value="Time,Severity"/>
<property name="extractStackTrace" value="true"/>
<property name="filterStackTrace" value="true"/>
<property name="includeLogMessageParameters" value="true"/>
<property name="includeLocation" value="true"/>
<property name="mdcProfiling" value="true"/>
<property name="timestampPattern" value="yyyy-MM-dd HH:mm:ss,SSS"/>
<property name="mdcFields" value="requestId"/>
<property name="dynamicMdcFields" value="mdc.*,(mdc|MDC)fields"/>
<property name="includeFullMdc" value="true"/>
</properties>
</custom-formatter>
</formatter>
</subsystem>
</profile>
在 SoapLogHandler
中,我在 MDC
中放置了一些字段,我的应用程序有一个 GeneralInterceptor
用于检查一些业务逻辑,我想记录一些额外的字段(如结果、持续时间)处理请求后:
@AroundInvoke
public Object run(InvocationContext ictx) throws Exception {
MDC.put("requestId", UUID.randomUUID());
try{
//other codes & business checks...
obj = ictx.proceed();
} catch (Exception ex) {
} finally {
logAfterInvokation(ictx);
}
}
在logAfterInvokation
方法中,我在MDC
中添加了一些额外的字段(如结果、持续时间);但是当 obj = ictx.proceed();
行运行时,Logstash 会自动将一些字段存储在 server.json
文件中,而我的额外字段永远不会添加到该文件中,这是我的 server.json
文件的一个节点:
{
"short_message": "short message text...",
"full_message": "full message text...",
"timestamp": "1558244976.376",
"level": "6",
"facility": "java-test",
"logType": "entry",
"LoggerName": "org.somepackgs.SoapLogHandler",
"fieldName1": "fieldValue1",
"destination": "destination1",
"Time": "2019-05-19 10:19:36,376",
"Severity": "INFO",
"source": "my-App",
"Thread": "default task-1",
"SourceMethodName": "logMessage",
"SourceSimpleClassName": "SoapLogHandler",
"requestId": "d4d8482f-e9ae-4f31-acce-1629515a2ffd",
"SourceClassName": "org.somepackgs.SoapLogHandler"
}
那么为什么 Logstash 不存储所有 MDC
内容?或者如何将我的所有 MDC
内容存储到 json 文件?任何帮助将不胜感激!
更新: 我认为我的 JsonLog
(在 standalone.xml
中)放置在错误的位置,因为它记录了 org.somepackgs.SoapLogHandler
和主应用程序的流程发生在 interceptor
,但是当我为 org.somepackgs.GeneralInterceptor
放置 JsonLog
时,SOAP-XML 不再记录。
<property name="dynamicMdcFields" value="mdc.*,(mdc|MDC)fields"/>
dynamicMdcFields 评估您在其 value.
中提供的通过正则表达式输入的每个值
可能,您需要更新您的 regex 或更新您在 MDC
我把我的 JsonLog(在 standalone.xml
中)放在错误的位置,因为在 org.somepackgs.SoapLogHandler
运行时所有 MDC
s 都没有初始化,所以我需要创建一个 class 使用名称 FinalLogger
并调用此 class 的一种方法在 obj = ictx.proceed();
行之后进行记录,如下所示:
FinalLogger.logInfo("some text.");
和FinalLogger
如下:
package org.somepackgs;
import org.apache.log4j.Logger;
public class FinalLogger {
private static Logger logger = Logger.getLogger(FinalLogger.class);
public static void logInfo(String message) {
logger.info(message);
}
}
并在 standalone.xml
中输入 json登录 FinalLogger
:
<logger category="org.somepackgs.FinalLogger" use-parent-handlers="true">
<level name="INFO"/>
<handlers>
<handler name="JsonLog"/>
</handlers>
</logger>
因为 FinalLogger
在每个 rquest 结束时调用,所以在 运行 时,所有 MDC
都已初始化,此时存储在 json日志文件。