Logstash / Gelf не хранит все MDC - PullRequest
0 голосов
/ 19 мая 2019

Я использую Logstash / Gelf в качестве инструментов журнала в моем приложении. Я следую этому примеру для настройки моего регистратора как 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? Любая помощь будет оценена!

Обновлено: Я думаю, что мой JsonLogstandalone.xml) размещен в неправильном месте, потому что он регистрирует org.somepackgs.SoapLogHandler, и основной поток приложения происходит в interceptor, но когда я размещаю JsonLog для org.somepackgs.GeneralInterceptor, SOAP-XML больше не регистрируется.

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Я разместил свой JsonLog (в standalone.xml) в неправильном месте, потому что все MDC s не инициализируются при запуске org.somepackgs.SoapLogHandler, поэтому мне нужно создать класс с именем 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);
    }
}

и в standalone.xml установите jsonLog на FinalLogger:

<logger category="org.somepackgs.FinalLogger" use-parent-handlers="true">
    <level name="INFO"/>
    <handlers>
        <handler name="JsonLog"/>
    </handlers>
</logger>

Поскольку вызов FinalLogger в конце каждого запроса, поэтому во время выполнения все MDC s были инициализированы и в это время сохранены в файле журнала json.

0 голосов
/ 19 мая 2019
<property name="dynamicMdcFields" value="mdc.*,(mdc|MDC)fields"/>

dynamicMdcFields оценивает каждое значение, которое вы вводите через регулярное выражение, которое вы предоставляете в его значении .
Возможно, вам нужно обновить регулярное выражение или обновите имена полей, которые вы указали в MDC

...