Logback(Android):SizeBasedTriggeringPolicy无效

时间:2012-10-01 11:26:46

标签: android logback

我有一个使用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的新手 - 任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您的配置缺少<rollingPolicy>元素,如logcat中所示:

...
I/System.out(  614): 20:29:27,999 |-INFO in ch.qos.logback.core.joran.action.NestedComplexPropertyIA - Assuming default type [ch.qos.logback.classic.encoder.PatternLayoutEncoder] for [encoder] property
I/System.out(  614): 20:29:28,086 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - No RollingPolicy was set for the RollingFileAppender named FILE
I/System.out(  614): 20:29:28,087 |-ERROR in ch.qos.logback.core.rolling.RollingFileAppender[FILE] - For more information, please visit http://logback.qos.ch/codes.htmlrfa_no_rp
...

logback manual for RollingFileAppender声明:

  

为了实现任何用途,RollingFileAppender必须同时设置RollingPolicyTriggeringPolicy 。但是,如果其RollingPolicy也实现了TriggeringPolicy接口,那么只需要明确指定前者。

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

答案 1 :(得分:0)

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

然而,正如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的回答,因为它指出了我正确的方向,并为可能遇到同样问题的任何人添加了这个答案。