使用MonologHandlerBrowserConsoleHandler进行Laravel日志记录


Laravel logging with MonologHandlerBrowserConsoleHandler

如何将Laravel 5的日志记录更改为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的日志中吗?怎样

在阅读了大量源代码并让xdebug工作后,我终于找到了它:

BrowserConsoleHandler发送register_shutdown_function()完成php脚本后剪切的脚本。此时,Laravel已经向浏览器发送了完整的响应。因此,从BrowseConsoleHandler截取的脚本会生成,但从未发送到浏览器。

作为一种变通方法,您可以构建自己的Middleware(http://laravel.com/docs/5.0/middleware)它手动调用代码生成,并在发送之前将其添加到响应中。

创建app/Http/Middleware/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;
  }
}

app/Http/Kernel.php:中注册中间件

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

并使用app/Http/routes.php:中的中间件调用您的控制器

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

或者,如果您想对每个请求使用Middleware,您可以将其添加到

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

app/Http/Kernel.php.中

您的路线看起来像Route::get('test', 'TestController@test');


现在,您的Log::debug()等消息将被发送到日志文件(默认的LogHandler仍然可用,您刚刚添加了另一个),从BrowserConsoleHandler剪切的脚本将被构建并与您的所有日志项一起发送到浏览器。

请记住,最终更改app/Http/Middleware/LogBrowserConsole中的日志级别'Psr'LogLevel::INFO以满足您的需求。