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/
。ログファイルの名前を動的に変更するにはどうすればよいですか?
次のことを行う方がはるかに簡単です。
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");
それが設定されたら、先に進んでロガーを通常どおり取得し、動的ファイルにログを記録します(メインメソッドが実行される前にロガーを作成する静的ロガーに注意してください)。
以下は、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!!");
ハッピーコーディング。
setOptions()
メソッドをオーバーライドする独自のクラスでFileAppender
を拡張する方が理にかなっています。次に、log4j.properties
ログに記録するようにルートを設定しますyourpackage.yourFileAppender
、これはずっときれいです。
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>
魔法のように働く