2017-10-18 126 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) 

希望這可以幫助別人!

相關問題