Как дать динамическое имя файла в appender в log4j.xml - PullRequest
20 голосов
/ 11 мая 2010

Я использую 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, регистрация должна идти в D:/logFiles/ABC.log, но если я запускаю XYZ.java, регистрация должна идти в D:/logFiles/XYZ.log. Местоположение файла всегда будет оставаться неизменным: D:/logFiles/. Как я могу динамически изменить имя файла журнала?

Ответы [ 4 ]

77 голосов
/ 02 июля 2011

Гораздо проще сделать следующее:

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

Как только это будет установлено, вы можете продолжать и получать свои регистраторы как обычно, и они будут регистрировать в динамический файл (будьте осторожны с теми статическими регистраторами, которые создают регистраторы перед выполнением вашего основного метода).

7 голосов
/ 19 марта 2014

Ниже приведен мой код для использования 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!!");

Счастливое кодирование.

4 голосов
/ 10 апреля 2012

Имеет смысл расширить FileAppender собственным классом, в котором вы переопределяете метод setOptions(). Затем в вашем log4j.properties вы настраиваете root для входа в систему на yourpackage.yourFileAppender, что намного чище.

0 голосов
/ 07 сентября 2016

В вашем классе, содержащем метод main, задайте имя вашего класса для некоторого системного свойства. В следующем примере я использовал log_dir в качестве имени свойства.

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

И в вашем файле log4j.xml используйте свойство log_dir в атрибуте значения параметра File

<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>

Работает как шарм

...