Как получить электронное письмо с деталями журнала при возникновении ошибок с Slim и Monolog

Мой сайт построен на 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

Решение

Я придумал решение, которое включает в себя стандарт 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,
]
];

Как это устроено

Согласно исходный код монолога, FingersCrossedHandler делает следующее:

Только запросы, которые на самом деле вызывают ошибку (или что-то еще
actionLevel есть) будет в логах, но они будут содержать все
записи, а не только те, которые выше порога уровня.

Следовательно, этот оператор будет гарантировать, что наш NativeMailerHandler используется FingersCrossedHandler при вызове сообщения с уровнем Critical или более:

new Monolog\Handler\FingersCrossedHandler($mailHandler, Monolog\Logger::CRITICAL)

Надеюсь, это поможет кому-то!

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru