选项 1:使用 bubble 参数
假设您的系统仅生成 INFO 和 ERROR 级别的消息(或更准确地说,为每个日志级别生成了处理程序),将消息发送到正确的处理程序的最简单方法是设置处理程序堆栈以正确的顺序并在处理程序的构造函数中使用bubble 参数:
$logger = new \Monolog\Logger('ChannelName');
// Note that higher-level messages are higher in the stack (added last)
$logger->pushHandler(new \Monolog\Handler\StreamHandler(
LOG_DIR.'info.log',
\Monolog\Logger::INFO
));
$logger->pushHandler(new \Monolog\Handler\StreamHandler(
LOG_DIR.'error.log',
\Monolog\Logger::ERROR,
false // Prevents messages from bubbling 'up' the handler stack
));
$logger->info('Test info message.'); // Only sent to info.log
$logger->error('Test error message.'); // Only sent to error.log
请记住,堆栈被处理为“后进先出”,因此添加到堆栈的最后一项是第一个处理的项。因为日志级别是处理程序将处理的最低级别,所以处理程序应按从低到高的顺序添加到堆栈中。
bubble 参数,默认为true,指示消息是否应该传播到堆栈中的其余处理程序(不另一个答案中描述的日志级别)。通过在上面的代码中将其设置为false,在错误处理程序处理完消息后,堆栈的其余部分不会被调用。
选项 2:使用 FilterHandler 包装器
如果您对系统生成的每个日志级别都有处理程序,上述操作就可以了。但如果不是这样呢?例如,如果您希望错误日志捕获级别 ERROR 及更高级别的任何内容,但您还想要一个仅处理级别 ALERT 的处理程序,例如发送电子邮件通知,该怎么办?
Monolog 的FilterHandler 是一个包装器,可让您指定处理程序将接收的日志级别。您可以指定从最小值到最大值的级别范围,或明确级别的列表。
它的构造函数接受以下参数:
| Parameter |
Type |
Description |
Default |
| $handler |
callable |
HandlerInterface |
Handler or factory callable($record|null, $filterHandler) |
| $minLevelOrList |
int|array |
A list of levels to accept or a minimum level if maxLevel is provided |
Logger::DEBUG |
| $maxLevel |
int|string |
Maximum level to accept, only used if $minLevelOrList is not an array |
Logger::EMERGENCY |
| $bubble |
bool |
Whether the messages that are handled can bubble up the stack or not |
true |
要使用它,我们只需将它添加到处理程序堆栈的顶部:
$logger = new \Monolog\Logger('ChannelName');
// Note that higher-level messages are higher in the stack (added last)
$logger->pushHandler(new \Monolog\Handler\StreamHandler(
LOG_DIR.'info.log',
\Monolog\Logger::INFO
));
$logger->pushHandler(new \Monolog\Handler\StreamHandler(
LOG_DIR.'error.log',
\Monolog\Logger::ERROR,
false // Prevents messages from bubbling up the handler stack
));
// Use FilterHandler to only pass certain messages to a handler
$logger->pushHandler(new \Monolog\Handler\FilterHandler(
new \Monolog\Handler\StreamHandler(LOG_DIR.'alerts.log'), // Handler to receive filtered messages
[\Monolog\Logger::ALERT] // Explicit list only contains ALERT
));
$logger->info('Test info message.'); // Sent to info.log only
$logger->error('Test error message.'); // Sent to error.log
$logger->alert('Test alert message.'); // Sent to alerts.log and error.log
$logger->emergency('Test emergency message.'); // Sent to error.log
注意以下几点:
- 未设置目标处理程序的日志级别,将其保留为默认的
Logger::DEBUG,因为FilterHandler 将控制它接收的消息级别。
- 冒泡保留在默认的
true,以便调用堆栈的其余部分。
-
Logger::ALERT 作为数组传递,因此它将被视为显式项而不是最低级别,因此 EMERGENCY 消息不会发送到 alerts.log。
最后一件事:Monolog 附带 many other handlers,用于进行特殊处理,例如电子邮件。为简单起见,我只是使用StreamHandler 作为目标处理程序。