2016-03-25 3 views
1

В моей локальной среде я хочу, чтобы все журналы (все флаги) переходили в консоль браузера (BrowserConsoleHandler), а затем по умолчанию StreamHandler. В процессе производства я хочу, чтобы ошибки и другие критические сообщения отправлялись на электронную почту, затем сохранялись в базе данных или (если не удавалось) в файл журнала (по умолчанию StreamHandler)Настроить Монолог в глобальном промежуточном программном обеспечении Laravel

Я хочу установить это в глобальном среднего изделия, которые я создал, который выглядит, как это сейчас:

<?php 

namespace App\Http\Middleware; 

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

class GlobalConfig 
{ 
    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle($request, Closure $next) 
    { 
     // Get Monolog instance 
     $monolog = Log::getMonolog(); 
     // In local environment the logs will be shown on browser 
     if (App::environment('local')) { 
      // Show logs in browser console 
      $monolog -> pushHandler(new BrowserConsoleHandler()); 
     } else { 
      // Here we set up for production 
     } 

     Log::debug("Browser handler working"); 

     return $next($request); 
    } 
} 

Это не работает (сообщение сохраняется в файле журнала только не показан на консоли). Что я не могу понять, так это то, как позволить фасад Log знать об этом новом обработчике, потому что здесь, как очевидно, вещи изменяются только в пределах области действия. Я знаю, что смогу это сделать в bootstrap/app.php, но разве рано ли это создавать среду? Кроме того, если мне нужно сохранить журналы в базе данных, он должен быть подключен, я думаю,

ответ

0

Промежуточное программное обеспечение на самом деле не является местом для этого, если вы не хотите, чтобы на самом деле сделать конкретную запись в журнале в какой-то момент запроса цикл.

Ваш звонок в pushHandler принадлежит к bootstrap/app.php (в Ларавеле 5.2), в соответствии с the docs.

Я думаю, что можно было бы извлечь эту логику из в поставщика в случае, если она становится сложнее, и вам нужно, чтобы переместить его из bootstrap/app.php

0

solution here

BrowserConsoleHandler посылает сценарий надрезается после завершение скрипта php по регистру_shutdown_function(). В это время Laravel уже отправил полный ответ браузеру. Таким образом, скрипт отрезан от BrowseConsoleHandler генерируется, но никогда не отправляется в браузер.

3

Вы можете попробовать сделать следующий шаг в загрузчике \ app.php

if(env('APP_ENV') == 'local') { 
    $app->configureMonologUsing(function($monolog) use ($app) { 

     $monolog->pushHandler(
      $handler = new \Monolog\Handler\RotatingFileHandler(
       $app->storagePath().'/logs/laravel.log', 
       $app->make('config')->get('app.log_max_files', 30), 
       \Monolog\Logger::DEBUG 
      ) 
     ); 

     $handler->setFormatter(new \Monolog\Formatter\LineFormatter(null, null, true, true)); 

     $monolog->pushHandler(new \Monolog\Handler\NativeMailerHandler(
      '[email protected]', 
      'Log::error!', 
      '[email protected]' 
     )); 
    }); 
} 

Идея здесь полностью контролировать свой протоколирование в прямом эфире/местные. Плохие новости - configureMonologUsing замените все логаторы larvel по умолчанию, поэтому вам нужно настроить все свои журналы вручную здесь.