簡體   English   中英

如何在 log4j.xml 的 appender 中給出動態文件名

[英]How to give dynamic file name in the appender in 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,日志記錄應該 go 到D:/logFiles/ABC.log ,但是如果我運行 XYZ.java,日志記錄應該 go 到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");
        appender.activateOptions();

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

快樂編碼。

使用您自己的類擴展FileAppender更有意義,您可以在其中覆蓋setOptions()方法。 然后在您的log4j.properties您將 root 配置為登錄到yourpackage.yourFileAppender ,這要干凈得多。

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

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

在你的 log4j.xml 文件中,在 File param 的 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>

奇跡般有效

在執行任何操作之前,log4j 會徹底檢查 log4j.xml 配置文件的類路徑。 假設,如果您在項目中引用的庫 jar 中有任何 log4j.xml 配置文件,log4j 會將該文件作為配置文件加載並開始記錄。 在這種情況下,當您通過從系統屬性中獲取@Big B 建議的值來動態設置 FileAppender 中的日志文件位置時,它將不起作用,因為 log4j 已經加載了它首先發現的配置文件。

為了防止這種情況,您可以使用DOMConfigurator通知 log4j 它應該加載什么配置文件以及它應該何時加載。 因此,一旦您在程序中設置了 LogFileLocation 的系統屬性,就可以使用 DOMConfigurator 按以下方式加載預期的屬性文件:

System.setProperty("LogFileLocation", "D:Test/Logdetails"));
DOMConfigurator.configure("log4j.xml");

通過這種方式,您將在程序中設置系統屬性 LogFileLocation 后加載 log4j.xml。 (它也會覆蓋已經加載的配置)

在 log4j.xml 配置中,您在參數標記“文件”中設置文件位置:

<appender name="fileAppender"
        class="org.apache.log4j.FileAppender">
        <param name="File" value="${LogFileLocation}.log" />
        <param name="Append" value="false" /> 
<!-- false will make the log to override the file. true will make the log to append to the file -->
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern"
                value="%d{dd/MM/yyyy HH:mm:ss} %-5p %c{2} 
        - %m%n" />
        </layout>
    </appender>

為了更好地理解我所說的內容,請在您的 VM 參數中提供-Dlog4j.debug=true並在您的控制台中查看 log4j 執行的日志。

對我來說,只有在我使用 ${sys: ... 之后它才起作用,如下所示。 否則它不會獲取 java 命令中設置的變量。

<param name="File" value="${sys:logfilename}.log" />

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM