如何在log4j.xml中的appender中提供动态文件名

Bit*_*ttu 21 log4j dynamic-data

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

我不想直接写"GPreprocessor.log".实际上,根据我的项目名称,该文件名是动态的.例如,如果我运行程序ABC.java,则应该进行日志记录D:/logFiles/ABC.log,但是如果我运行XYZ.java,则应该进行日志记录D:/logFiles/XYZ.log.文件的位置将始终保持不变:D:/logFiles/.如何动态更改日志文件的名称?

小智 80

这样做要容易得多:

在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>
Run Code Online (Sandbox Code Playgroud)

然后确保在启动JVM时设置系统属性,例如:

java -Dlogfilename=my_fancy_filename  example.Application
Run Code Online (Sandbox Code Playgroud)

这将创建一个动态日志文件名: my_fancy_filename.log

或者,您可以在创建记录器之前在代码中设置系统属性(如果您希望在日志中使用PID,这很有用).如:

System.setProperty("logfilename", "a_cool_logname");
Run Code Online (Sandbox Code Playgroud)

一旦设置完毕,您就可以继续正常运行记录器,并且会记录到动态文件(请注意那些在主方法执行之前创建记录器的静态记录器).

  • 如果您使用的是log4j2,我相信您需要在XML中使用“ $ {sys:logfilename}” (2认同)

doe*_*uvc 7

下面是我使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,只要您想在程序中使用logger,只需写下以下两行:

LogClass.setFileName(yourFileName);
LogClass.getLogger().debug("hello!!");
Run Code Online (Sandbox Code Playgroud)

快乐的编码.