1

私のオブジェクトは、サイズ (10M) と時間 (毎日) ベースの圧縮 (zip) アーカイブであるため、次のように構成を記述します。

<appender name="Behavior"  class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Encoding>UTF-8</Encoding>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <FileNamePattern>${LOG_HOME}/%d{yyyy-MM-dd}.%i.log.zip</FileNamePattern>
        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <maxFileSize>10MB</maxFileSize> 
        </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <layout class="ch.qos.logback.classic.PatternLayout">
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %logger{50} - %msg%n
        </pattern>
   </layout>
</appender>

しかし、私は問題に遭遇します。たとえば、今日は 8 月 10 日なので、logback はログ ファイル「2013-08-10.0.log」を書き込んでいます。

ただし、ログ ファイルは 8 月 11 日 0:00:00 にファイナライズされません (つまり、閉じられて "2013-08-10.0.log.zip" に圧縮されます)。実際、8 月 10 日以降の最初のレコードが書き込まれるまで確定されません。

つまり、8 月 10 日以降、最初のレコードが 8 月 11 日の 16:00:00 に書き込まれた場合、8 月 11 日 0:00 の間のディレクトリをスキャンしても、「2013-08-10.0.log.zip」を取得できません。 00 と 16:00:00。「2013-08-10.0.log」しか取得できず、終了したかどうか確認できません。

時間が経過したらすぐにログ ファイルをファイナライズするにはどうすればよいですか?

4

1 に答える 1

2

logback-manual によると、ロールオーバーは、時間自体ではなく、ロールオーバー時間の後の最初のログイベントでトリガーされます。

「さまざまな技術的な理由から、ロールオーバーはクロック主導ではなく、ロギング イベントの到着に依存します。午前 0 時以降の最初のイベントは、ロールオーバーをトリガーします。たとえば、午前 0 時から 23 分 47 秒の間にロギング イベントがない場合、ロールオーバーは実際には 3 月 9 日の午前 0 時ではなく午前 0 時 23 分 47 秒に発生します。 、イベントの到着率によっては、ロールオーバーがトリガーされて遅延が発生する場合があります。」( http://logback.qos.ch/manual/appenders.html )

したがって、意図したことを達成するための構成のみの方法はありません。これだけの問題である場合は、真夜中の直後にロギング イベントを送信するコードをアプリケーションに実装して、ロールオーバーがタイムリーにトリガーされるようにしてみてください。メイン アプリケーションのコードにアクセスできない場合は、単純な小さなアプリケーションを実装して、毎日午前 0 時以降にその 1 つのログ イベントのみを記録して送信し、同じアペンダーを使用することができます。

于 2013-08-12T10:02:06.900 に答える