2016-03-25 8 views
1

私のローカル環境では、すべてのログ(すべてのフラグ)をブラウザのコンソール(BrowserConsoleHandler)に移動し、次にデフォルトのStreamHandlerにします。 エラーやその他の重要なメッセージを電子メールに送信してデータベースに保存するか、ログファイルに失敗した場合はデフォルトでStreamHandlerLaravelグローバルミドルウェアでMonologを設定する

これをグローバルに設定したいのですが次のようになり、私が作成したミドルウェア、:

<?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); 
    } 
} 

これは(メッセージがコンソールに示されていない、唯一のログファイルに保存されている)は動作しません。ここで明らかなように、関数のスコープ内でのみ変更されるため、私が把握できないのは、この新しいハンドラについてファサードに知ってもらう方法です。私はbootstrap/app.phpでそれを行うことができることを知っていますが、環境を取得するために早期にではありませんか?また、ログをデータベースに保存する必要がある場合は、すでに接続されている必要があります。

答えて

0

ミドルウェアは、実際には特定のログエントリを要求の特定の時点で作成する場合を除き、サイクル。 pushHandler

あなたの呼び出しはthe docsによると、(Laravel 5.2)bootstrap/app.phpに属します。

私はそれが複雑になり、あなたはBrowserConsoleHandlerは後に切り取らスクリプトを送信bootstrap/app.php

0

solution here

の外に移動する必要がある場合には、プロバイダに出て、このロジックを抽出することが可能であろうと思うだろうregister_shutdown_function()によるPHP スクリプトを終了します。現時点では、Laravelはすでに がブラウザに完全な応答を送信しました。したがって、 からスニペットされたスクリプトが生成されますが、ブラウザに送信されることはありません。

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はすべてのデフォルトのラベラーロガーを置き換えるので、ここですべてのログを手動で設定する必要があります。

関連する問題