Вопрос:

Ролловер log4j при перезагрузке

java log4j

3084 просмотра

4 ответа

1468 Репутация автора

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

Например:

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

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

Автор: EsTeGe Источник Размещён: 08.05.2012 12:10

Ответы (4)


1 плюс

5907 Репутация автора

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

Например, следующий код создаст новые файлы журнала на основе текущего времени. например 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);
Автор: GenericJon Размещён: 08.05.2012 01:19

0 плюса

12723 Репутация автора

Можно использовать 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реализацию должно быть тривиально .

Автор: Dan Cruz Размещён: 08.05.2012 01:29

1 плюс

75 Репутация автора

Я решил это, написав свой собственный 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() { }

}

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

Автор: InI4 Размещён: 15.02.2014 01:49

0 плюса

973 Репутация автора

Log4j2«s RollingFileAppenderимеет политику под названием OnStartupTriggeringPolicy.

В документации говорится:

OnStartupTriggeringPolicyПолитика вызывает опрокидывание , если файл журнал старше времени начала текущего JVM и минимальный размер файла достигнут или превышен.

Пример xmlконфигурации (только Policies):

<Policies>
  <OnStartupTriggeringPolicy />                # restart on startup of JVM
  <SizeBasedTriggeringPolicy size="20 MB" />   # restart file if log file reaches 20MB
  <TimeBasedTriggeringPolicy />                # restart if currend date don't mach date in log file name     
</Policies>

Дополнительная информация и документация: https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingFileAppender.

Автор: franiis Размещён: 13.06.2019 06:43
Вопросы из категории :
32x32