dourang8305 2017-10-18 00:51
浏览 103
已采纳

如何在Slim和Monolog发生错误时收到包含日志详细信息的电子邮件

My website is built over Slim Framework V3, and uses Monolog. I want to get an email notification when something goes wrong on my website (any log message above Error). In other words, I want to know when a Critical, Alert or Emergency message is logged.

Ideally, I want to also get the logs right before the error also in the same email, to make it easier to debug.

This is my current Monolog configuration (Slim default):

// 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;
}

These are the log settings:

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,
    ]
];
  • 写回答

1条回答 默认 最新

  • dongyi6668 2017-10-18 00:51
    关注

    I came up with a solution which involves the standard StreamHandler, the NativeMailHandler and the FingersCrossedHandler.

    The StreamHandler simply logs everything above the given level, which is fine.

    Now, the trick to get detailed emails when a certain level of error happens is to combine a NativeMailHandler with a 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;
    };
    

    These are my logger settings (in 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,
        ]
    ];
    

    How it works

    According to the monolog source code, the FingersCrossedHandler does the following :

    Only requests which actually trigger an error (or whatever your actionLevel is) will be in the logs, but they will contain all records, not only those above the level threshold.

    Therefore, this statement will make sure our NativeMailerHandler is used by the FingersCrossedHandler when a message with level Critical or more is called:

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

    Hope this helps someone!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效