我的网站建立在Slim Framework V3之上,并使用Monolog。我希望在我的网站上出现问题时收到电子邮件通知(错误上方的任何日志消息)。换句话说,我想知道何时记录严重,警报或紧急消息。
理想情况下,我还希望在同一封电子邮件中也能在错误发生之前获取日志,以便更容易调试。
这是我当前的Monolog配置(Slim默认值):
// monolog
$container['logger'] = function ($c) {
/** @var \Slim\Container $c */
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
return $logger;
}
这些是日志设置:
return [
// Monolog settings
'logger' => [
'name' => 'slim-app',
'path' => __DIR__ . '/logs/' . $logDate->format('Y-m-d') . '_app.log', //TODO: Make sure logs are above DocumentRoot
'level' => \Monolog\Logger::DEBUG,
]
];
答案 0 :(得分:0)
我想出了一个涉及标准StreamHandler
,NativeMailHandler
和FingersCrossedHandler
的解决方案。
StreamHandler
只记录给定级别以上的所有内容,这很好。
现在,在发生某种程度的错误时获取详细电子邮件的技巧是将NativeMailHandler
与FingersCrossedHandler
合并。
// monolog
$container['logger'] = function ($c) {
/** @var \Slim\Container $c */
$settings = $c->get('settings')['logger'];
$logger = new Monolog\Logger($settings['name']);
$logger->pushProcessor(new Monolog\Processor\UidProcessor());
$logger->pushHandler(new Monolog\Handler\StreamHandler($settings['path'], $settings['level']));
//Handler to send email on critical (or above) errors
//Uses the FingersCrossed strategy which buffers all messages preceeding the critical error
$dt = new DateTime();
$mailHandler = new Monolog\Handler\NativeMailerHandler(
'me@example.com', //TODO: The email address where to send emails
'[ERROR] : Unexpected error happened that requires immediate attention ' . $dt->format('Y-m-d'),
'no-reply@example.com',
$settings['level'],
true,
2000
);
$logger->pushHandler(new Monolog\Handler\FingersCrossedHandler($mailHandler, Monolog\Logger::CRITICAL));
return $logger;
};
这些是我的记录器设置(在settings.php中):
return [
// Monolog settings
'logger' => [
'name' => 'slim-app',
'path' => __DIR__ . '/logs/' . $logDate->format('Y-m-d') . '_app.log', //TODO: Make sure logs are above DocumentRoot
'level' => \Monolog\Logger::DEBUG,
]
];
工作原理
根据monolog source code,FingersCrossedHandler
执行以下操作:
仅实际触发错误的请求(或任何您的错误) actionLevel是)将在日志中,但它们将包含所有 记录,不仅仅是那些高于阈值的记录。
因此,当调用级别为Critical或更高级别的消息时,此语句将确保FingersCrossedHandler使用我们的NativeMailerHandler:
new Monolog\Handler\FingersCrossedHandler($mailHandler, Monolog\Logger::CRITICAL)
希望这有助于某人!