3

我有一个使用 LogBack 库进行日志记录的 Android 应用程序。我需要在日志文件达到 2MB 时删除它(我不需要旋转它)。

这是我的配置文件:

<configuration>
      <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>/mnt/sdcard/app/app.log</file>
        <append>true</append>


        <triggeringPolicy class="com.app.utils.LogbackSizeBasedTriggeringPolicy">
            <maxFileSize>2MB</maxFileSize>
        </triggeringPolicy>

        <encoder>
          <pattern>%d %-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
        </encoder>
      </appender>

      <root level="DEBUG">
        <appender-ref ref="FILE" />
      </root> 
</configuration> 

如您所见,由于 SizeBasedTriggeringPolicy (http://jira.qos.ch/browse/LOGBACK-74) 似乎存在错误,因此我编写了自己的触发代码:

package com.app.utils;
import ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy;
import ch.qos.logback.core.util.FileSize;

public class LogbackSizeBasedTriggeringPolicy<E> extends
        SizeBasedTriggeringPolicy<E> {

    @Override
    public boolean isTriggeringEvent(File activeFile, E event) {


        return activeFile.length() >= FileSize.valueOf(getMaxFileSize())
                .getSize();
    }

}

日志记录工作正常 - 但 triggeringPolicy 代码从未被触发,因此日志文件增长超过 2MB(这不是我想要的)。

我是 LogBack 的新手 - 任何帮助将不胜感激。

4

2 回答 2

2

您的配置缺少该<rollingPolicy>元素,如以下所示logcat

...
I/System.out(614): 20:29:27,999 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - 假设默认类型 [ch.qos.logback.classic.encoder.PatternLayoutEncoder] 为 [编码器] 属性
I/System.out(614): 20:29:28,086 |-ch.qos.logback.core.rolling.RollingFileAppender[FILE] 中的错误 - 没有为名为 FILE 的 RollingFileAppender 设置 RollingPolicy
I/System.out(614): 20:29:28,087 |-ch.qos.logback.core.rolling.RollingFileAppender[FILE] 中的错误 - 有关详细信息,请访问 http://logback.qos.ch/codes .htmlrfa_no_rp
...

各州的 logback手册:RollingFileAppender

要具有任何用途, aRollingFileAppender必须同时具有 aRollingPolicy和 a TriggeringPolicyset up。但是,如果它RollingPolicy也实现了TriggeringPolicy接口,那么只需要显式指定前者。

因此,您可以(1)将一个<rollingPolicy>元素添加到您的 appender 配置中,或者(2)同时实现RollingPolicyTriggeringPolicy接口,然后将该实现指定为类<rollingPolicy class='com.example.MyRollingPolicy'>(在这种情况下,触发策略是不必要的,因为MyRollingPolicy它自己会处理它)。

于 2012-10-02T02:44:19.190 回答
1

我需要的是被截断的日志文件——对滚动不感兴趣。

但是,正如 user46874 所说,TriggerPolicy 必须与RollingPolicy. 所以我用我自己的实现扩展FixedWindowRollingPolicy并覆盖rollover()了它,它只是像这样删除日志文件:

package com.app.utils;

import java.io.File;

import ch.qos.logback.core.rolling.FixedWindowRollingPolicy;
import ch.qos.logback.core.rolling.RolloverFailure;


public class LogbackRollingPolicy extends FixedWindowRollingPolicy{

    @Override
    public void rollover() throws RolloverFailure {             
        File file = new File(getActiveFileName());      
        file.delete();      
    }

}

我的配置看起来像:

<rollingPolicy class="com.app.utils.LogbackRollingPolicy">
</rollingPolicy>

不确定这是否是“正确”的方法,但它工作正常。

我已接受 user46874 的回答,因为它为我指明了正确的方向,并为可能遇到相同问题的任何人添加了此答案。

于 2012-10-02T05:57:27.070 回答