web-dev-qa-db-ja.com

日付とサイズに基づいてlog4jでファイルをロールするにはどうすればよいですか?

したがって、log4jには、RollingFileAppenderとDailyRollingFileAppenderの2つの既存のログローラーが付属しています。前者が行うことの両方を行うアペンダーを聞いたことがありますか?

ファイルサイズに基づいてログファイルをロールするだけでなく、現在の日付を追加するアペンダーが必要です。

自分でアペンダーを作成することを考えていましたが、すでにアペンダーが作成されている場合は、時間を節約してそれを使用してみませんか?

27
Jose Chavez

http://logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/DailyRollingFileAppender.htmlhttp:// logging.Apache.org/log4j/1.2/apidocs/org/Apache/log4j/RollingFileAppender.html

自分でコーディングする必要があります。良い知らせは、これらのクラスの機能を「マージ」するだけで、「低レベル」の新しいコードは必要ないということです。

12
razenha

私はこの投稿が少し遅いことを知っていますが、TimeAndSizeRollingAppenderを試すことができます。これは、Apache 2.0ライセンスの下で無料で入手できます。 www.simonsite.org.uk からダウンロードしてください。

10
Simon

「コンパニオン」プロジェクトのLog4J Extrasは、探しているものを含め、ローリングに関する一連のポリシーを提供します。

APIDoc: http://logging.Apache.org/log4j/extras/apidocs/index.html ホームページ: http://logging.Apache.org/log4j/extras/ =

7
Florian Thiel

Log4jの使用

@JavaJigsが言ったように、Log4jの追加機能を使用できます。

まず最初に、Mavenを使用している場合は、競合を回避するために、同じlog4jバージョンを使用することを念頭に置いて、依存関係として追加してください。

<!-- you should already have something like this -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.17</version>
</dependency>

<!-- add this one, please note the version is the same than log4j -->
<dependency>
    <groupId>log4j</groupId>
    <artifactId>Apache-log4j-extras</artifactId>
    <version>1.2.17</version>
</dependency>

次に、両方の種類のローリングを使用するようにアペンダーを設定します。これは、毎分および/またはログファイルのサイズが1000バイトを超えたときにロールバックする、迅速かつダーティな例です。

<appender name="rollout5" class="org.Apache.log4j.rolling.RollingFileAppender">
    <rollingPolicy class="org.Apache.log4j.rolling.TimeBasedRollingPolicy">
        <param name="ActiveFileName" value="log4j-current.log" />
        <param name="FileNamePattern" value="log4j-%d{HH-mm}.%i.log.gz" />
    </rollingPolicy>
    <triggeringPolicy class="org.Apache.log4j.rolling.SizeBasedTriggeringPolicy">
        <param name="MaxFileSize" value="1000" />
    </triggeringPolicy>
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %-5p - %m%n" />
    </layout>
</appender>

通常どおり、ロガーにアペンダーを追加します。

アプリケーションを実行すると、そのようなものが得られるはずです...

log4j-current.log
log4j-18-13.1480266729211.log.gz
log4j-18-12.1480266729095.log.gz
log4j-18-12.1480266729123.log.gz

明らかに、ファイルの数とその名前は、アプリケーションのログ方法によって異なります。

ご覧のとおり、%iプレースホルダーは、ランダムでありながら増加し続ける一種の数字に置き換えられます。私はそれを0から始まる番号に置き換える方法を見つけることができませんでした。それでも、アルファベット順にリストされているそのようなファイルは、それらの履歴の順序と一致する必要があります。

その他のアイデア

私はあなたが明示的にlog4jについて言及したことを知っています。しかし、可能であれば、log4j2への移行を評価してみませんか? このlog4j2のドキュメント あなたのニーズに合うと思われる例がいくつかあります。

6
danidemi

返信するには遅すぎます。しかし、うまくいけば、これは誰かを助けるでしょう。

Log4j依存関係をpom.xmlファイルに追加します

   <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>1.2.17</version>
    </dependency>

このFileAppender実装のコピーを取得します。このファイルの作成者に感謝します。

http://haobangshou.googlecode.com/svn/trunk/hbs/APPLICATION/server/common/src/com/hbs/common/appender/TimeSizeRollingFileAppender.Java

このlog4j.xmlファイルをリソースフォルダーに配置します

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>
<appender name="consoleAppender" class="org.Apache.log4j.ConsoleAppender">
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%p] %c{1} %m%n"/>
    </layout>
</appender> 

<appender name="debug" class="com.myproject.log.TimeSizeRollingFileAppender">
    <param name="File" value="log/debug.log"/>
    <param name="MaxBackupIndex" value="300"/>
    <param name="Encoding" value="GB2312"/>
    <!--CHANGE THIS TO A LARGER SIZE EG : 20MB. USE 1MB TO TEST IF THE SETTING WORKS.-->
    <param name="MaxFileSize" value="1MB"/>
    <param name="DatePattern" value="'.'yyyy-MM-dd"/>
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d{ISO8601} %p [%c] - [%m]%n"/>
    </layout>
</appender>

<!--CHANGE name TO ROOT PACKAGE NAME OF YOUR PROJECT THAT YOU WANT TO LOG.-->
<logger name="com.myproject" additivity="false">
    <level value="debug"/>
    <appender-ref ref="consoleAppender"/>
    <appender-ref ref="debug"/>
</logger>


<logger name="org.springframework" additivity="false">
    <level value="debug"/>
    <appender-ref ref="consoleAppender"/>
    <appender-ref ref="debug"/>
</logger>

<logger name="org.hibernate" additivity="false">
    <level value="debug"/>
    <appender-ref ref="consoleAppender"/>
    <appender-ref ref="debug"/>
</logger>

<root>
    <priority value="INFO"></priority>
    <appender-ref ref="consoleAppender"/>
    <appender-ref ref="debug"/>
 </root>

簡単なテストを行うには:

import org.Apache.log4j.Logger;

public class Main {

    static public void main(String[] args) {
        Logger log = Logger.getLogger(Main.class);
        for(int i = 0; i < 10000; i ++)
            log.info("Testing log");
        }
}

できた!!

5
hajime

私たちは、あなたが見るクラス here を使用します。あなたが説明したように動作し、FileAppenderを拡張します。

1
Steven