2012-10-01 4 views
3

로깅을 위해 LogBack 라이브러리를 사용하는 Android 앱이 있습니다. 2MB에 도달하면 로그 파일을 삭제해야합니다 (회전 할 필요 없음). Logback (Android) : SizeBasedTriggeringPolicy not working

<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 코드는 트리거되지 않습니다 따라서 로그 파일이 (내가 원하는하지 않은) 2메가바이트 이상으로 성장한다.

LogBack을 처음 사용했습니다. 도움을 주시면 감사하겠습니다.

답변

1

logcat에 표시되어 한 것 같은 설정에서, <rollingPolicy> 요소가 누락되었습니다

 
... 
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은 모두입니다. 그러나 RollingPolicyTriggeringPolicy 인터페이스를 구현하는 경우 명시 적으로 명시해야합니다.

그래서

, 당신은 하나 (1) 펜더 구성에 <rollingPolicy> 요소를 추가하거나, (2) 모두 RollingPolicyTriggeringPolicy 인터페이스를 구현하고 (<rollingPolicy class='com.example.MyRollingPolicy'>에서 클래스와 그 구현을 지정하는 트리거 정책을 경우 MyRollingPolicy 자체가 처리하므로 불필요합니다.)

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의 대답을 받아 들였고 동일한 문제가있는 사람에게는이 대답을 추가했습니다.