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 コードは起動されないため、ログ ファイルが 2 MB を超えて大きくなります (これは私が望んでいるものではありません)。

私は LogBack を初めて使用します。

4

2 に答える 2

2

<rollingPolicy>に示されているように、構成に要素がありませんlogcat:

...
I/System.out( 614): 20:29:27,999 |-ch.qos.logback.core.joran.action.NestedComplexPropertyIA の INFO - [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
...

州のログバックマニュアルRollingFileAppender

有用であるためには、 a には aとsetupの両方がRollingFileAppender必要です。ただし、インターフェイスも実装している場合は、前者のみを明示的に指定する必要があります。RollingPolicyTriggeringPolicyRollingPolicyTriggeringPolicy

したがって、(1)<rollingPolicy>アペンダー構成に要素を追加するか、(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の回答は正しい方向を示しており、同じ問題を抱えている可能性のある人のためにこの回答を追加したため、私はuser46874の回答を受け入れました。

于 2012-10-02T05:57:27.070 に答える