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

Ответы

Ответ 1

Намного проще сделать следующее:

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

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

Ответ 2

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

Ответ 3

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

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

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

И в вашем файле log4j.xml используйте свойство 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>

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