Как заставить log4j создавать файлы журналов только по требованию? - PullRequest
10 голосов
/ 27 апреля 2010

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

Ответы [ 4 ]

6 голосов
/ 03 августа 2012

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

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

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

4 голосов
/ 08 ноября 2010

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

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

0 голосов
/ 24 мая 2019

В 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

0 голосов
/ 28 февраля 2017

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

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 настраивает только консольный приложение. Когда я хочу начать регистрацию, я вызываю метод startLog (). Когда я хочу войти в другой файл, я сначала вызываю stopLog (), а затем метод startLog ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...