如何在log4j.xml的appender中指定动态文件名

如何在log4j.xml的appender中指定动态文件名,log4j,dynamic-data,Log4j,Dynamic Data,我使用log4j来记录信息。我使用了一个log4j.xml文件来创建日志文件。我已将每个日志文件的绝对路径指定为param标记值 例如: 我不想直接写“GPreprocessor.log”。实际上,根据我的项目名称,该文件名是动态的。例如,如果我运行程序ABC.java,日志应该转到D:/logFiles/ABC.log,但是如果我运行XYZ.java,日志应该转到D:/logFiles/XYZ.log。文件的位置将始终保持不变:D:/logFiles/。如何动态更改日志文件的名称?执行以下

我使用log4j来记录信息。我使用了一个
log4j.xml
文件来创建日志文件。我已将每个日志文件的绝对路径指定为
param
标记值

例如:



我不想直接写“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>
这将创建一个动态日志文件名:
my\u fancy\u filename.log

或者,您可以在代码中设置系统属性,只要您在创建记录器之前这样做即可(例如,如果您希望在日志中设置PID,这非常有用)。例如:

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

一旦设置好了,您就可以继续让您的记录器正常工作,它们将记录到动态文件中(注意那些在主方法执行之前创建记录器的静态记录器)。

用您自己的类扩展
FileAppender
,在这个类中重写
setOptions()
方法更有意义。然后在您的
log4j.properties
中,您将root配置为登录到
yourpackage.yourFileAppender
,这更干净。

下面是我使用log4j动态生成文件名的代码。 它根据输入文件名和当前日期时间更改其名称。(在多次运行同一文件时非常有用。)

现在,每当您想在程序中使用记录器时, 只要写下这两行:

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

愉快的编码。

在包含main方法的类中,将类的名称设置为某个系统属性。在下面的示例中,我使用
log\u 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配置中,您可以在param标记“file”中设置文件位置:

<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执行日志。

如果我在.properties文件中给出值,它是否支持/接受?i、 例如,我可以在.properties文件中定义值,而不是在JVM的开头定义值吗?如果使用System.setProperty(“logfilename”,“a_cool_logname”);请确保在记录任何内容之前设置此选项如果您使用的是log4j2,我相信您需要在XML中使用
${sys:logfilename}
,我们是否可以在文件名中提供路径,如“D:/Test/my_fancy_filename”,以便它可以在指定目录中创建my_fancy_filename.log?
<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>
System.setProperty("LogFileLocation", "D:Test/Logdetails"));
DOMConfigurator.configure("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>