如何在不禁用默认异常处理程序的情况下向 Laravel 添加新的异常处理程序?
How to add a new exception handler to Laravel without disable the default one?
我正在使用 Sentry 来跟踪来自 Laravel 应用程序的异常。
Sentry 的文档说我应该在我的应用程序中使用以下代码 bootstrap 来设置客户端:
$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 开始,日志堆栈可用。它现在允许开发人员轻松设置多个日志通道。有关详细信息,请参阅 the docs。
您可以查看 Illuminate\Foundation\Bootstrap\ConfigureLogging
以了解 Laravel 如何设置其本机日志记录。然后在你自己的 bootstrap 中,只需推送另一个执行相同操作的处理程序:
$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 实现的不同之处在于它将 default constructor arguments 用于 LineFormatter
而不是我们之前明确设置的那些。
重用 Laravel 配置 Monolog 逻辑的第三个选项是添加以下行:
with(new Illuminate\Log\Writer($monolog))->useFiles(storage_path('logs/laravel.log'));
我正在使用 Sentry 来跟踪来自 Laravel 应用程序的异常。
Sentry 的文档说我应该在我的应用程序中使用以下代码 bootstrap 来设置客户端:
$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 开始,日志堆栈可用。它现在允许开发人员轻松设置多个日志通道。有关详细信息,请参阅 the docs。
您可以查看 Illuminate\Foundation\Bootstrap\ConfigureLogging
以了解 Laravel 如何设置其本机日志记录。然后在你自己的 bootstrap 中,只需推送另一个执行相同操作的处理程序:
$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 实现的不同之处在于它将 default constructor arguments 用于 LineFormatter
而不是我们之前明确设置的那些。
重用 Laravel 配置 Monolog 逻辑的第三个选项是添加以下行:
with(new Illuminate\Log\Writer($monolog))->useFiles(storage_path('logs/laravel.log'));