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