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