Как может Ларавел 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
к лесозаготовкам Ларавела? Как?
После прочтения большого количества исходного кода и запуска xdebug я, наконец, понял это:
BrowserConsoleHandler
отправляет сценарий после завершения php-скрипта register_shutdown_function()
, На этот раз Laravel уже отправил полный ответ браузеру. Таким образом, сценарий оторван от BrowseConsoleHandler
генерируется, но никогда не отправляется в браузер.
В качестве обходного пути вы можете создать свой собственный Middleware
(http://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;
}
}
Зарегистрируйте Middleware в приложение / Http / Kernel.php:
protected $routeMiddleware = [
'log.browserconsole' => 'App\Http\Middleware\LogBrowserConsole'
];
и вызовите ваш контроллер с промежуточным программным обеспечением в приложение / Http / routes.php:
Route::get('test', ['middleware' => 'log.browserconsole', 'uses'=>'TestController@test']);
В качестве альтернативы, если вы хотите использовать Middleware
для каждого запроса вы можете добавить его в
protected $middleware = [
'App\Http\Middleware\LogBrowserConsole'
];
в приложение / Http / Kernel.php.
Ваш маршрут будет выглядеть так Route::get('test', 'TestController@test');
Теперь ваш Log::debug()
и т. д. сообщения отправляются в файл журнала (по умолчанию LogHandler все еще доступен, вы только что добавили другое), а сценарий отрывается от BrowserConsoleHandler
создается и отправляется в браузер со всеми вашими элементами журнала.
Имейте в виду, чтобы в конечном итоге изменить уровень журнала \Psr\LogLevel::INFO
в приложение / Http / Промежуточный / LogBrowserConsole чтобы соответствовать вашим потребностям.
Других решений пока нет …