Logstash / Gelf未存储所有MDC

时间:2019-05-19 06:32:58

标签: java json java-ee logstash mdc

我在应用程序中使用Logstash/Gelf作为日志工具。我遵循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,并且主应用程序的流程发生在{{ 1}},但是当我将interceptor放在JsonLog时,SOAP-XML不再记录。

2 个答案:

答案 0 :(得分:0)

Array
(
    [created_at] => 2019-05-15 10:28:33
)

dynamicMdcFields 会评估您通过其提供的正则表达式输入的每个值。
可能您需要更新您的 regex 或更新您在 MDC

中输入的字段名称

答案 1 :(得分:0)

我将JsonLog(位于standalone.xml中)放置在错误的位置,因为MDC运行时未初始化所有org.somepackgs.SoapLogHandler,所以我需要创建一个名称为{{1的类}},并在FinalLogger行之后调用此类的一种方法进行记录,如下所示:

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); } } 中将jsonLog放在standalone.xml上:

FinalLogger

由于在每个rquest结束时进行了<logger category="org.somepackgs.FinalLogger" use-parent-handlers="true"> <level name="INFO"/> <handlers> <handler name="JsonLog"/> </handlers> </logger> 调用,因此在运行此命令时,所有FinalLogger都已初始化,并且当前存储在json日志文件中。