Я использую 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? Любая помощь будет оценена!
Обновлено: Я думаю, что мой JsonLog
(в standalone.xml
) размещен в неправильном месте, потому что он регистрирует org.somepackgs.SoapLogHandler
, и основной поток приложения происходит в interceptor
, но когда я размещаю JsonLog
для org.somepackgs.GeneralInterceptor
, SOAP-XML больше не регистрируется.