Как указать динамическое имя файла в приложении в 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>
Работает как шарм