Направление сообщений о значимых событиях в отдельный регистратор Log::Log4perl

Мне нужно собрать сообщения о значимых событиях в отдельный файл журнала. (Обычный журнал довольно раздут и предназначен для обслуживания, в то время как пользователь интересуется только очень немногими событиями.)

События не связаны с уровнем, хотя все ОШИБКИ уровня и вверх события считаются "значительными". Многие такие события имеют уровни INFO или WARN. Следовательно, пороговые значения уровня или сопоставление не являются ответом.

Кроме того, события не ограничиваются данной ветвью иерархии. Они могут исходить от всего приложения, так что "категории" тоже не подходят, или нет?

Изменить: В настоящее время у меня есть общий уровень INFO, регистратор обслуживания и экранный журнал WARN уровня

Есть ли способ добиться такого регистратора с Log::Log4perl?

С уважением

Меир

2 ответа

Решение

Вы можете использовать фильтры:

log4perl.logger = WARN, Log1, Log2
log4perl.filter.Filter1       = sub { ... }
log4perl.filter.Filter2       = sub { ... }
log4perl.appender.Log1        = Log::Log4perl::Appender::Screen
log4perl.appender.Log1.Filter = Filter1
log4perl.appender.Log2        = Log::Log4perl::Appender::File
log4perl.appender.Log2.Filter = Filter2

Или вы можете написать собственные пакеты фильтров, унаследованные от Log::Log4perl::Filter:

log4perl.logger = WARN, Log1, Log2
log4perl.filter.Filter1       = MyApp::Log::Filter1
log4perl.filter.Filter2       = MyApp::Log::Filter2
log4perl.appender.Log1        = Log::Log4perl::Appender::Screen
log4perl.appender.Log1.Filter = Filter1
log4perl.appender.Log2        = Log::Log4perl::Appender::File
log4perl.appender.Log2.Filter = Filter2

Вы можете добиться этого, добавив дополнительную категорию в свой Log4perl.

Категории также называются "Loggers" в Log4perl, оба относятся к одному и тому же термину, и эти термины используются взаимозаменяемо.

Вы можете получить дополнительный регистратор, как это:

my $important_logger = Log::Log4perl->get_logger("Important");

Категория может иметь собственную конфигурацию:

log4perl.logger.Important               = TRACE, ImportantApp
log4perl.additivity.Important           = 0
log4perl.appender.ImportantApp          = Log::Log4perl::Appender::File
log4perl.appender.ImportantApp.filename = important.log

ImportantApp это имя, которое используется для экземпляра Appender, и оно настроено в двух нижних строках. Первая строка в основном означает:

Отправьте все с логическим уровнем TRACE или выше в Appender с именем ImportantApp.

Important это имя регистратора, или Категория, которую мы взяли выше с get_logger("Important"),

Другие вопросы по тегам