Настройка JSON-логов
Система поддерживает конфигурацию и отображение JSON-логов проекта Logback. Помимо стандартных параметров, таких как время сообщения, уровень логирования и т.д., система позволяет отображать в логах следующие параметры:
requestId
— уникальный идентификатор запроса; для внутренних запросов имеет значениеno_id
;clientIp
— IP-адрес отправителя запроса;queryId
(для REST-запросов) — идентификатор запроса, полученный по REST API;subjectId
(при использовании аутентификации) — идентификатор пользователя-владельца предоставленного авторизационного токена.
Чтобы настроить отображение идентификаторов запросов и пользователей в логах, отредактируйте файл logback.xml (см. пример файла ниже):
-
Перед объявлением
appender
добавьте строки:<conversionRule conversionWord="vcl" converterClass="io.reactiverse.contextual.logging.LogbackConverter"/>
-
В секцию
appender.providers.pattern
добавьте строки:"requestId": "%vcl{requestId:-no_id}", "clientIp": "%vcl{clientIp:-no_id}", "queryId": "%vcl{queryId:-no_id}", "subjectId": "%vcl{subjectId:-no_id}"
Ниже показан пример файла logback.xml с включенным отображением идентификаторов запросов и пользователей:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<conversionRule conversionWord="vcl"
converterClass="io.reactiverse.contextual.logging.LogbackConverter"/>
<appender name="rollingFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/application.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- daily rollover -->
<fileNamePattern>logs/application.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
<!-- keep 30 days' worth of history capped at 3GB total size -->
<maxHistory>7</maxHistory>
<totalSizeCap>3GB</totalSizeCap>
</rollingPolicy>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<omitEmptyFields>true</omitEmptyFields>
<pattern>
{
"timestamp": "%date{ISO8601}",
"logger": "%logger",
"level": "%level",
"thread": "%thread",
"requestId": "%vcl{requestId:-no_id}",
"clientIp": "%vcl{clientIp:-no_id}",
"queryId": "%vcl{queryId:-no_id}",
"subjectId": "%vcl{subjectId:-no_id}",
"message": "%message"
}
</pattern>
</pattern>
<stackTrace>
<throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
<maxDepthPerThrowable>30</maxDepthPerThrowable>
<maxLength>2048</maxLength>
<shortenedClassNameLength>20</shortenedClassNameLength>
<exclude>^sun\.reflect\..*\.invoke</exclude>
<exclude>^net\.sf\.cglib\.proxy\.MethodProxy\.invoke</exclude>
<rootCauseFirst>true</rootCauseFirst>
</throwableConverter>
</stackTrace>
</providers>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="rollingFile" />
</root>
</configuration>