2010-05-11 3 views
15

Я использую log4j для регистрации информации. Я использовал файл log4j.xml для создания файлов журнала. Я дал абсолютный путь для каждого файла журнала как значение тега param.Как дать динамическое имя файла в appender в log4j.xml

т.д .:

<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/. Как я могу изменить имя файла журнала динамически?

ответ

65

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

В log4j.xml определить переменную как $ {переменной}:

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

Затем убедитесь, что вы установите системное свойство при запуске виртуальной машины Java, такие как :

java -Dlogfilename=my_fancy_filename example.Application 

Это создаст динамическое имя файла журнала: my_fancy_filename.log

В качестве альтернативы вы можете установить системное свойство в коде до тех пор, пока оно будет создано до создания регистратора (это полезно, если вы хотите, чтобы ваш PID в ваших журналах, например). Такие, как:

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

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

+1

Будет ли поддержка/взять, если я даю значения в.файл свойств? то есть вместо определения значения в начале JVM, могу ли я определить его в файле .properties? – SuRa

+0

, если вы используете System.setProperty ("logfilename", "a_cool_logname"); убедитесь, что вы установили это перед записью всего – James

4

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

2

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

Счастливый кодирования.

0

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

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

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

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

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

Смежные вопросы