2015-04-05 47 views
4

如何將Laravel 5的日誌記錄更改爲Monolog\Handler\BrowserConsoleHandlerLaravel使用Monolog Handler BrowserConsoleHandler記錄

什麼工作Laravel 5,但確實在一個獨立的PHP文件工作:

use Illuminate\Support\Facades\Log;  
use Monolog\Handler\BrowserConsoleHandler; 
use Monolog\Logger; 

// create a log channel 
$log = Log::getMonolog(); 
// $log = new Logger('Testlogger'); //doesn't make any difference 
$log->pushHandler(new BrowserConsoleHandler(\Psr\Log\LogLevel::INFO)); 

// add records to the log 
$log->addWarning('Foo'); 
$log->addError('Bar'); 

所發生的一切是我的日誌出現在日誌文件,但沒有找到自己的方式到瀏覽器。如果我在一個沒有框架的PHP文件中嘗試代碼,它就可以工作,所以我認爲這是一個Laravel問題。

我得到它使用Firebug和FirePHP工作安裝$log->pushHandler(new FirePHPHandler());代替BrowserConsoleHandler但由於它發送日誌與報頭,但我已經派了一些調試回波時,記錄要發送的報頭這不是一個解決方案。
BrowserConsoleHandler另一方面在網站末尾添加了一個JavaScript代碼段,可以完美地滿足我的需求。

那麼,有沒有人成功地將BrowserConsoleHandler添加到Laravel的日誌?怎麼樣?

+0

這個獨立文件在哪裏?它是如何被加載的? – treeface 2015-04-08 17:35:44

回答

3

閱讀大量的源代碼,並獲得了XDebug到最後我工作後figuered出來:

BrowserConsoleHandler發送由register_shutdown_function()完成PHP腳本後剪斷的腳本。目前,Laravel已經向瀏覽器發送了完整的響應。因此從BrowseConsoleHandler截取的腳本被生成,但從未發送到瀏覽器。

作爲解決方法,您可以構建自己的Middlewarehttp://laravel.com/docs/5.0/middleware),手動調用代碼生成並在發送之前將其添加到響應中。

創建應用程序/ HTTP /中間件/ LogBrowserConsole.php

<?php 
namespace App\Http\Middleware; 

use Illuminate\Contracts\Routing\Middleware; 
use Illuminate\Support\Facades\Log; 
use Monolog\Handler\BrowserConsoleHandler; 

class LogBrowserConsole implements Middleware { 

    public function handle($request, \Closure $next) 
    { 
    // add BrowserConsoleHandler to Laravel's Logger 
    $log = Log::getMonolog(); 
    $log->pushHandler(new BrowserConsoleHandler(\Psr\Log\LogLevel::INFO)); 

    // invokes all your stuff like it would do without the middleware but with the new logger 
    $response = $next($request); 

    // after the request is done we care about the log entries 
    $handlers = $log->getHandlers(); 

    $scriptSnippet = ""; 
    foreach($handlers as $handler){ // only handle BrowserConsoleHandler 
     if($handler instanceof BrowserConsoleHandler){ 
      ob_start(); //start output buffer so we can save echo to variable 
      $handler->send(); // create the scriptSnipped 
      $scriptSnippet .= ob_get_clean(); 
     } 
    } 

    // write scriptSnippet to end of response content 
    $content = $response->getContent(); 
    $response->setContent($content.$scriptSnippet); 

    return $response; 
    } 
} 

註冊了中間件,應用/HTTP/Kernel.php

protected $routeMiddleware = [ 
    'log.browserconsole' => 'App\Http\Middleware\LogBrowserConsole' 
]; 

,並調用你的控制器中間件app/Http/routes.php

Route::get('test', ['middleware' => 'log.browserconsole', 'uses'=>'[email protected]']); 

另外,如果你想使用Middleware爲每一個請求,你可以在應用程序/ HTTP/Kernel.php它添加到

protected $middleware = [ 
'App\Http\Middleware\LogBrowserConsole' 
]; 

路線會是什麼樣子Route::get('test', '[email protected]');


現在,您Log::debug()等。消息會發送到日誌文件(默認的LogHandler仍然可用,您只需添加另一個),並從BrowserConsoleHandler中截取的腳本被構建併發送到瀏覽器並顯示所有日誌項。

請記住最終更改日誌級別\Psr\LogLevel::INFOapp/Http/Middleware/LogBrowserConsole以適合您的需求。