簡體   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