2010-05-11 52 views
15

我正在使用log4j來記錄信息。我使用了log4j.xml文件來創建日誌文件。我已將每個日誌文件的絕對路徑標記爲param標記值。如何在appender中給log4j.xml中的動態文件名

例如爲:

<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/。我如何動態更改日誌文件的名稱?

回答

65

這是很容易做到以下幾點:

在的log4j.xml定義變量$ {}變量:

<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"); 

一旦設置,你可以繼續前進,讓你記錄儀正常,他們將記錄到動態文件(注意那些創造記錄器main方法執行之前靜態記錄器)。

+1

請問它支持/需要,如果我給的值。屬性文件?即,而不是定義JVM開始的值,我可以在.properties文件中定義它嗎? – SuRa 2014-12-09 12:45:09

+0

如果您使用 System.setProperty(「logfilename」,「a_cool_logname」); 請確保在記錄任何內容之前設置此項 – James 2017-03-05 15:24:41

4

將自己的課程擴展爲FileAppender更有意義,其中您覆蓋了setOptions()方法。然後在您的log4j.properties中,您將root配置爲登錄到yourpackage.yourFileAppender,這更清潔。

2

下面是我使用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; 
    } 
} 

現在,只要你想使用記錄在你的程序, 只寫兩行:

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

編碼愉快。

0

在包含main方法的類中,將您的類的名稱設置爲某個系統屬性。在以下示例中,我使用log_dir作爲屬性名稱。

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

而在你的log4j.xml文件中使用的文件PARAM的價值屬性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> 

就像一個魅力

相關問題