diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index fc8ebf3e..b5c93fe5 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -18,6 +18,20 @@
+
+
+ |value-of|MonologLevel|PsrLogLevel::*]]>
+
+
+ |value-of|MonologLevel|PsrLogLevel::*]]>
+
+
+ |value-of|MonologLevel|PsrLogLevel::*]]>
+
+
+ |value-of|MonologLevel|PsrLogLevel::*]]>
+
+
diff --git a/src/Monolog/LogsHandler.php b/src/Monolog/LogsHandler.php
index 9e8ed39e..09824e87 100644
--- a/src/Monolog/LogsHandler.php
+++ b/src/Monolog/LogsHandler.php
@@ -4,8 +4,11 @@
namespace Sentry\SentryBundle\Monolog;
+use Monolog\Level as MonologLevel;
use Monolog\Logger as MonologLogger;
use Monolog\LogRecord;
+use Psr\Log\InvalidArgumentException;
+use Psr\Log\LogLevel as PsrLogLevel;
use Sentry\Monolog\CompatibilityLogLevelTrait;
use Sentry\Monolog\LogsHandler as BaseLogsHandler;
@@ -18,8 +21,21 @@ class LogsHandler extends BaseLogsHandler
{
use CompatibilityLogLevelTrait;
- public function __construct(int $level = MonologLogger::DEBUG, bool $bubble = true)
+ /**
+ * @param int|string|MonologLevel|PsrLogLevel::* $level
+ *
+ * @phpstan-param value-of|value-of|MonologLevel|PsrLogLevel::* $level
+ */
+ public function __construct($level = MonologLogger::DEBUG, bool $bubble = true)
{
+ try {
+ $level = MonologLogger::toMonologLevel($level);
+ } catch (InvalidArgumentException $e) {
+ $level = MonologLogger::INFO;
+ }
+ if ($level instanceof MonologLevel) { // Monolog >= 3
+ $level = $level->value;
+ }
$logLevel = self::getSentryLogLevelFromMonologLevel($level);
parent::__construct($logLevel, $bubble);
}
diff --git a/tests/Monolog/LogsHandlerTest.php b/tests/Monolog/LogsHandlerTest.php
index 6e7a0b87..08c07892 100644
--- a/tests/Monolog/LogsHandlerTest.php
+++ b/tests/Monolog/LogsHandlerTest.php
@@ -4,8 +4,10 @@
namespace Sentry\SentryBundle\Tests\Monolog;
+use Monolog\Level as MonologLevel;
use Monolog\Logger as MonologLogger;
use PHPUnit\Framework\TestCase;
+use Psr\Log\LogLevel as PsrLogLevel;
use Sentry\SentryBundle\Monolog\LogsHandler;
final class LogsHandlerTest extends TestCase
@@ -48,4 +50,52 @@ public function testHandleReturnsTrueAboveThresholdWhenBubbleFalse(): void
$this->assertTrue($handler->handle($record));
}
+
+ /**
+ * @dataProvider levelProvider
+ *
+ * @param int|string|MonologLevel $level
+ *
+ * @phpstan-param value-of|value-of|MonologLevel|PsrLogLevel::* $level
+ */
+ public function testHandlerAcceptsVariousTypesAsLevel($level): void
+ {
+ $handler = new LogsHandler($level, false);
+ $record = [
+ 'level' => MonologLogger::WARNING,
+ 'message' => 'msg',
+ 'context' => [],
+ 'extra' => [],
+ ];
+
+ $this->assertTrue($handler->handle($record));
+ }
+
+ /**
+ * @return iterable
+ */
+ public static function levelProvider(): iterable
+ {
+ yield [MonologLogger::DEBUG];
+ yield ['DEBUG'];
+ yield [PsrLogLevel::DEBUG];
+
+ if (class_exists(MonologLevel::class)) {
+ yield [MonologLevel::Debug];
+ }
+ }
+
+ public function testHandlerFallbacksToInfoOnInvalidLevel(): void
+ {
+ /** @phpstan-ignore-next-line */
+ $handler = new LogsHandler(123124213, false);
+ $record = [
+ 'message' => 'msg',
+ 'context' => [],
+ 'extra' => [],
+ ];
+
+ $this->assertFalse($handler->handle($record + ['level' => MonologLogger::DEBUG]));
+ $this->assertTrue($handler->handle($record + ['level' => MonologLogger::WARNING]));
+ }
}