如何获得一个电子邮件与日志详细信息时,发生错误和Monolog错误
问题描述:
我的网站是建立在Slim Framework V3,并使用Monolog。我想在我的网站出现问题时收到电子邮件通知(任何日志消息高于错误)。换句话说,我想知道何时记录了紧急,警报或紧急消息。如何获得一个电子邮件与日志详细信息时,发生错误和Monolog错误
理想情况下,我还想在错误发生之前在同一封电子邮件中获取日志,以便于调试。
这是我目前的独白配置(超薄默认):
// 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,
]
];
答
我想出了其中涉及的标准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(
'[email protected]', //TODO: The email address where to send emails
'[ERROR] : Unexpected error happened that requires immediate attention ' . $dt->format('Y-m-d'),
'[email protected]',
$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
执行以下操作:
只有实际触发err的请求或者(或者你的动作级别为 )将在日志中,但它们将包含所有 记录,而不仅仅是高于阈值的记录。
因此,此声明将确保我们的NativeMailerHandler使用由FingersCrossedHandler当临界以上级别的消息被称为:
new Monolog\Handler\FingersCrossedHandler($mailHandler, Monolog\Logger::CRITICAL)
希望这可以帮助别人!