Log4j - несколько приложений записывают в один и тот же файл, который всегда регистрирует - PullRequest
8 голосов
/ 29 октября 2010

У меня есть приложение log4j, определенное как:

log4j.logger.com.example = DEBUG, filelog

log4j.appender.filelog=org.apache.log4j.DailyRollingFileAppender
log4j.appender.filelog.File=c:/app.log
log4j.appender.filelog.layout=org.apache.log4j.PatternLayout
log4j.appender.filelog.layout.ConversionPattern=%d | %m%n
log4j.appender.filelog.DatePattern=.dd-MM-yyyy

В моем классе я получаю регистратор вроде:

Log logger = LogFactory.getLog(getClass());

Это работает правильно.Я хочу иметь регистратор, который всегда регистрирует определенные сообщения (не ошибки, а такие вещи, как длительность транзакций).Если я напишу их в DEBUG или INFO, я не увижу их, если уровень журнала будет изменен.Я думаю, что могу сделать это, используя другой appender, который записывает в тот же файл.

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

Log alwaysLogger = LogFactory.getLog(ALWAYS);
alwaysLogger.debug("This message will always be written regardless of the level set on the filelog appender");

Update Я мог бы записать в два разных файла журналаесли необходимо, но как мне получить экземпляр логгера в моем классе?Я не хочу настраивать один пакет / класс так, чтобы он всегда использовал один аппендер над другим, так как классы должны будут регистрировать информацию / сообщения об ошибках и транзакционные сообщения «всегда» во время обычного запуска.Есть ли способ выполнить то, что мне нужно, даже если он записывает в два разных файла журнала?

Ответы [ 4 ]

8 голосов
/ 29 октября 2010

Не думаю, что log4j действительно поддерживает запись двух приложений в один и тот же файл из-за проблем с синхронизацией. Лучше всего было бы, если это возможно, переключиться на slf4j , используя Logback в качестве вашей системы ведения журнала бэкенда, поскольку Logback является преемником log4j и также поддерживает запись нескольких приложений в один файл. Проверьте FileAppender и его разумный режим.

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

2 голосов
/ 30 июля 2015

Я получил это для работы с помощью AsyncAppender с. У меня был мой главный appender, который указал файл для входа, и другие мои appenders ссылались на него.

, например

<appender name="top" class="org.apache.log4j.rolling.RollingFileAppender">
    <param name="file" value="myLog.log" />
</appender>

<appender name="other" class="org.apache.log4j.AsyncAppender">
    <appender-ref ref="top" />
</appender>

<logger name="com.example.MyCLass">
    <appender-ref ref="other" />
</logger>

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

2 голосов
/ 29 октября 2010

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

Log alwaysLogger = LogFactory.getLog("a.b.c.ALWAYS");
Log sometimesLogger = LogFactory.getLog("a.b.c.SOMETIMES");

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

0 голосов
/ 23 октября 2013

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

Оформите заказ код + пример :

Любые вопросы приветствуются.

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