RollingFileAppenderは、fileNameパラメータで指定されたFileに書き込み、TriggeringPolicyおよびRolloverPolicyに従ってファイルをロールオーバーするOutputStreamAppenderです。 RollingFileAppenderは、実際にファイルI / Oを実行してロールオーバーを実行するために、OutputStreamManagerを拡張するRollingFileManagerを使用します。 異なる構成からのRolloverFileAppendersは共有できませんが、マネージャにアクセス可能であれば、RollingFileManagersを使用できます。 たとえば、サーブレットコンテナ内の2つのWebアプリケーションは、Log4jが両方に共通のClassLoaderにある場合、独自の構成を持ち、同じファイルに安全に書き込むことができます。
RollingFileAppenderは必要ですTriggeringPolicyとRolloverStrategyを。 トリガポリシーは、ロールオーバーを実行するかどうかを決定しますが、ロールオーバストラテジはロールオーバーの実行方法を定義します。 RolloverStrategyが設定されていない場合、RollingFileAppenderはDefaultRolloStrategyを使用します。 log4j-2.5以降、ロールオーバー時に実行するDefaultRolloStrategyのカスタム削除アクションを設定できます。 ファイル名が設定されていない場合は2.8であるため、DefaultRolloStrategyの代わりにDirectWriteRolloStrategyが使用されます。 log4j-2.9以降、カスタムPOSIXファイル属性ビューアクションは、ロールオーバー時に実行するようにDefaultRolloStrategyで設定できます。 定義されていない場合は、RollingFileAppenderの継承POSIXファイル属性ビューが適用されます。
ファイルのロックは、RollingFileAppenderによってサポートされていません。
パラメータ名 | タイプ | 説明 |
append | boolean | trueの場合、デフォルトのレコードがファイルの末尾に追加されます。 falseに設定すると、新しいレコードが書き込まれる前にファイルがクリアされます。 |
bufferedIO | boolean | trueの場合、デフォルトのレコードはバッファに書き込まれ、バッファがいっぱいになるとディスクに書き込まれます。 また、immediateFlushが設定されている場合は、レコードが書き込まれます。 ファイルロックは、bufferedIOでは使用できません。 パフォーマンステストでは、バッファ付きI / Oを使用すると、immediateFlushが有効になっていても、パフォーマンスが大幅に向上することが示されています。 |
bufferSize | int | bufferedIOがtrueの場合、これはバッファサイズで、デフォルトは8192バイトです。 |
createOnDemand | boolean | アペンダーはオンデマンドでファイルを作成します。 アペンダーは、ログイベントがすべてのフィルターを通過し、このアペンダーにルーティングされるときにのみファイルを作成します。 デフォルトはfalseです。 |
filter | Filter | このアペンダーがイベントを処理するかどうかを決定するフィルター。 CompositeFilterを使用すると、複数のフィルタを使用できます。 |
fileName | String | 書き込むファイルの名前。 ファイルまたはその親ディレクトリのいずれかが存在しない場合、ファイルが作成されます。 |
filePattern | String | アーカイブされたログファイルのファイル名のパターン。 パターンのフォーマットは、使用されるRolloverPolicyに依存します。 DefaultRolloPolicyは、 SimpleDateFormatと互換性のある日付/時刻パターンおよび/または整数カウンタを表す%iの両方を受け入れます。 このパターンは実行時の補間もサポートしているため、Lookup(DateLookupなど)のいずれもパターンに含めることができます。 |
immediateFlush | boolean | trueに設定すると、デフォルトでは、各書き込みの後にフラッシュが続きます。 これにより、データがディスクに書き込まれることは保証されますが、パフォーマンスに影響を与える可能性があります。 書き込みごとにフラッシュするのは、同期ロガーでこのアペンダーを使用する場合にのみ有効です。 immediateFlushがfalseに設定されていても、非同期ロガーとアペンダーはイベントのバッチの最後に自動的にフラッシュします。 これにより、データがディスクに書き込まれることも保証されますが、より効率的です。 |
layout | Layout | LogEventの書式設定に使用するレイアウト。 レイアウトが指定されていない場合は、デフォルトパターンレイアウト "%m%n"が使用されます。 |
name | String | アペンダーの名前。 |
policy | TriggeringPolicy | ロールオーバが発生するかどうかを判断するために使用するポリシー。 |
strategy | RolloverStrategy | アーカイブファイルの名前と場所を決定するための戦略。 |
ignoreExceptions | boolean | デフォルトはtrueです。 イベントを追加する際に例外が発生し、内部的にログに記録され、無視されます。 falseに設定すると、代わりに例外が呼び出し元に伝播されます。 このAppenderをFailoverAppenderでラップするときは、これをfalseに設定する必要があります。 |
filePermissions | String | ファイルが作成されるたびに適用されるPOSIX形式のファイル属性パーミッション。 基底ファイルシステムは、POSIXファイル属性ビューをサポートしなければならない。 例:rw -------またはrw-rw-rw- etc ... |
fileOwner | String | ファイル所有者は、ファイルが作成されるたびに定義します。 セキュリティ上の理由からファイルの所有者を変更することが制限されている可能性があります。 _POSIX_CHOWN_RESTRICTEDがパスに対して有効な場合、ファイルのユーザーIDまたは適切な特権を持つ実効ユーザーIDを持つプロセスのみがファイルの所有権を変更する可能性があります。 基本ファイルシステムは、ファイル所有者属性ビューをサポートしなければならない。 |
fileGroup | String | ファイルが作成されるたびに定義するファイルグループ。 基底ファイルシステムは、POSIXファイル属性ビューをサポートしなければならない。 |
CompositeTriggeringPolicyは複数のトリガーポリシーを組み合わせ、設定されたポリシーのいずれかがtrueを返す場合はtrueを返します。 CompositeTriggeringPolicyは、ポリシー要素に他のポリシーをラップするだけで構成されます。 たとえば、次のXMLフラグメントは、JVMの起動時、ログサイズが20メガバイトに達したとき、 および現在の日付がログの開始日と一致しなくなったときに、ログをロールオーバーするポリシーを定義します。
<Policies> <OnStartupTriggeringPolicy /> <SizeBasedTriggeringPolicy size = "20 MB" /> <TimeBasedTriggeringPolicy /> </ Policies>
CronTriggeringPolicy は、cron expression に基づいてロールオーバーをトリガーします。
パラメータ名 | タイプ | 説明 |
schedule | String | cron expression この式は、Quartzスケジューラで許可されているものと同じです。 式の詳細については、 CronExpression を参照してください。 |
evaluateOnStartup | String | 起動時に、cron式はファイルの最終更新タイムスタンプと比較して評価されます。 cron expression が、その時刻と現在の時刻の間にロールオーバが発生したはずであることを示す場合、ファイルはすぐにロールオーバーされます。 |
OnStartupTriggeringPolicy ポリシーは、ログファイルが現在のJVMの開始時刻より古いもので、最小ファイルサイズが満たされているか超過している場合にロールオーバーを引き起こします。
パラメータ名 | タイプ | 説明 |
minSize | long | ファイルがロールオーバーする必要がある最小サイズ。 サイズがゼロの場合、ファイルサイズに関係なくロールオーバーが発生します。 デフォルト値は1で、空のファイルをローリングすることはありません。 |
Google App Engine note: Google App Engineで実行しているとき、Log4Jが初期化された時間より古いログファイルの場合、OnStartupポリシーはロールオーバーを引き起こします 。 (Google App Engineは特定のクラスへのアクセスを制限して、Log4Jは
java.lang.management.ManagementFactory.getRuntimeMXBean().getStartTime()
を使用して JVM の開始時刻を判断できず、代わりに Log4J の初期化時刻に戻ります。
SizeBasedTriggeringPolicy は、ファイルが指定されたサイズに達するとロールオーバーを引き起こします。 サイズはバイト単位で指定できます。接尾辞はKB、MBまたはGBです(例: 20MB)
TimeBasedTriggeringPolicyは、日付/時刻パターンがアクティブなファイルに適用されなくなるとロールオーバーを引き起こします。 このポリシーは、ロールオーバーが時間パターンとブール値の変調属性に基づいて発生する頻度を示す間隔属性を受け入れます。
パラメータ名 | タイプ | 説明 |
interval | integer | 日付パターンの最も特定の時間単位に基づいてロールオーバが発生する頻度。 たとえば、最も具体的な項目として時間を含む日付パターンを使用し、4時間ごとに4つのロールオーバーの増分が発生します。 デフォルト値は1です。 |
modulate | boolean | 間隔の境界で次のロールオーバーが発生するように間隔を調整する必要があるかどうかを示します。 たとえば、アイテムが時間帯の場合、現在の時間は午前3時で、間隔が4の場合、最初のロールオーバーは午前4時に発生し、次の午前8時、正午、午後4時などに発生します。 |
maxRandomDelay | integer | ロールオーバをランダムに遅らせる最大秒数を示します。 デフォルトでは、これは0であり、遅延がないことを示します。 この設定は、複数のアプリケーションが同時にログファイルをロールオーバーするように構成されているサーバーで役に立ち、時間の経過とともにその負荷を分散させることができます。 |
デフォルトのロールオーバー戦略では、RollingFileAppender自体で指定されたfilePattern属性の日付/時刻パターンと整数の両方を使用できます。 日付/時刻パターンが存在する場合は、現在の日付と時刻の値に置き換えられます。 パターンに整数が含まれている場合は、ロールオーバーごとにインクリメントされます。 パターンに日付/時刻と整数の両方が含まれている場合、整数は日付/時刻パターンの結果が変わるまで増分されます。 ファイルパターンが ".gz"、 ".zip"、 ".bz2"、 ".deflate"、 ".pack200"、または ".xz"で終わる場合、 結果のアーカイブはサフィックスに一致する圧縮スキームを使用して圧縮されます。 bzip2、Deflate、Pack200、XZの形式ではApache Commons Compressが必要です。 さらに、XZにはXZ for Javaが必要です。 このパターンには、以下の例に示すように、実行時に解決できるルックアップ参照も含まれている場合があります。
デフォルトのロールオーバー戦略は、カウンタをインクリメントするための3つのバリエーションをサポートしています。 1つは「固定ウィンドウ」戦略です。 どのように動作するかを説明するために、min属性が1に設定され、max属性が3に設定され、 ファイル名が "foo.log"であり、ファイル名パターンが "foo-%i.log"であるとします。
ロールオーバ数 | アクティブ出力ターゲット | アーカイブされたログファイル | 説明 |
0 | foo.log | - | すべてのロギングは初期ファイルに行われます。 |
1 | foo.log | foo-1.log | 最初のロールオーバーの間、foo.logはfoo-1.logにリネームされます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
2 | foo.log | foo-1.log、foo-2.log | 2回目のロールオーバーの間、foo-1.logはfoo-2.logにリネームされ、foo.logはfoo-1.logにリネームされます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
3 | foo.log | foo-1.log、foo-2.log、foo-3.log | 3回目のロールオーバーの間、foo-2.logの名前はfoo-3.logに変更され、foo-1.logはfoo-2.logに変更され、foo.logはfoo-1.logに変更されます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
4 | foo.log | foo-1.log、foo-2.log、foo-3.log | 4回目以降のロールオーバーでは、foo-3.logは削除され、foo-2.logはfoo-3.logに変更され、foo-1.logはfoo-2.logに変更され、foo.logはfoo -1.log。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
対照的に、fileIndex属性が "max"に設定されているが、他のすべての設定が同じ場合、次のアクションが実行されます。
ロールオーバ数 | アクティブ出力ターゲット | アーカイブされたログファイル | 説明 |
0 | foo.log | - | すべてのロギングは初期ファイルに行われます。 |
1 | foo.log | foo-1.log | 最初のロールオーバーの間、foo.logはfoo-1.logにリネームされます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
2 | foo.log | foo-1.log、foo-2.log | 2回目のロールオーバーの間、foo.logはfoo-2.logに名前が変更されます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
3 | foo.log | foo-1.log、foo-2.log、foo-3.log | 3回目のロールオーバーの間、foo.logはfoo-3.logに名前が変更されます。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
4 | foo.log | foo-1.log、foo-2.log、foo-3.log | 4回目以降のロールオーバーでは、foo-1.logは削除され、foo-2.logはfoo-1.logに、foo-3.logはfoo-2.logに、foo.logはfooにそれぞれ変更されます-3.log。 新しいfoo.logファイルが作成され、書き込みが開始されます。 |
最後に、2.8より、fileIndex 属性が "nomax"に設定されている場合、最小値と最大値は無視され、ファイル番号は1ずつ増加し、各ロールオーバーはファイルの最大数なしで段階的に高い値を持ちます。
パラメータ名 | タイプ | 説明 |
fileIndex | String | "max"(デフォルト)に設定すると、より高いインデックスを持つファイルは、より小さなインデックスを持つファイルより新しいでしょう。 "min"に設定されている場合、ファイルの名前変更とカウンタは上記の固定ウィンドウ方式に従います。 |
min | integer | カウンタの最小値。 デフォルト値は1です。 |
max | integer | カウンタの最大値。 この値に達すると、それ以降のロールオーバーで古いアーカイブが削除されます。 デフォルト値は7です。 |
compressionLevel | integer | 0 =なし、1 =最高速度、9 =最高圧縮までの圧縮レベルを0-9に設定します。 ZIPファイル用にのみ実装されています。 |
tempCompressedFilePattern | String | 圧縮中のアーカイブ・ログ・ファイルのファイル名のパターン。 |
DirectWriteRolloverStrategyは、ログイベントをファイルパターンが表すファイルに直接書き込むようにします。 この戦略では、ファイルの名前変更は実行されません。 サイズベースのトリガーポリシーによって、複数のファイルが指定された期間内に書き込まれる場合、 番号は1から始まり、時間ベースのロールオーバーが発生するまで継続的に増分されます。 警告:ファイルパターンの末尾に圧縮があることが示されている場合は、アプリケーションがシャットダウンされても現在のファイルは圧縮されません。 さらに、ファイルパターンが現在のファイルと一致しなくなるように時間が変更された場合、起動時に圧縮されません。
パラメータ名 | タイプ | 説明 |
maxFiles | String | ファイルパターンと一致する期間に許可されるファイルの最大数。 ファイル数が超過すると、最も古いファイルが削除されます。 指定する場合、値は1より大きくなければなりません。 値が0より小さいか省略されている場合、ファイル数は制限されません。 |
compressionLevel | integer | 0 =なし、1 =最高速度、9 =最高圧縮までの圧縮レベルを0-9に設定します。 ZIPファイル用にのみ実装されています。 |
tempCompressedFilePattern | String | 圧縮中のアーカイブ・ログ・ファイルのファイル名のパターン。 |
以下は、RollingFileAppenderを使用して時間とサイズに基づいたトリガーポリシーを使用するサンプル構成で、 現在の年と月に基づいてディレクトリに格納されている同じ日(1-7)に最大7個のアーカイブを作成し、 gzipを使って各アーカイブを圧縮する:
<?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{MM-dd-yyyy}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
この2番目の例では、削除する前に最大20のファイルを保持するロールオーバー戦略を示しています。
<?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{MM-dd-yyyy}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> <DefaultRolloverStrategy max="20"/> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
以下は、RollingFileAppenderを使用して時間とサイズに基づいたトリガーポリシーを使用するサンプル構成で、 現在の年と月に基づいてディレクトリに格納されている同じ日(1-7)に最大7個のアーカイブを作成し、 gzipを使用して各アーカイブを圧縮し、時間が6で割り切れる場合は6時間ごとにロールバックします:
<?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="6" modulate="true"/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
このサンプル構成では、cron およびサイズベースのトリガーポリシーの両方を使用する RollingFileAppender を使用し、 無制限のアーカイブファイルに直接書き込みます。 ファイルサイズが250MBに制限されている間、cronトリガーは1時間にロールオーバーを引き起こします。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" filePattern="logs/app-%d{yyyy-MM-dd-HH}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <CronTriggeringPolicy schedule="0 0 * * * ?"/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
この設定例は前と同じですが、1時間ごとに保存されるファイル数を10に制限しています。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Appenders> <RollingFile name="RollingFile" filePattern="logs/app-%d{yyyy-MM-dd-HH}-%i.log.gz"> <PatternLayout> <Pattern>%d %p %c{1.} [%t] %m%n</Pattern> </PatternLayout> <Policies> <CronTriggeringPolicy schedule="0 0 * * * ?"/> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> <DirectWriteRolloverStrategy maxFiles="10"/> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
Log4j-2.5にはDeleteアクションが導入されており、ユーザーはロールオーバー時にDefaultRolloStrategy max属性で可能だったファイルよりも削除されるファイルをより詳細に制御できます。 削除アクションを使用すると、ベースディレクトリに対して削除するファイルを選択する1つまたは複数の条件を設定できます。 ロールオーバーされたログファイルだけでなく、すべてのファイルを削除することができるので、注意してこのアクションを使用してください。 testModeパラメータを使用すると、誤って間違ったファイルを削除することなく構成をテストできます。
パラメータの削除 | ||
パラメータ名 | タイプ | 説明 |
basePath | String | 必須。 削除するファイルのスキャンを開始する場所のベースパス。 |
maxDepth | int | 訪問するディレクトリの最大レベル数。 0の値は、セキュリティマネージャによって拒否されない限り、開始ファイル(基本パス自体)のみが訪問されることを意味します。 Integer.MAX_VALUEの値は、すべてのレベルを訪問する必要があることを示します。 デフォルトは1で、指定されたベースディレクトリ内のファイルのみを意味します。 |
followLinks | boolean | シンボリックリンクをたどるかどうか。 デフォルトはfalseです。 |
testMode | boolean | trueの場合、ファイルは削除されず、 ステータスロガーの INFOレベルにメッセージが出力されます。 この設定を使用して、設定が正常に動作するかどうかをテストします。 デフォルトはfalseです。 |
pathSorter | PathSorter | 削除するファイルを選択する前に、ファイルをソートするためにPathSorterインターフェースを実装するプラグイン。 デフォルトでは、最も最近修正されたファイルが最初にソートされます。 |
pathConditions | PathCondition[] | ScriptConditionが指定されていない場合は必須です。 1つまたは複数のPathCondition要素。 複数の条件が指定されている場合、それらはすべて削除される前にパスを受け入れる必要があります。 条件をネストすることができます。 この場合、内部条件は、外部条件がパスを受け入れる場合にのみ評価されます。 条件がネストされていない場合、それらは任意の順序で評価される可能性があります。 条件は、 IfAll 、 IfAny 、およびIfNot複合条件を使用して論理演算子AND、ORおよびNOTと組み合わせることもできます。 ユーザーは、カスタム条件を作成したり、組み込み条件を使用することができます。 IfFileName - パス(ベースパスからの相対パス)が正規表現またはグロブと一致するファイルを受け入れます。 IfLastModified - 指定された継続時間以上の古いファイルを受け入れます。 IfAccumulatedFileCount - ファイルツリーウォーク中に何らかのカウントしきい値を超えた後にパスを受け入れます。 IfAccumulatedFileSize - ファイルツリーウォーク中に累積ファイルサイズのしきい値を超えた後にパスを受け入れます。 IfAll - すべてのネストされた条件がそれを受け入れる場合、パスを受け入れます(論理AND)。 ネストした条件は、任意の順序で評価できます。 IfAny - ネストされた条件の1つが条件を受け入れた場合にパスを受け入れます(論理OR)。 ネストした条件は、任意の順序で評価できます。 IfNot - ネストされた条件が条件を受け入れない場合(論理NOT)、パスを受け入れます。 |
scriptCondition | ScriptCondition | PathConditionsが指定されていない場合は必須です。 スクリプトを指定するScriptCondition要素。 ScriptConditionには、実行するロジックを指定するScript、ScriptRefまたはScriptFile要素が含まれている必要があります。 (ScriptFilesとScriptRefsの設定例については、 ScriptFilterのドキュメントを参照してください)。 スクリプトには、ベースパスの下にあるパスのリスト( maxDepthまで )を含む多くのパラメータが渡され、削除するパスを含むリストが返されなければなりません。 |
IfFileName条件パラメータ | ||
パラメータ名 | タイプ | 説明 |
glob | String | 正規表現が指定されていない場合は必須です。 正規表現に似ていますが、 構文が単純な限定パターン言語を使用して、相対パス(ベースパスからの相対パス)を照合します 。 |
regex | String | globが指定されていない場合は必須です。 Patternクラスで定義されている正規表現を使用して、相対パス(ベースパスを基準にして)を照合します。 |
nestedConditions | PathCondition[] | オプションのネストされたPathConditions 。 ネストされた条件が存在する場合、それらはすべて削除される前にファイルを受け入れる必要があります。 ネストされた条件は、外部条件がファイルを受け入れる場合にのみ評価されます(パス名が一致する場合)。 |
IfLastModified条件パラメータ | ||
パラメータ名 | タイプ | 説明 |
age | String | 必須。 期間を指定します。 この条件では、指定した期間より古いか古いファイルを受け入れます。 |
nestedConditions | PathCondition[] | オプションのネストされたPathConditions 。 ネストされた条件が存在する場合、それらはすべて削除される前にファイルを受け入れる必要があります。 ネストされた条件は、外部条件がファイルを受け入れる場合にのみ評価されます(ファイルが十分古い場合)。 |
IfAccumulatedFileCount条件パラメータ | ||
パラメータ名 | タイプ | 説明 |
exceeds | int | 必須。 ファイルが削除されるしきい値のカウント。 |
nestedConditions | PathCondition[] | オプションのネストされたPathConditions 。 ネストされた条件が存在する場合、それらはすべて削除される前にファイルを受け入れる必要があります。 ネストされた条件は、外部条件がファイルを受け入れる場合にのみ評価されます(しきい値を超えた場合)。 |
IfAccumulatedFileSize条件パラメータ | ||
パラメータ名 | タイプ | 説明 |
exceeds | String | 必須。 ファイルが削除されるしきい値の累積ファイルサイズ。 サイズはバイト単位で指定できます。 接尾辞はKB、MBまたはGBです(例: 20MB) 。 |
nestedConditions | PathCondition[] | オプションのネストされたPathConditions 。 ネストされた条件が存在する場合、それらはすべて削除される前にファイルを受け入れる必要があります。 ネストされた条件は、外部条件がファイルを受け入れる場合にのみ評価されます(しきい値の累積ファイルサイズを超えた場合)。 |
以下は、RollingFileAppenderを使用してcronトリガーポリシーを使用して、深夜0時にトリガーするサンプル構成です。 アーカイブは、現在の年と月に基づいてディレクトリに格納されます。 "*/app-*.log.gz" グロブと一致し、60日以上経過したベースディレクトリの下にあるすべてのファイルは、ロールオーバー時に削除されます。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Properties> <Property name="baseDir">logs</Property> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${baseDir}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd}.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <CronTriggeringPolicy schedule="0 0 0 * * ?"/> <DefaultRolloverStrategy> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz" /> <IfLastModified age="60d" /> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
以下は、RollingFileAppenderを使用して時間とサイズに基づいたトリガーポリシーを使用するサンプル構成です。 現在の年と月に基づいてディレクトリに格納されている同じ日(1-100)のアーカイブを最大100個作成します。 gzipを使って各アーカイブを圧縮し、1時間ごとにロールバックします。 すべてのロールオーバの間、この設定では、"*/app-*.log.gz" に一致する30日以上のファイルが削除されますが、 最新の100 GBまたは最新の10ファイルのいずれか早い方を保持します。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="warn" name="MyApp" packages=""> <Properties> <Property name="baseDir">logs</Property> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${baseDir}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyy-MM-dd-HH}-%i.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <Policies> <TimeBasedTriggeringPolicy /> <SizeBasedTriggeringPolicy size="250 MB"/> </Policies> <DefaultRolloverStrategy max="100"> <!-- Nested conditions: the inner condition is only evaluated on files for which the outer conditions are true. --> <Delete basePath="${baseDir}" maxDepth="2"> <IfFileName glob="*/app-*.log.gz"> <IfLastModified age="30d"> <IfAny> <IfAccumulatedFileSize exceeds="100 GB" /> <IfAccumulatedFileCount exceeds="10" /> </IfAny> </IfLastModified> </IfFileName> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
ScriptCondition Parameters | ||
ラメータ名 | タイプ | 説明 |
script | Script, ScriptFile or ScriptRef | 実行されるロジックを指定するScript要素。 スクリプトには、ベースパスの下にあるパスのリストが渡され、削除するパスをjava.util.List < PathWithAttributes >として返す必要があります。 ScriptFileとScriptRefsの設定方法の例については、 ScriptFilterのドキュメントを参照してください。 |
Script Parameters | ||
パラメータ名 | タイプ | 説明 |
basePath | java.nio.file.Path | 削除アクションが削除するファイルのスキャンを開始したディレクトリ。 pathList内のパスを相対化するために使用できます。 |
pathList | java.util.List<PathWithAttributes> | 指定された最大深さまでの基本パスの下に見つかったパスのリスト。 最も最近変更されたファイルが最初にソートされます。 スクリプトは自由にこのリストを修正して返します。 |
statusLogger | StatusLogger | スクリプトの実行中に内部イベントを記録するために使用できるStatusLogger。 |
configuration | Configuration | このScriptConditionを所有するConfiguration。 |
substitutor | StrSubstitutor | ルックアップ変数を置き換えるために使用されたStrSubstitutor |
? | String | 設定で宣言されたプロパティ。 |
以下は、RollingFileAppenderを使用してcronトリガーポリシーを使用して、深夜0時にトリガーするサンプル構成です。 アーカイブは、現在の年と月に基づいてディレクトリに格納されます。 スクリプトは、13日金曜日のベースディレクトリの下にロールオーバーされたファイルのリストを返します。 削除アクションは、スクリプトによって返されたすべてのファイルを削除します。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="trace" name="MyApp" packages=""> <Properties> <Property name="baseDir">logs</Property> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${baseDir}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <CronTriggeringPolicy schedule="0 0 0 * * ?"/> <DefaultRolloverStrategy> <Delete basePath="${baseDir}" maxDepth="2"> <ScriptCondition> <Script name="superstitious" language="groovy"><![CDATA[ import java.nio.file.*; def result = []; def pattern = ~/\d*\/app-(\d*)\.log\.gz/; pathList.each { pathWithAttributes -> def relative = basePath.relativize pathWithAttributes.path statusLogger.trace 'SCRIPT: relative path=' + relative + " (base=$basePath)"; // remove files dated Friday the 13th def matcher = pattern.matcher(relative.toString()); if (matcher.find()) { def dateString = matcher.group(1); def calendar = Date.parse("yyyyMMdd", dateString).toCalendar(); def friday13th = calendar.get(Calendar.DAY_OF_MONTH) == 13 \ && calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY; if (friday13th) { result.add pathWithAttributes; statusLogger.trace 'SCRIPT: deleting path ' + pathWithAttributes; } } } statusLogger.trace 'SCRIPT: returning ' + result; result; ]] > </Script> </ScriptCondition> </Delete> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>
Log4j-2.9にはPosixViewAttributeアクションが導入されており、ユーザにどのファイル属性パーミッション、所有者およびグループを適用すべきかをより詳細に制御できます。 PosixViewAttributeアクションを使用すると、ベースディレクトリに対して適切なファイルを選択する条件を1つ以上設定できます。
PosixViewAttribute Parameters | ||
パラメータ名 | タイプ | 説明 |
basePath | String | 必須。 ファイルをスキャンして属性を適用する場所のベースパス。 |
maxDepth | int | 訪問するディレクトリの最大レベル数。 0の値は、セキュリティマネージャによって拒否されない限り、開始ファイル(基本パス自体)のみが訪問されることを意味します。 Integer.MAX_VALUEの値は、すべてのレベルを訪問する必要があることを示します。 デフォルトは1で、指定されたベースディレクトリ内のファイルのみを意味します。 |
followLinks | boolean | シンボリックリンクをたどるかどうか。 デフォルトはfalseです。 |
pathConditions | PathCondition[] | DeletePathCondition を参照してください。 |
filePermissions | String | アクションが実行されたときに適用するPOSIX形式のファイル属性パーミッション。 基底ファイルシステムは、 POSIXファイル属性ビューをサポートしなければならない。 例:rw -------またはrw-rw-rw- etc ... |
fileOwner | String | アクションがいつ実行されるかを定義するファイル所有者。 セキュリティ上の理由からファイルの所有者を変更することが制限されている可能性があります。 _POSIX_CHOWN_RESTRICTEDがパスに対して有効な場合、ファイルのユーザーIDまたは適切な特権を持つ実効ユーザーIDを持つプロセスのみがファイルの所有権を変更する可能性があります。 基本ファイルシステムは、ファイル所有者属性ビューをサポートしなければならない。 |
fileGroup | String | アクションが実行されるタイミングを定義するファイルグループ。 基底ファイルシステムは、 POSIXファイル属性ビューをサポートしなければならない。 |
以下は、RollingFileAppenderを使用し、現在のログファイルとロールログファイルに対して異なるPOSIXファイル属性ビューを定義するサンプル構成です。
<?xml version="1.0" encoding="UTF-8"?> <Configuration status="trace" name="MyApp" packages=""> <Properties> <Property name="baseDir">logs</Property> </Properties> <Appenders> <RollingFile name="RollingFile" fileName="${baseDir}/app.log" filePattern="${baseDir}/$${date:yyyy-MM}/app-%d{yyyyMMdd}.log.gz" filePermissions="rw-------"> <PatternLayout pattern="%d %p %c{1.} [%t] %m%n" /> <CronTriggeringPolicy schedule="0 0 0 * * ?"/> <DefaultRolloverStrategy stopCustomActionsOnError="true"> <PosixViewAttribute basePath="${baseDir}/$${date:yyyy-MM}" filePermissions="r--r--r--"> <IfFileName glob="*.gz" /> </PosixViewAttribute> </DefaultRolloverStrategy> </RollingFile> </Appenders> <Loggers> <Root level="error"> <AppenderRef ref="RollingFile"/> </Root> </Loggers> </Configuration>