У меня есть приложение Spring Boot (2.2.6), которое использует Log4j2 (с Slf4j). Log4j настроен на использование макета json, и в конце я хочу загрузить журналы в Datadog. Для этого 'serviceName' важно как поле в json.
. Теперь согласно документу log4j (https://logging.apache.org/log4j/2.x/manual/layouts.html#JSONLayout) можно добавить настраиваемое поле с помощью KeyValuePair. Теги и это работает. К сожалению, это нарушает нормальную структуру журналов пружин.
Log4j2. xml config:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Appenders>
<!-- Write logs to stdout, JSON, one line per log event -->
<Console name="Console" target="SYSTEM_OUT">
<JSONLayout compact="true" eventEol="true" includeStacktrace="true" locationInfo="true"
stacktraceAsString="true" properties="true">
<KeyValuePair key="serviceName" value="$${env:APPLICATION_NAME:-local}-sidecar"/> <!-- fine w/o this line -->
</JSONLayout>
</Console>
</Appenders>
<Loggers>
<Logger name="my.service" level="debug" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Logger name="org.apache" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<Root level="info">
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Журнал без настраиваемого поля:
{
"thread": "main",
"level": "INFO",
"loggerName": "com.nginxtrafficsidecar.ApplicationKt",
"message": "Starting ApplicationKt on xxx with PID 17300 (C:\\Users\\Felix\\Documents\\code\\nginx-traffic-sidecar\\build\\classes\\kotlin\\main started by Felix in C:\\Users\\Felix\\Documents\\code\\nginx-traffic-sidecar)",
"endOfBatch": false,
"loggerFqcn": "org.apache.commons.logging.LogAdapter$Log4jLog",
"threadId": 1,
"instant": {
"epochSecond": 1587975181,
"nanoOfSecond": 331370300
},
"source": {
"class": "org.springframework.boot.StartupInfoLogger",
"method": "logStarting",
"file": "StartupInfoLogger.java",
"line": 55,
"classLoaderName": "app"
},
"contextMap": {},
"threadPriority": 5
}
log с настраиваемым полем:
{
"logEvent": "Starting ApplicationKt on xxx with PID 9732 (C:\\Users\\Felix\\Documents\\code\\nginx-traffic-sidecar\\build\\classes\\kotlin\\main started by Felix in C:\\Users\\Felix\\Documents\\code\\nginx-traffic-sidecar)",
"serviceName": "local-sidecar"
}
В документе Spring указано, как это может работать с logback, но не с log4j (https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot -features-custom-log-configuration , конец главы)
Я искал, но не смог найти ничего полезного. Любые идеи, как я могу добавить пользовательское поле в журнал json, сохраняя при этом все поля, поступающие из Spring?
Спасибо, Феликс