我有以下登录设置
<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>
鉴别器类通过解析记录器名称返回一个值。键定义为"文件名"。
当我只测试滚动文件追加器时(用静态值替换${fileName}
的变量引用后(,日志滚动很好,但是当我将其嵌套在 SiftingAppender 下时,日志不会滚动。我用"FileAppender"
测试了筛选附加器,它能够根据鉴别器创建正确的文件名。
我还通过使用鉴别器测试了相同的配置
<discriminator>
<key>fileName</key>
<defaultValue>appname</defaultValue>
</discriminator>
并删除class
标签。这将创建appname.log
但不会滚动。
设置debug="true"
未将任何其他信息写入日志文件。
我在这里错过了什么吗?如何在筛选追加器中实现滚动文件追加器?
我发现了我的设置的问题。我的登录.xml有两个滚动文件追加器(一个嵌套在筛子中,一个嵌套在外面(。追加程序 A 正在写入应用程序.log在某些情况下,追加程序 B 也在写入应用程序.log(即${fileName}
评估为申请(。因此,如果我删除追加器 A 或重命名追加器 A 的文件名,日志将按配置滚动。这可能意味着追加器 A 或 B 无法关闭和重命名文件,因为另一个追加器仍然锁定了该文件?
为了测试这一点,我使用了AsyncAppender,如下所示:
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<appender-ref ref="FILE" />
</appender>
其中"FILE"
是追加程序 A 的名称。 使用此配置有效,但我看到一些奇怪的行为,其中文件不会以指定的确切大小滚动,在某些情况下,文件使用索引 10 重命名并自动删除。由于这种行为不是很可靠,现在我摆脱了追加器 A。