Как сделать log4j только для создания файлов журналов?

У нас есть модульное приложение, в котором модули имеют свои собственные log4j-журналы (т.е. журнал сообщений и журнал ошибок). Атрибуты и категории для них настроены в основном файле log4j XML, но не все модули всегда установлены. DailyRollingFileAppender создает свой файл независимо от его использования и предоставляет полный набор модулей, хотя он отсутствует, и поскольку некоторые из них являются специфическими для клиента, мы хотели бы скрыть журналы, которые не используются. Есть ли способ заставить DailyRollingFileAppender создавать свой файл при первом использовании, а не автоматически при запуске?

Ответ 1

В файловых приложениях нет возможности ленивно создавать файлы журнала - метод setFile автоматически создает файл, если он еще не существует: ostream = new FileOutputStream(fileName, append);

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

Ответ 2

У меня была та же проблема, поэтому я расширил стандартный класс FileAppender, и я создал новый LazyFileAppender, который является FileAppender, который ленивно инициализирует файл журнала (создает его только при первой операции записи).

LazyFileAppender и некоторые другие дополнения к стандартной библиотеке log4j можно найти в простой библиотеке, которую я создал: log4j-additions.

Вы можете посмотреть источник, чтобы разработать собственное расширение или использовать его как...

Ответ 3

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

public void startLog() {
    SimpleDateFormat sdf_long = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
    FileAppender fa = new FileAppender();
    fa.setName("foo");
    fa.setFile(sdf_long.format(new Date()) + ".log");
    fa.setLayout(new PatternLayout("%d{HH:mm:ss.SSS} %m%n"));
    fa.setThreshold(Level.DEBUG);
    fa.setAppend(true);
    fa.activateOptions();
    Logger.getRootLogger().addAppender(fa);
}

public void stopLog() {
    Logger.getRootLogger().getAppender("foo").close();
    Logger.getRootLogger().removeAppender("foo");
}

Мой файл log4j.properties только настраивает консольный appender. Когда я хочу начать регистрацию, я вызываю метод startLog(). Когда я хочу войти в другой файл, сначала вызываю stopLog(), а затем метод startLog().

Ответ 4

В Log4j 2 и FileAppender, и RollingFileAppender имеют параметр "createOnDemand", который можно использовать для настройки создания файла журнала, только когда событие журнала передается аппендеру.

Пример:

<RollingFile name="LogFile" fileName="test.log" filePattern="test-%i.log.gz" createOnDemand="true">
    <Policies>
        <SizeBasedTriggeringPolicy size="1MB"/>
    </Policies>
    <DefaultRolloverStrategy max="5"/>
</RollingFile>

Подробнее здесь: https://logging.apache.org/log4j/2.x/manual/appenders.html#RollingRandomAccessFileAppender.