将重大事件消息定向到单独的 Log::Log4perl 记录器

Directing significant-event messages to a separate Log::Log4perl logger

我需要将重大事件消息收集到单独的日志文件中。 (常规日志相当臃肿,用于维护,而用户只对极少数事件感兴趣。)

尽管所有 ERROR 级别及更高级别的事件都被视为 "significant",但事件与级别无关。许多此类事件的级别为 INFO 或 WARN。因此,级别阈值或匹配似乎不是答案。

此外,事件不限于层次结构的给定分支。这些可能来自整个应用程序,所以 "categories" 似乎也不适合,或者是吗?

编辑: 目前,我有一个 INFO 级别的一般维护记录器和一个 WARN 级别的屏幕记录器

有没有办法用Log::Log4perl实现这样的记录器?

此致

梅尔

您可以通过在 Log4perl 中添加 an additional category 来实现。

Categories are also called "Loggers" in Log4perl, both refer to the same thing and these terms are used interchangeably

您可以像这样获取额外的记录器:

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实例使用的name,配置在最下面两行。第一行基本意思是:

Send everything with loglevel TRACE or higher to the Appender named ImportantApp.

Important 是记录器的名称,或者我们在上面用 get_logger("Important").

抓取的 类别

您可以使用 filters:

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