web-dev-qa-db-ja.com

log4j2の時間ベースのトリガーポリシー

1時間ごとに新しいログファイルを作成しようとしています。 RollingFileAppenderでlo4j2のTimeBasedTriggerringPolicyを使用しています。以下は、log4j2公式サイトから取得したサンプルxml構成コードです。

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

間隔属性では、1時間を意味する1を設定しました。しかし、それでも私のファイルは1時間ごとに回転しません。

間違いを見つけてください。

注:log4j2のベータ9(最新)を含めました

17
user1890780

ここで1は、1時間ではなく1日を示します。以下の構成で手動でテストしました。

<RollingFile name="T" fileName="/data_test/log/abc.log"
        filePattern="/data_test/log/abc-%d{MM-dd-yyyy}-%i.log">
        <PatternLayout>
            <Pattern>%d{ISO8601} %-5p [%t] (%F:%L) - %m%n</Pattern>
        </PatternLayout>
        <Policies>              
            <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            <SizeBasedTriggeringPolicy size="100 KB" />
        </Policies>
    </RollingFile>

手動テストでは、システムの日付と時刻を変更します。まず、1時間増やしてみます。ログファイルは生成されますが、期待どおりではありません。次に、システムの日付を変更し、1日増やしてから、結果を確認します。

10月29日の最後のログファイル(abc.log)が50 KBであるとします。構成サイズは100 KBです。日を変更して(1日増やして)実行した場合。次に、最後のファイルの名前が29-Oct-(シーケンス番号).log(コピーされると50 KBファイル)に変更され、abc.logで新しいファイルが作成されます。

私はweb.xmlの以下の設定で簡単なサーブレットでこれを試しました

<context-param>
    <param-name>log4jConfiguration</param-name>
    <param-value>log4j2.xml</param-value>
</context-param>

log4j2.xmlをsrcフォルダーに保存します。 log4j2.xmlは、クラスパスに保存するとロードされません。

24
Zubin Shah

Abidが述べたように、間隔値はfilePatternの一部として指定されたパターンのコンテキストで解釈されます。それは最低額面で始まります。たとえば、パターンにSが含まれている場合、周波数はミリ秒単位になります。 SimpleDateFormat Java doc http://docs.Oracle.com/javase/7/docs/api/Java/text/の一部として詳細に説明されているように、日付パターンをサポートしています。 SimpleDateFormat.html

5
rajnish

Log4j ドキュメント

interval->(整数)日付パターンの最も具体的な時間単位に基づいてロールオーバーが発生する頻度。たとえば、最も具体的なアイテムとして時間を含み、4つのロールオーバーの増分がある日付パターンでは、4時間ごとに発生します。デフォルト値は1です。

1時間ごとに作成する場合は、ファイル名のパターンを変更する必要があります。

5
Amin Sh

空ではないログファイルがあります(そうでない場合、ロールオーバーするものはありません)?

名前は "TimeBased ..."ですが、実際には指定された時間ではなく、時間のしきい値を超えた後に到着する最初のログイベントでロールオーバーされることに注意してください。 61分ほど後に何かを記録する小さなテストプログラムを試して、問題が引き続き発生するかどうかを確認できますか?

上記のテストプログラムでロールオーバーしない場合は、バグを発見した可能性があります。その場合は、log4j issue trackerで上げてください。 (チームが問題の再現に使用できるテストプログラムを必ず添付してください)。

2
Remko Popma

TimeBasedTriggeringPolicy構成によると、ロガーは1時間ごとではなく、毎日ログのみを入力します。私の知る限り、filePatternをHH(Hours)からdd(Days)に変更することで機能を実現できます。

Config.xmlを変更しました。これを試して

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" name="MyApp" packages="">
   <Appenders>
      <RollingFile name="RollingFile" fileName="logs/app.log" filePattern="logs/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}-%i.log.gz">
         <PatternLayout>
            <Pattern>%d %p %c{1.} [%t] %m%n</Pattern>
         </PatternLayout>
         <Policies>
            **
            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            **
            <SizeBasedTriggeringPolicy size="250 MB" />
         </Policies>
      </RollingFile>
   </Appenders>
   <Loggers>
      <Root level="error">
         <AppenderRef ref="RollingFile" />
      </Root>
   </Loggers>
</Configuration>

詳細については this を確認してください

これもあなたのためにうまくいくことを願っています。

0
Akshay Kumar