繁体   English   中英

当Slim和Monolog发生错误时,如何获取包含日志详细信息的电子邮件

[英]How to get an email with log details when errors occur with Slim and 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,
    ]
];

我想出了一个涉及标准StreamHandlerNativeMailHandlerFingersCrossedHandler的解决方案。

StreamHandler只需记录高于给定级别的所有内容,就可以了。

现在,在发生一定程度的错误时获取详细电子邮件的技巧是将NativeMailHandlerFingersCrossedHandler结合使用。

// 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源代码FingersCrossedHandler执行以下操作:

只有真正触发错误(或您的actionLevel不管是什么)的请求才会出现在日志中,但它们将包含所有记录,不仅是那些超出级别阈值的记录。

因此,此语句将确保在调用级别为Critical或更高级别的消息时,FingersCrossedHandler使用我们的NativeMailerHandler:

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

希望这对某人有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM