Laravel 使用 Monolog\Handler\BrowserConsoleHandler 记录
Laravel logging with Monolog\Handler\BrowserConsoleHandler
Laravel 5的logging怎么改成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
但这不是一个解决方案,因为它使用 [= 发送日志41=] 但当记录器想要发送 headers.
时,我已经发送了一些 debug-echos
另一方面,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
以满足您的需要。
Laravel 5的logging怎么改成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
但这不是一个解决方案,因为它使用 [= 发送日志41=] 但当记录器想要发送 headers.
时,我已经发送了一些 debug-echos
另一方面,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
以满足您的需要。