在SiftingAppender中使用时,RollingFileAppender不起作用

时间:2018-09-11 00:23:45

标签: logback logback-classic sifting-appender

我具有以下登录设置

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

discriminator类通过解析loggerName返回一个值。密钥定义为“ fileName”。

当我仅测试RollingFileAppender(用静态值替换${fileName}的变量引用后),但当我将其嵌套在SiftingAppender下时,日志不会翻转。我使用"FileAppender"测试了筛选附加程序,它能够根据区分符创建正确的文件名。

我还通过使用鉴别器测试了相同的配置

<discriminator>
   <key>fileName</key>
   <defaultValue>appname</defaultValue>
</discriminator>

并删除class标签。这样会创建appname.log,但不会滚动。

设置debug="true"并未将任何其他信息写入日志文件。

我在这里错过了什么吗?如何在SiftingAppender中实现RollingFileAppender?

1 个答案:

答案 0 :(得分:0)

我发现设置存在问题。我的logback.xml有两个RollingFileAppenders(一个嵌套在筛子中,另一个嵌套在筛子中)。 Appender A正在写application.log,而Appender B在某些情况下也在写application.log(即${fileName}被评估为application)。因此,如果我删除了附加程序A或重命名了附加程序A的fileName,则日志将按照配置进行翻转。这可能意味着Appender A或B无法关闭并重命名该文件,因为另一个附加程序仍然对其进行了锁定?

要对此进行测试,我使用了AsyncAppender,如下所示:

<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
   <appender-ref ref="FILE" />
</appender>

其中"FILE"是Appender A的名称。使用此配置有效,但是我看到一些奇怪的行为,即文件未按指定的确切大小进行滚动,并且在某些情况下,文件使用索引10和被自动删除。由于此行为不是很可靠,因此现在我摆脱了AppenderA。