java 如何在log4j.xml的appender中动态给予文件名

6ioyuze2  于 2023-01-11  发布在  Java
关注(0)|答案(6)|浏览(218)

我使用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>

I do not want to write "GPreprocessor.log" directly. Actually, that file name is dynamic, based on my project's name. For example, if I run the program ABC.java, logging should go to D:/logFiles/ABC.log , but if I run XYZ.java, logging should go to D:/logFiles/XYZ.log . The file's location will always remain the same: D:/logFiles/ . How can I change the log file's name dynamically?

o2g1uqev

o2g1uqev1#

执行以下操作要容易得多:
在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时设置了system属性,例如:

java -Dlogfilename=my_fancy_filename  example.Application

这将创建一个动态日志文件名:my_fancy_filename.log
或者,您可以在代码中设置system属性,只要您在创建日志记录器之前设置即可(例如,如果您希望在日志中包含PID,这将非常有用)。

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

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

jhkqcmku

jhkqcmku2#

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

现在每当你想在你的程序中使用logger,只要写这两行:

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

快乐编码。

wkyowqbh

wkyowqbh3#

用你自己的类扩展FileAppender会更有意义,你可以在类中重写setOptions()方法,然后在log4j.properties中配置root用户登录到yourpackage.yourFileAppender,这样更简洁。

q0qdq0h2

q0qdq0h24#

在包含main方法的类中,将类名设置为某个系统属性。在下面的示例中,我使用log_dir作为属性名。

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

在log4j.xml文件中,使用文件参数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>

工作起来像一个魅力

qmb5sa22

qmb5sa225#

在执行任何操作之前,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配置中,您可以在参数标记“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执行日志。

olhwl3o2

olhwl3o26#

对我来说,只有在使用${sys:...如下所示。如果没有这个,它就不会在java命令中拾取变量集。

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

相关问题