Предположим, мы используем Logback для ведения журнала.
Требуется изменять путь к файлу журнала каждый раз, когда происходит определенное событие (т.е. вызов функции).
Например, где-то мы вызываем функцию.
startNewLogSegment("A")
После этого события регистратор должен начать запись в файл logs/mySegment_A.log
. Затем снова выполняется вызов:
startNewLogSegment("B")
После этого события регистратор должен завершить sh запись в предыдущий файл и начать запись в файл logs/mySegment_B.log
.
Давайте предположим, что состояние, измененное на startNewLogSegment
, должно быть видно во всем приложении (все потоки).
Я попытался применить подход с MD C:
logback. xml
...
<appender name="SIFTING_BY_ID" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>id</key>
<defaultValue>initial</defaultValue>
</discriminator>
<sift>
<appender name="FULL-${id}" class="ch.qos.logback.core.FileAppender">
<file>logs/mySegment_${id}.log</file>
<append>false</append>
<encoder >
<pattern>%d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] [%-5level] %logger{36}.%M - %msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
...
и вызов MDC.put("id", "A")
, когда появляется пользовательское событие.
Но оно работает не так, как мне нужно.
Известно, что MD C управляет контекстной информацией для каждого потока , поэтому, по крайней мере, нам нужно контроль над созданием потоков для достижения sh цели, описанной выше .
Интересно, можно ли использовать этот подход с Spring и, в частности, с асинхронными c операциями, выполняемыми Spring Reactor. Я не нашел информации об использовании пользовательского пула потоков для внутренних операций Spring.
Возможно, я надеюсь, что есть более простой способ настроить ведение журнала таким образом, не используя внутренние ресурсы Spring.