我有一个使用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的新手 - 任何帮助都会受到赞赏。
答案 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
必须同时设置RollingPolicy
和TriggeringPolicy
。但是,如果其RollingPolicy
也实现了TriggeringPolicy
接口,那么只需要明确指定前者。
因此,您可以(1)向appender配置添加<rollingPolicy>
元素,或者(2)实现RollingPolicy
和TriggeringPolicy
接口,然后将该实现指定为类在<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的回答,因为它指出了我正确的方向,并为可能遇到同样问题的任何人添加了这个答案。