在我的本地环境中,我希望所有日志(所有标志)都进入浏览器的控制台(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
中做到这一点,但是不是为了获得环境而提前做到了吗?此外,如果我需要将日志保存到数据库,它必须已经连接,我想
答案 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)
BrowserConsoleHandler在完成php后发送剪辑的脚本 脚本由register_shutdown_function()。这时,Laravel已经 发送完整的响应到浏览器。所以剧本剪掉了 BrowseConsoleHandler生成但从未发送到浏览器。