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])); + } }