RollingFileAppender не работает при использовании внутри SiftingAppender
У меня есть следующие настройки входа
<appender name="TEST-SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator class="..."/>
<sift>
<appender name="ROLL-${fileName}" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>../log/${fileName}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<fileNamePattern>../log/${fileName}%i.log</fileNamePattern>
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>5MB</maxFileSize>
</triggeringPolicy>
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{36} - %msg%n</pattern>
</encoder>
</appender>
</sift>
</appender>
Класс дискриминатора возвращает значение путем анализа loggerName. Ключ определяется как "fileName".
Ролловер журналов прекрасно работает, когда я тестирую только RollingFileAppender (после замены ссылок на переменные ${fileName}
со статическим значением), но когда он вложен в SiftingAppender, журналы не переворачиваются. Я проверил аппрет "FileAppender"
и он может создать правильное имя файла на основе дискриминатора.
Я также протестировал ту же конфигурацию, используя дискриминатор, как
<discriminator>
<key>fileName</key>
<defaultValue>appname</defaultValue>
</discriminator>
и удаление class
тег. Это создает appname.log
но не переворачивается.
настройка debug="true"
не записывал дополнительную информацию в файл журнала.
Я что-то здесь упускаю? Как мне реализовать RollingFileAppender внутри SiftingAppender?
2 ответа
Я понял проблему с моей настройкой. Мой logback.xml имеет два RollingFileAppenders (один вложен в сифтер, а другой снаружи). Appender A писал в application.log, а Appender B в некоторых случаях также писал в application.log (т.е. ${fileName}
оценивается по заявке). Поэтому, если я удаляю appender A или переименовываю fileName Appender A, журналы переворачиваются в соответствии с настройками. Это, вероятно, означает, что Appender A или B не могут закрыть и переименовать файл, потому что другой appender все еще имеет блокировку?
Чтобы проверить это, я использовал AsyncAppender следующим образом:
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
где "FILE"
это имя Appender A. Использование этой конфигурации работает, но я вижу странное поведение, когда файлы не переносятся с указанным точным размером, а в некоторых случаях файлы переименовываются с индексом 10 и удаляются автоматически. Поскольку это поведение не очень надежно, на данный момент я избавился от Appender A.
<appender name="SIFT_FILE" class="ch.qos.logback.classic.sift.SiftingAppender">
<discriminator>
<key>traceType</key>
<defaultValue>UNSET</defaultValue>
</discriminator>
<sift>
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>%m%n</pattern>
</encoder>
<file>${LOG_PATH}/skyline-trace_${traceType}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<fileNamePattern>
${ROLLING_FILE_NAME_PATTERN:-${LOG_PATH}/skyline-trace_${traceType}.%d{yyyy-MM-dd}.%i.gz}
</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-20MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-7}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-0}</totalSizeCap>
</rollingPolicy>
</appender>
</appender>
</sift>
</appender>
<logger name="LocalFileLogger" level="DEBUG" additivity="false">
<appender-ref ref="SIFT_FILE"/>
</logger>