Php 如何在不禁用默认异常处理程序的情况下向Laravel添加新的异常处理程序?
我使用它来跟踪来自Laravel应用程序的异常 Sentry的文档说我应该在应用程序引导中使用以下代码来设置客户端:Php 如何在不禁用默认异常处理程序的情况下向Laravel添加新的异常处理程序?,php,laravel,laravel-5,sentry,Php,Laravel,Laravel 5,Sentry,我使用它来跟踪来自Laravel应用程序的异常 Sentry的文档说我应该在应用程序引导中使用以下代码来设置客户端: $app->configureMonologUsing(function($monolog) { $client = new Raven_Client('your dsn'); $handler = new Monolog\Handler\RavenHandler($client); $handler->setFormatter(new Mon
$app->configureMonologUsing(function($monolog) {
$client = new Raven_Client('your dsn');
$handler = new Monolog\Handler\RavenHandler($client);
$handler->setFormatter(new Monolog\Formatter\LineFormatter("%message% %context% %extra%\n"));
$monolog->pushHandler($handler);
});
这很好
副作用是,Laravel的默认异常处理程序在添加新异常处理程序后停止工作,该处理程序将异常写入位于/storage/logs/Laravel.log
的文件中
我怎样才能同时保留这两个处理程序
更新Laravel 5.6+
从Laravel 5.6开始,可以使用日志堆栈。它现在允许开发者轻松地设置多个日志通道。有关这方面的更多信息,请参阅。您可以查看
illumb\Foundation\Bootstrap\ConfigureLogging
了解Laravel如何设置其本机日志记录。然后在您自己的引导中,只需推送另一个执行相同操作的处理程序:
$app->configureMonologUsing(function($monolog) {
// Keep your existing Sentry configuration
$client = new Raven_Client('your dsn');
$handler = new Monolog\Handler\RavenHandler($client);
$handler->setFormatter(new Monolog\Formatter\LineFormatter("%message% %context% %extra%\n"));
$monolog->pushHandler($handler);
// Add another handler that writes to laravel.log
$handler = new Monolog\Handler\StreamHandler(storage_path('logs/laravel.log'));
$handler->setFormatter(new Monolog\Formatter\LineFormatter(null, null, true, true));
$monolog->pushHandler($handler);
});
编辑:
如果不需要精确地再现Laravel的行为,可以使用默认的格式化程序进行一行程序添加:
$monolog->pushHandler(new Monolog\Handler\StreamHandler(storage_path('logs/laravel.log')));
这与本机Laravel实现的不同之处在于,它将使用forLineFormatter
,而不是我们之前明确设置的
第三个重用Laravel的逻辑来配置Monolog的选项是增加这一行:
with(new Illuminate\Log\Writer($monolog))->useFiles(storage_path('logs/laravel.log'));
我在这里查看,但在那里没有看到
StreamHandler
实例。StreamHandler
是从Monolog包导入的,源代码位于:。。。但是,您不需要深入到illighted\Log\Writer
之外的任何深度来重现Laravel行为。答案中的代码应该可以用。我希望有更简洁的东西。也许框架应该有一种方法来保留默认的记录器。但不是你的错,你的代码起作用了。非常感谢。没问题,我添加了两种替代方法来实现相同的结果,如果有帮助的话,它们更简洁。就我个人而言,我会坚持原来的答案——虽然更详细,但它避免了混淆抽象层次。但没什么大不了的,只要最适合你的需要!