Search code examples
logginglaravel-5.5sentry

Laravel logging to Sentry does not filter after moving code to new ServiceProvider


I had the code to add a RavenHandler in AppServiceProvider and it was working fine, only logging Logger::ERROR and above as intended. I've merely moved it to a separate ExternalLogServiceProvider for reuse in other projects, and now it's sending everything to Sentry from Logger::INFO upwards.

I can't see why this might be happening. Surely either it would log or wouldn't. I can't see why the filter is suddenly being ignored...

Here's the diff:

@@ -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,
     ],

The InlineLogServiceProvider just prepends the Class::method() to each log entry and is working fine. It was just split out to it's own ServiceProvider at the same time.

Thanks,


Solution

  • Turns out the CallerInlineFormatter wasn't working as expected when it wasn't being set up by the AppServiceProvider. The log entries were not being made as intended, and also in a format that meant they passed the filter for the RavenHandler. Not too sure exactly why, but spent too long on this cosmetic fix so just reverted it all back into the AppServiceProvider. And it's doing what it should.