2017-10-18 49 views
0

我的网站是建立在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, 
    ] 
]; 

回答

0

我想出了其中涉及的标准StreamHandler的解决方案,该NativeMailHandlerFingersCrossedHandler

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(
     '[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) 

希望这可以帮助别人!

相关问题