在Laravel全球中间件中设置Monolog

时间:2016-03-25 20:33:25

标签: php laravel monolog laravel-middleware

在我的本地环境中,我希望所有日志(所有标志)都进入浏览器的控制台(BrowserConsoleHandler),然后进入默认的StreamHandler。 在生产中,我希望将错误和其他关键消息发送到电子邮件,然后存储在数据库中或(如果失败)到日志文件(默认StreamHandler

我想在我创建的全局中间件中设置它,现在看起来像这样:

<?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中做到这一点,但是不是为了获得环境而提前做到了吗?此外,如果我需要将日志保存到数据库,它必须已经连接,我想

3 个答案:

答案 0 :(得分:3)

您可以尝试在bootstrap \ 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(
            'to@mail.com', 
            'Log::error!', 
            'from@mail.com'
        ));
    });
}

这里的想法是完全控制你的实时/本地登录。坏消息 - configureMonologUsing替换所有默认的laravel记录器,因此您需要在此处手动配置所有日志。

答案 1 :(得分:0)

中间件并不是真正适合这种情况的地方,除非你想在请求周期的某个时刻实际创建一个特定的日志条目。

根据the docs,您对pushHandler的来电属于bootstrap/app.php(在Laravel 5.2中)。

我认为有可能将此逻辑提取到提供程序中,以防它变得复杂并且您需要将其移出bootstrap/app.php

答案 2 :(得分:0)

solution here

  

BrowserConsoleHandler在完成php后发送剪辑的脚本   脚本由register_shutdown_function()。这时,Laravel已经   发送完整的响应到浏览器。所以剧本剪掉了   BrowseConsoleHandler生成但从未发送到浏览器。