2017-10-18 5 views
0

Mon site Web est construit sur Slim Framework V3 et utilise Monolog. Je veux recevoir une notification par e-mail lorsque quelque chose ne va pas sur mon site Web (tout message de journal ci-dessus Erreur). En d'autres termes, je veux savoir quand un message Critique, Alerte ou Urgence est enregistré.Comment obtenir un e-mail avec les détails du journal lorsque des erreurs se produisent avec Slim et Monolog

Idéalement, je veux également obtenir les journaux juste avant l'erreur également dans le même courriel, pour faciliter le débogage.

Voici ma configuration actuelle de Monologue (par défaut 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; 
} 

Ce sont les paramètres du journal:

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, 
    ] 
]; 

Répondre

0

je suis venu avec une solution qui implique la StreamHandler standard, le NativeMailHandler et le FingersCrossedHandler.

Le StreamHandler enregistre simplement tout au-dessus du niveau donné, ce qui est bien.

Maintenant, l'astuce pour obtenir des emails détaillés quand un certain niveau d'erreur arrive est de combiner un NativeMailHandler avec un 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(
     '[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; 
}; 

Ce sont mes paramètres de l'enregistreur (en 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, 
    ] 
]; 

Comment ça marche

Selon le monolog source code, le FingersCrossedHandler effectue les opérations suivantes:

Seules les demandes qui déclenchent réellement une erreur ou (ou quel que soit votre actionLevel est) sera dans les journaux, mais ils contiendront tous les enregistrements , pas seulement ceux au-dessus du seuil de niveau.

Par conséquent, cette déclaration fera en sorte que notre NativeMailerHandler est utilisé par le FingersCrossedHandler lorsqu'un message avec le niveau critique ou plus est appelé:

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

Hope this helps quelqu'un!