2012-05-08 3 views
3

Я использую файл log4j FileAppender в своем проекте для сбора определенных результатов. Когда мое приложение перезагрузится, я хочу сохранить предыдущий файл результатов и начать новый. Это возможно?log4j rollover при перезапуске

Например:

  • Start приложения, писать результаты results.log
  • Применение заканчивается
  • перезапуска приложения, записать результаты results_1.log
  • ...

I'v проверил DailyRollingFileAppender, но это не совсем то, что мне нужно, потому что это автоматически перевернется на certa в настройках даты. Мне нужно выполнить опрокидывание при перезагрузке приложения.

ответ

1

Как насчет того, чтобы ваше приложение задавало файл журнала динамически? Вы можете сделать это, создав файл-приложение программно, когда ваше приложение запустится и привяжет его к вашему текущему регистратору.

Например, следующий код создаст новые файлы журналов на основе текущего времени. например results_1336482894.log, results_1336486780.log

Date now = new Date(); 
    FileAppender myFileAppender = new FileAppender(); 
    myFileAppender.setName("myFileAppender"); 
    myFileAppender.setFile("results_" + now.getTime() + ".log"); 
    myFileAppender.setLayout(new PatternLayout("%d %-5p [%t]: %m%n")); 
    myFileAppender.setThreshold(Level.DEBUG); 
    myFileAppender.activateOptions(); 

    Logger myLogger = Logger.getLogger("name of your logger"); //Or use getRootLogger() instead 
    myLogger.addAppender(myFileAppender); 
+0

Я хочу, чтобы мой код был «чистым», поэтому я удалил всю конфигурацию для log4j в XML-файл раньше. Однако я попытался использовать setFile() как единственную программную конфигурацию и отлично работает. – EsTeGe

0

Вы можете использовать ExternallyRolledFileAppender и Roller классы пролонгировать файл журнала при запуске приложения.

Вот пример класса:

import org.apache.log4j.Logger; 
import org.apache.log4j.varia.Roller; 
public class Test { 
    private static final Logger log = Logger.getLogger(Test.class); 
    public static void main(final String[] args) { 
     Roller.main(new String[] {"localhost", "9999"}); 
     log.debug("Started application!"); 
    } 
} 

И пример log4j.properties файла:

log4j.appender.file=org.apache.log4j.varia.ExternallyRolledFileAppender 
log4j.appender.file.File=app.log 
log4j.appender.file.Port=9999 
log4j.appender.file.MaxBackupIndex=5 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=[%d{yyyy-MM-dd HH:mm:ss.SSS}] %-5p: %t: %c: %m%n 
log4j.rootLogger=DEBUG, file 

ли внять предупреждение в ExternallyRolledFileAppender:

Обратите внимание, что инициатор не прошел проверку подлинности. Любой может вызвать опрокидывание. В производственных средах рекомендуется добавить некоторую защиту, чтобы предотвратить нежелательные опрокидывания.

Если это не подходит для ваших нужд, это должно быть тривиально, чтобы создать свою собственную аналогичную реализацию Appender.

1

Я решил эту проблему, написав свой собственный Appender:

import org.apache.log4j.RollingFileAppender; 

/** 
    This appender rolls over at program start. 
    This is for creating a clean boundary between log data of different runs. 
*/ 
public class RunRolledFileAppender 
    extends RollingFileAppender 
{ 
    public RunRolledFileAppender() { } 

    @Override 
    public void activateOptions() { 
    super.activateOptions(); 
    super.rollOver(); 
    } 

    @Override 
    public void rollOver() { } 

} 

Примечание уродливое отключение при опрокидывании,() было необходимо, так как установка MaxFileSize не работает, и что Appender иначе и перевернулась каждый 10Мб, который Мне это не нужно.

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