Регистрация Laravel с помощью Monolog \ Handler \ BrowserConsoleHandler

Как может Ларавел 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 к лесозаготовкам Ларавела? Как?

4

Решение

После прочтения большого количества исходного кода и запуска 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 чтобы соответствовать вашим потребностям.

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]