Log4j: Как настроить несколько аппендеров: один направленный на консоль и файл, а другой строго на файл?

Для моего приложения мне удалось настроить log4j для создания нескольких журналов.

Оба приложения выводят данные на консоль и в файл.
Но поскольку первый журнал является моим основным журналом, я считаю, что этот журнал должен быть единственным журналом, выводимым на консоль.

Можно ли отключить второй журнал, чтобы log4j не использовал консоль, но все равно писать в файл?

log4j.rootLogger=DEBUG, stdout

# stdout is set to be ConsoleAppender sending its output to System.out
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss SSS}ms %-5p [%t] - %m%n

log4j.appender.X=org.apache.log4j.FileAppender
log4j.appender.X.File=X.log
log4j.appender.X.Append=false 
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%d{dd MMM yyyy HH:mm:ss SSS}ms %-5p [%t] - %m%n
log4j.logger.X=DEBUG,X

второй присоединитель «Y» настраивается так же, как «X».

Я также думал полностью отключить консоль для обоих приложений и использовать: tail -f X.log внутри окна оболочки для просмотра журналов, но это не очень практично при работе внутри Eclipse.

Мы будем очень благодарны за любые советы.

С уважением,


person Alain    schedule 22.09.2011    source источник
comment
Вы можете прочитать следующий учебник. Это коротко, но ясно. Когда вы понимаете Logger, Appender и Layout, вы можете легко решить эту проблему. logging.apache.org/log4j/1.2/manual.html   -  person Smartmarkey    schedule 22.09.2011


Ответы (3)


Единственный известный мне способ - отключить аддитивность для определенных регистраторов (категорий) в тот момент, когда вы направляете их в тот или иной аппендер. Например.

log4j.logger.com.foo.bar=INFO, X
log4j.additivity.com.foo.bar=false
person Péter Török    schedule 22.09.2011

Как насчет того, чтобы не выводить корневой регистратор на стандартный вывод, а вместо этого отправить свой регистратор X в приложения X и stdout? Таким образом, ваш Y-логгер также не будет выводить на стандартный вывод.

log4j.logger.X=DEBUG,X,stdout
person John B    schedule 22.09.2011

Оба приложения выводят данные на консоль и в файл.

Я думаю, вы запутались в разнице между регистратором и приложением.

Приложение идет только в одно место - в вашей конфигурации вы объявили ConsoleAppender и FileAppender. Это две отдельные сущности. Ни один из этих приложений не выводит данные более чем в одно место.

Регистраторы могут быть настроены на отправку своих выходных данных в ноль многим приложениям, и вы настроили все свои регистраторы для отправки своих выходных данных на консоль в силу rootLogger.

Если вы хотите, чтобы только определенные регистраторы отправляли вывод на консоль, не настраивайте корневой регистратор для использования консоли, а только определенные имена регистраторов.

Если вы хотите, чтобы все регистраторы кроме X отправляли свои выходные данные на консоль, вам необходимо отключить аддитивность для X, чтобы он не наследовал от корневого регистратора.

person matt b    schedule 22.09.2011
comment
Ты был прав, Мэтт, спасибо за разъяснения. Я удалил ConsoleAppender из корневого регистратора и добавил sdtout(console appender) в строку: log4j.logger.X=DEBUG,X,stdout. Я чувствую себя глупо, спасибо! - person Alain; 22.09.2011