2015-09-02 60 views
4

使用Laravel 5,我希望通過直接調用此方法觸發每次觸發Log::error(或類似)的通知(鬆弛但無關緊要)或者通過默認ExceptionHandler調用report方法。我想我必須擴展默認的Laravel的日誌系統,但我不確定。 什麼是(最好的)「laravel方式」來做到這一點?(在我的整個代碼中沒有更改每個Log::error調用)。每次發送鬆弛通知Log ::錯誤被觸發

首先,我認爲我只需要將Log Facade更改爲另一個,但它不會處理ExceptionHandler(即由於未捕獲的異常導致的500錯誤)。另一種解決方案可能是直接在ExceptionHandler中添加一些代碼,但如果我通過Log::error()或其他方式報告錯誤(app('logger')->error(),logger()->error()等),它將不會被觸發。

+2

你可以看看使用Slack monolog處理程序,它會自動在你的依賴關係中,你只需要設置它https://github.com/Seldaek/monolog/blob/master/src/Monolog/Handler/ SlackHandler.php 這是一個小指南,應該有所幫助http://www.sitepoint.com/logging-with-monolog-from-devtools-to-slack/#slack-handler 這種方法可能比使用Laravel Log事件,因爲它的框架不可知和消息日誌記錄可能無法在Laravel框架中引發的錯誤早期工作 –

+1

我實際上只是在我自己的項目中找到了這個用法,所以我進行了設置。我已經詳細說明了我在答案中做了什麼。 – user3158900

回答

14

Log門面真的只是爲了Monolog底層實例的包裝。好消息是Monolog支持Slack。你只需要告訴Monolog使用它。

就是說,一切都可以在3行代碼中設置。

$monolog = \Log::getMonolog(); 
$slackHandler = new \Monolog\Handler\SlackHandler('your-token', '#your-channel', 'Monolog', true, null, Monolog\Logger::ERROR); 
$monolog->pushHandler($slackHandler); 

然後得到這個運行,你可以爲它創建自己的服務提供商或只是砸在AppServiceProviderboot方法。

您可能想要查看SlackHandler的源代碼,以防構造函數需要使用更多選項。

現在,只要您\Log::error('some error');,該錯誤的消息將發送到您設置的Slack通道。請注意這個「冒泡」,這意味着它將被髮送到Slack通道以完成任何記錄完成錯誤,並且,error,critical,alertemergency。如果您只希望它記錄error s,請將bubble參數設置爲false

+0

非常感謝,它真的幫助!感謝你,我剛剛在gihub上創建了一個laravel提供程序。我可以相信你嗎? (暱稱或user3158900)? –

+0

@ rap-2-h我希望看到Github頁面的鏈接,因爲我想要執行相同的錯誤處理(並且除了Slack之外還觸發IFTTT事件)。 – Ryan

+2

@Ryan https://github.com/rap2hpoutre/laravel-epilog(希望它能幫到你!) –

4

您可以聽illuminate.log [String $level, String $message, Array $context]事件。如果$level等於error,您將發送通知。

定義事件監聽器在EventServiceProvider

protected $listen = [ 
    'illuminate.log' => [ 
     'App\Listeners\LogEventListener' 
    ] 
]; 

這會告訴Laravel火LogEventListenerilluminate.log事件。

然後創建這個監聽器:

namespace App\Listeners; 

use Illuminate\Queue\InteractsWithQueue; 
use Illuminate\Contracts\Queue\ShouldQueue; 

class LogEventListener 
{ 
    /** 
    * Create the event listener. 
    * 
    * @return void 
    */ 
    public function __construct() 
    { 
     // 
    } 

    /** 
    * Handle the event. 
    * 
    * @param DeployDisabledEvent $event 
    * @return void 
    */ 
    public function handle($event) 
    { 
     if ($event->type == 'error') { 
      $this->notifyViaSlack($event->message, $event->context); 
     } 
    } 

    /** 
    * Send Slack notification. 
    * 
    * @param string $message 
    * @param string $context 
    * @return void 
    */ 
    protected function notifyViaSlack($message, $context) 
    { 
     /* 
     * Slack notification logic 
     */ 
    } 
} 
+0

好的,謝謝。不知道該怎麼做......你能解釋一下嗎? –

+0

@ rap-2-h我用一個例子改進了我的回答,現在應該清楚了:) –

+1

在版本5.1中,傳遞給處理程序的第一個參數看起來是表示日誌級別的字符串,而不是數組。 – ToothlessRebel