Laravel 将代码移动到新的 ServiceProvider 后,登录到 Sentry 不会进行过滤
Laravel logging to Sentry does not filter after moving code to new ServiceProvider
我有在 AppServiceProvider 中添加 RavenHandler 的代码,它工作正常,仅按预期记录 Logger::ERROR
及更高版本。我只是将它移动到一个单独的 ExternalLogServiceProvider 以便在其他项目中重用,现在它正在将 Logger::INFO
以上的所有内容发送到 Sentry。
我不明白为什么会这样。当然,它要么会记录,要么不会。我不明白为什么过滤器突然被忽略了...
差异如下:
@@ -3,26 +3,12 @@ declare(strict_types=1);
namespace Healthcheck\Providers;
-use Healthcheck\Mail\Handlers\LaravelMailerHandler;
-use Healthcheck\Helpers\Helpers;
-
use Aws\Ec2\Ec2Client;
use Aws\S3\S3Client;
use Aws\Sqs\SqsClient;
use Illuminate\Support\ServiceProvider;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Handler\RavenHandler;
-use Monolog\Logger;
-use Monolog\Processor\IntrospectionProcessor;
-
-use Raven_Client;
-
-use Somsip\Logger\Formatter\CallerInlineFormatter;
-
-use Log;
-
class AppServiceProvider extends ServiceProvider
{
/**
@@ -39,10 +25,10 @@ class AppServiceProvider extends ServiceProvider
* Register any application services.
*
* @return void
+ * @codeCoverageIgnore
*/
public function register()
{
- // @codeCoverageIgnoreStart
$this->app->bind(Ec2Client::class, function ($app) {
$params = [
'region' => 'us-east-1',
@@ -75,46 +61,5 @@ class AppServiceProvider extends ServiceProvider
}
return new S3Client($params);
});
- // @codeCoverageIgnoreEnd
-
- // Setup some custom logging
- // FIXME: This could be in it's own ServiceProvider
- $monolog = Log::getMonolog();
- // Change the default formatter
- $monolog->getHandlers()[0]->setFormatter(new CallerInlineFormatter());
- $monolog->getHandlers()[0]->setLevel(config('app.logLevel'));
- // Get all output from logger, but ignore references to non-app classes
- $ignores = [
- 'Writer',
- 'Facade'
- ];
- $monolog->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, $ignores));
-
- // @codeCoverageIgnoreStart
- // FIXME: This could be in it's own ServiceProvider
- if (!app()->environment('testing')) {
- // Email critical errors to admin
- $monolog->pushHandler(
- new LaravelMailerHandler(
- config('mail.admin'),
- 'Healthcheck: CRITICAL ERROR encountered on ' . strtoupper(config('services.aws.account')),
- Logger::CRITICAL
- )
- );
-
- // Use central log if available
- if (config('services.raven.dsn')) {
- $client = new Raven_Client(config('services.raven.dsn'));
- $handler = new RavenHandler(
- $client,
- Logger::ERROR
- );
- $handler->setFormatter(new LineFormatter("%message% %context% %extra%\n"));
- $monolog->pushHandler($handler);
- }
- }
- // @codeCoverageIgnoreEnd
}
}
----------------- app/Providers/ExternalLogServiceProvider.php -----------------
new file mode 100644
index 0000000..957c414
@@ -0,0 +1,53 @@
+<?php
+declare(strict_types=1);
+
+namespace Healthcheck\Providers;
+
+use Healthcheck\Mail\Handlers\LaravelMailerHandler;
+
+use Illuminate\Support\ServiceProvider;
+
+use Monolog\Formatter\LineFormatter;
+use Monolog\Handler\RavenHandler;
+use Monolog\Logger;
+
+use Raven_Client;
+
+use Log;
+
+class ExternalLogServiceProvider extends ServiceProvider
+{
+ /**
+ * Setup external logging
+ *
+ * @return void
+ * @codeCoverageIgnore
+ */
+ public function register()
+ {
+ if (!app()->environment('testing')) {
+ // Email critical errors to admin
+ $monolog = Log::getMonolog();
+ $monolog->pushHandler(
+ new LaravelMailerHandler(
+ config('mail.admin'),
+ 'Healthcheck: CRITICAL ERROR encountered on ' . strtoupper(config('services.aws.account'));
+ Logger::CRITICAL
+ )
+ );
+
+ // Use central log if available
+ if (config('services.raven.dsn')) {
+ $client = new Raven_Client(config('services.raven.dsn'));
+ $handler = new RavenHandler(
+ $client,
+ Logger::ERROR
+ );
+ $handler->setFormatter(new LineFormatter("%message% %context% %extra%\n"));
+ $monolog->pushHandler($handler);
+ }
+ }
+ }
+}
------------------ app/Providers/InlineLogServiceProvider.php ------------------
new file mode 100644
index 0000000..de97081
@@ -0,0 +1,37 @@
+<?php
+declare(strict_types=1);
+
+namespace Healthcheck\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+use Monolog\Logger;
+use Monolog\Processor\IntrospectionProcessor;
+
+use Raven_Client;
+
+use Somsip\Logger\Formatter\CallerInlineFormatter;
+
+use Log;
+
+class InlineLogServiceProvider extends ServiceProvider
+{
+ /**
+ * Setup some custom logging
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $monolog = Log::getMonolog();
+ // Change the default formatter
+ $monolog->getHandlers()[0]->setFormatter(new CallerInlineFormatter());
+ $monolog->getHandlers()[0]->setLevel(config('app.logLevel'));
+ // Get all output from logger, but ignore references to non-app classes
+ $ignores = [
+ 'Writer',
+ 'Facade'
+ ];
+ $monolog->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, $ignores));
+ }
+}
-------------------------------- config/app.php --------------------------------
index b72115c..cfb3820 100644
@@ -174,6 +174,8 @@ return [
*/
Healthcheck\Providers\AppServiceProvider::class,
Healthcheck\Providers\AuthServiceProvider::class,
+ Healthcheck\Providers\ExternalLogServiceProvider::class,
+ Healthcheck\Providers\InlineLogServiceProvider::class,
Healthcheck\Providers\EventServiceProvider::class,
Healthcheck\Providers\RouteServiceProvider::class,
],
InlineLogServiceProvider 只是将 Class::method() 添加到每个日志条目之前,并且工作正常。它只是同时拆分给它自己的 ServiceProvider。
谢谢,
事实证明,当 AppServiceProvider 未设置 CallerInlineFormatter 时,它没有按预期工作。日志条目未按预期生成,而且其格式也意味着它们通过了 RavenHandler 的过滤器。不太清楚为什么,但是在这个美容修复上花了太长时间所以只是将它全部恢复到 AppServiceProvider 中。它正在做它应该做的事情。
我有在 AppServiceProvider 中添加 RavenHandler 的代码,它工作正常,仅按预期记录 Logger::ERROR
及更高版本。我只是将它移动到一个单独的 ExternalLogServiceProvider 以便在其他项目中重用,现在它正在将 Logger::INFO
以上的所有内容发送到 Sentry。
我不明白为什么会这样。当然,它要么会记录,要么不会。我不明白为什么过滤器突然被忽略了...
差异如下:
@@ -3,26 +3,12 @@ declare(strict_types=1);
namespace Healthcheck\Providers;
-use Healthcheck\Mail\Handlers\LaravelMailerHandler;
-use Healthcheck\Helpers\Helpers;
-
use Aws\Ec2\Ec2Client;
use Aws\S3\S3Client;
use Aws\Sqs\SqsClient;
use Illuminate\Support\ServiceProvider;
-use Monolog\Formatter\LineFormatter;
-use Monolog\Handler\RavenHandler;
-use Monolog\Logger;
-use Monolog\Processor\IntrospectionProcessor;
-
-use Raven_Client;
-
-use Somsip\Logger\Formatter\CallerInlineFormatter;
-
-use Log;
-
class AppServiceProvider extends ServiceProvider
{
/**
@@ -39,10 +25,10 @@ class AppServiceProvider extends ServiceProvider
* Register any application services.
*
* @return void
+ * @codeCoverageIgnore
*/
public function register()
{
- // @codeCoverageIgnoreStart
$this->app->bind(Ec2Client::class, function ($app) {
$params = [
'region' => 'us-east-1',
@@ -75,46 +61,5 @@ class AppServiceProvider extends ServiceProvider
}
return new S3Client($params);
});
- // @codeCoverageIgnoreEnd
-
- // Setup some custom logging
- // FIXME: This could be in it's own ServiceProvider
- $monolog = Log::getMonolog();
- // Change the default formatter
- $monolog->getHandlers()[0]->setFormatter(new CallerInlineFormatter());
- $monolog->getHandlers()[0]->setLevel(config('app.logLevel'));
- // Get all output from logger, but ignore references to non-app classes
- $ignores = [
- 'Writer',
- 'Facade'
- ];
- $monolog->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, $ignores));
-
- // @codeCoverageIgnoreStart
- // FIXME: This could be in it's own ServiceProvider
- if (!app()->environment('testing')) {
- // Email critical errors to admin
- $monolog->pushHandler(
- new LaravelMailerHandler(
- config('mail.admin'),
- 'Healthcheck: CRITICAL ERROR encountered on ' . strtoupper(config('services.aws.account')),
- Logger::CRITICAL
- )
- );
-
- // Use central log if available
- if (config('services.raven.dsn')) {
- $client = new Raven_Client(config('services.raven.dsn'));
- $handler = new RavenHandler(
- $client,
- Logger::ERROR
- );
- $handler->setFormatter(new LineFormatter("%message% %context% %extra%\n"));
- $monolog->pushHandler($handler);
- }
- }
- // @codeCoverageIgnoreEnd
}
}
----------------- app/Providers/ExternalLogServiceProvider.php -----------------
new file mode 100644
index 0000000..957c414
@@ -0,0 +1,53 @@
+<?php
+declare(strict_types=1);
+
+namespace Healthcheck\Providers;
+
+use Healthcheck\Mail\Handlers\LaravelMailerHandler;
+
+use Illuminate\Support\ServiceProvider;
+
+use Monolog\Formatter\LineFormatter;
+use Monolog\Handler\RavenHandler;
+use Monolog\Logger;
+
+use Raven_Client;
+
+use Log;
+
+class ExternalLogServiceProvider extends ServiceProvider
+{
+ /**
+ * Setup external logging
+ *
+ * @return void
+ * @codeCoverageIgnore
+ */
+ public function register()
+ {
+ if (!app()->environment('testing')) {
+ // Email critical errors to admin
+ $monolog = Log::getMonolog();
+ $monolog->pushHandler(
+ new LaravelMailerHandler(
+ config('mail.admin'),
+ 'Healthcheck: CRITICAL ERROR encountered on ' . strtoupper(config('services.aws.account'));
+ Logger::CRITICAL
+ )
+ );
+
+ // Use central log if available
+ if (config('services.raven.dsn')) {
+ $client = new Raven_Client(config('services.raven.dsn'));
+ $handler = new RavenHandler(
+ $client,
+ Logger::ERROR
+ );
+ $handler->setFormatter(new LineFormatter("%message% %context% %extra%\n"));
+ $monolog->pushHandler($handler);
+ }
+ }
+ }
+}
------------------ app/Providers/InlineLogServiceProvider.php ------------------
new file mode 100644
index 0000000..de97081
@@ -0,0 +1,37 @@
+<?php
+declare(strict_types=1);
+
+namespace Healthcheck\Providers;
+
+use Illuminate\Support\ServiceProvider;
+
+use Monolog\Logger;
+use Monolog\Processor\IntrospectionProcessor;
+
+use Raven_Client;
+
+use Somsip\Logger\Formatter\CallerInlineFormatter;
+
+use Log;
+
+class InlineLogServiceProvider extends ServiceProvider
+{
+ /**
+ * Setup some custom logging
+ *
+ * @return void
+ */
+ public function register()
+ {
+ $monolog = Log::getMonolog();
+ // Change the default formatter
+ $monolog->getHandlers()[0]->setFormatter(new CallerInlineFormatter());
+ $monolog->getHandlers()[0]->setLevel(config('app.logLevel'));
+ // Get all output from logger, but ignore references to non-app classes
+ $ignores = [
+ 'Writer',
+ 'Facade'
+ ];
+ $monolog->pushProcessor(new IntrospectionProcessor(Logger::DEBUG, $ignores));
+ }
+}
-------------------------------- config/app.php --------------------------------
index b72115c..cfb3820 100644
@@ -174,6 +174,8 @@ return [
*/
Healthcheck\Providers\AppServiceProvider::class,
Healthcheck\Providers\AuthServiceProvider::class,
+ Healthcheck\Providers\ExternalLogServiceProvider::class,
+ Healthcheck\Providers\InlineLogServiceProvider::class,
Healthcheck\Providers\EventServiceProvider::class,
Healthcheck\Providers\RouteServiceProvider::class,
],
InlineLogServiceProvider 只是将 Class::method() 添加到每个日志条目之前,并且工作正常。它只是同时拆分给它自己的 ServiceProvider。
谢谢,
事实证明,当 AppServiceProvider 未设置 CallerInlineFormatter 时,它没有按预期工作。日志条目未按预期生成,而且其格式也意味着它们通过了 RavenHandler 的过滤器。不太清楚为什么,但是在这个美容修复上花了太长时间所以只是将它全部恢复到 AppServiceProvider 中。它正在做它应该做的事情。