0

我有以下 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"没有将任何附加信息写入日志文件。

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

4

1 回答 1

3

我发现了我的设置问题。我的 logback.xml 有两个 RollingFileAppenders(一个嵌套在 sifter 中,一个嵌套在外面)。Appender A 正在写入 application.log,而 Appender B 在某些情况下也在写入 application.log(即${fileName}评估到应用程序)。因此,如果我删除附加程序 A 或重命名附加程序 A 的文件名,日志将按照配置滚动。这可能意味着 Appender A 或 B 无法关闭并重命名文件,因为另一个 appender 仍然锁定它?

为了测试这一点,我使用了 AsyncAppender,如下所示:

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

Appender A 的名称在哪里"FILE"。使用此配置有效,但我看到一些奇怪的行为,其中文件不会以指定的确切大小翻转,并且在某些情况下,文件使用索引 10 重命名并自动删除。由于这种行为不是很可靠,所以现在我摆脱了 Appender A。

于 2018-09-11T17:26:11.333 回答