RollingFileAppender не работает при использовании внутри SiftingAppender - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть следующие настройки logback

<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?

1 Ответ

0 голосов
/ 11 сентября 2018

Я понял проблему с моей настройкой. Мой 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.

...