如何在不禁用默认异常处理程序的情况下向Laravel添加新的异常处理程序


How to add a new exception handler to Laravel without disable the default one?

我使用Sentry来跟踪Laravel应用程序的异常。

Sentry的文档说我应该在应用程序引导程序中使用以下代码来设置客户端:

$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开始,可以使用日志堆栈。它现在允许开发人员轻松地设置多个日志通道。有关详细信息,请参阅文档。

您可以查看Illuminate'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实现的不同之处在于,它将使用LineFormatter的默认构造函数参数,而不是我们之前明确设置的参数。

使用Laravel逻辑配置Monolog的第三个选项是添加以下行:

with(new Illuminate'Log'Writer($monolog))->useFiles(storage_path('logs/laravel.log'));