web-dev-qa-db-ja.com

log4j.xmlのアペンダーで動的ファイル名を指定する方法

Log4jを使用して情報を記録しています。ログファイルの作成にlog4j.xmlファイルを使用しました。各ログファイルの絶対パスをparamタグ値として指定しました。

例えば。:

<appender name="FA" class="org.Apache.log4j.DailyRollingFileAppender">
  <param name="DatePattern" value="'_'yyyyMMdd"/>
  <param name="File" value="D:/logFiles/GPreprocessor.log"/>
  <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>

「GPreprocessor.log」を直接書きたくありません。実際、そのファイル名は、プロジェクトの名前に基づいて動的です。たとえば、プログラムABC.Javaを実行すると、ログはD:/logFiles/ABC.logに移動しますが、XYZ.Javaを実行すると、ログはD:/logFiles/XYZ.logに移動します。ファイルの場所は常に同じままです:D:/logFiles/。ログファイルの名前を動的に変更するにはどうすればよいですか?

20
Bittu

次のことを行う方がはるかに簡単です。

Log4j.xmlで変数を$ {variable}として定義します。

<appender name="FILE" class="org.Apache.log4j.FileAppender">    
    <param name="File" value="${logfilename}.log" />
    <layout class="org.Apache.log4j.PatternLayout">
        <param name="ConversionPattern" value="%d::[%t]::%-5p::%c::%x - %m%n" />
    </layout>       
</appender>

次に、JVMを起動するときに次のようなシステムプロパティを設定します。

Java -Dlogfilename=my_fancy_filename  example.Application

動的ログファイル名が作成されます:my_fancy_filename.log

あるいは、ロガーを作成する前にシステムプロパティを設定することができます(たとえば、ログにPIDが必要な場合に便利です)。といった:

System.setProperty("logfilename", "a_cool_logname");

それが設定されたら、先に進んでロガーを通常どおり取得し、動的ファイルにログを記録します(メインメソッドが実行される前にロガーを作成する静的ロガーに注意してください)。

78
Big B

以下は、Log4Jを使用して動的にファイル名を生成するためのコードです。入力ファイル名と現在の日時に従って名前を変更します。 (同じファイルを複数回実行する場合に役立ちます。)

public class LogClass {

    private static Logger log =  Logger.getLogger(LogClass.class);
    private static boolean initializationFlag = false;
    private static String fileName;

    private static void intializeLogger(){
        log.setLevel(Level.DEBUG);

        DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        Date date = new Date();

        RollingFileAppender appender = new RollingFileAppender();
        appender.setAppend(true);
        appender.setMaxFileSize("1MB");
        appender.setMaxBackupIndex(1);
        appender.setFile(fileName + "_" + dateFormat.format(date) + ".log");

        PatternLayout layOut = new PatternLayout();
        layOut.setConversionPattern("%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n");
        appender.setLayout(layOut);

        log.addAppender(appender);
    }

    public static Logger getLogger(){
        if(initializationFlag == false){
            intializeLogger();
            initializationFlag = true;
            return LogClass.log;
        }
        else{
            return LogClass.log;
        }
    }

    public static void setFileName(String fileName){
        LogClass.fileName = fileName;
    }
}

プログラムでロガーを使用する場合は、次の2行を記述するだけです。

LogClass.setFileName(yourFileName);
LogClass.getLogger().debug("hello!!");

ハッピーコーディング。

7
doer_uvc

setOptions()メソッドをオーバーライドする独自のクラスでFileAppenderを拡張する方が理にかなっています。次に、log4j.propertiesログに記録するようにルートを設定しますyourpackage.yourFileAppender、これはずっときれいです。

4
Nik

Mainメソッドを含むクラスで、クラスの名前をシステムプロパティに設定します。次の例では、プロパティ名としてlog_dirを使用しました。

class ABC{
 public static void main(String s[]){
  System.setProperty("log_dir", ABC.class.getSimpleName());
 }
}

また、log4j.xmlファイルでは、Fileパラメーターのvalue属性でlog_dirプロパティを使用します

<appender name="FA" class="org.Apache.log4j.DailyRollingFileAppender">
  <param name="DatePattern" value="'_'yyyyMMdd"/>
  <param name="File" value="D:/logFiles/${log_dir}"/>
  <layout class="com.dnb.genericpreprocessor.common.log.AppXMLLayout"/>
</appender>

魔法のように働く

0
Bopsi