Skip to content

Commit 927ea3e

Browse files
HypeMCcleptric
andauthored
fix(logs): Allow passing string and enum Monolog level (#959)
Co-authored-by: Michi Hoffmann <cleptric@users.noreply.github.com>
1 parent ce1c283 commit 927ea3e

File tree

3 files changed

+81
-1
lines changed

3 files changed

+81
-1
lines changed

psalm-baseline.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,20 @@
1818
<code><![CDATA[isMasterRequest]]></code>
1919
</UndefinedMethod>
2020
</file>
21+
<file src="src/Monolog/LogsHandler.php">
22+
<InvalidParamDefault>
23+
<code><![CDATA[value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::*]]></code>
24+
</InvalidParamDefault>
25+
<UndefinedClass>
26+
<code><![CDATA[value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::*]]></code>
27+
</UndefinedClass>
28+
<UndefinedDocblockClass>
29+
<code><![CDATA[value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::*]]></code>
30+
</UndefinedDocblockClass>
31+
<UnresolvableConstant>
32+
<code><![CDATA[value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::*]]></code>
33+
</UnresolvableConstant>
34+
</file>
2135
<file src="src/Tracing/Cache/TraceableCacheAdapterTrait.php">
2236
<LessSpecificImplementedReturnType>
2337
<code><![CDATA[iterable]]></code>

src/Monolog/LogsHandler.php

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,11 @@
44

55
namespace Sentry\SentryBundle\Monolog;
66

7+
use Monolog\Level as MonologLevel;
78
use Monolog\Logger as MonologLogger;
89
use Monolog\LogRecord;
10+
use Psr\Log\InvalidArgumentException;
11+
use Psr\Log\LogLevel as PsrLogLevel;
912
use Sentry\Monolog\CompatibilityLogLevelTrait;
1013
use Sentry\Monolog\LogsHandler as BaseLogsHandler;
1114

@@ -18,8 +21,21 @@ class LogsHandler extends BaseLogsHandler
1821
{
1922
use CompatibilityLogLevelTrait;
2023

21-
public function __construct(int $level = MonologLogger::DEBUG, bool $bubble = true)
24+
/**
25+
* @param int|string|MonologLevel|PsrLogLevel::* $level
26+
*
27+
* @phpstan-param value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::* $level
28+
*/
29+
public function __construct($level = MonologLogger::DEBUG, bool $bubble = true)
2230
{
31+
try {
32+
$level = MonologLogger::toMonologLevel($level);
33+
} catch (InvalidArgumentException $e) {
34+
$level = MonologLogger::INFO;
35+
}
36+
if ($level instanceof MonologLevel) { // Monolog >= 3
37+
$level = $level->value;
38+
}
2339
$logLevel = self::getSentryLogLevelFromMonologLevel($level);
2440
parent::__construct($logLevel, $bubble);
2541
}

tests/Monolog/LogsHandlerTest.php

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@
44

55
namespace Sentry\SentryBundle\Tests\Monolog;
66

7+
use Monolog\Level as MonologLevel;
78
use Monolog\Logger as MonologLogger;
89
use PHPUnit\Framework\TestCase;
10+
use Psr\Log\LogLevel as PsrLogLevel;
911
use Sentry\SentryBundle\Monolog\LogsHandler;
1012

1113
final class LogsHandlerTest extends TestCase
@@ -48,4 +50,52 @@ public function testHandleReturnsTrueAboveThresholdWhenBubbleFalse(): void
4850

4951
$this->assertTrue($handler->handle($record));
5052
}
53+
54+
/**
55+
* @dataProvider levelProvider
56+
*
57+
* @param int|string|MonologLevel $level
58+
*
59+
* @phpstan-param value-of<MonologLevel::VALUES>|value-of<MonologLevel::NAMES>|MonologLevel|PsrLogLevel::* $level
60+
*/
61+
public function testHandlerAcceptsVariousTypesAsLevel($level): void
62+
{
63+
$handler = new LogsHandler($level, false);
64+
$record = [
65+
'level' => MonologLogger::WARNING,
66+
'message' => 'msg',
67+
'context' => [],
68+
'extra' => [],
69+
];
70+
71+
$this->assertTrue($handler->handle($record));
72+
}
73+
74+
/**
75+
* @return iterable<array{0: int|string|MonologLevel}>
76+
*/
77+
public static function levelProvider(): iterable
78+
{
79+
yield [MonologLogger::DEBUG];
80+
yield ['DEBUG'];
81+
yield [PsrLogLevel::DEBUG];
82+
83+
if (class_exists(MonologLevel::class)) {
84+
yield [MonologLevel::Debug];
85+
}
86+
}
87+
88+
public function testHandlerFallbacksToInfoOnInvalidLevel(): void
89+
{
90+
/** @phpstan-ignore-next-line */
91+
$handler = new LogsHandler(123124213, false);
92+
$record = [
93+
'message' => 'msg',
94+
'context' => [],
95+
'extra' => [],
96+
];
97+
98+
$this->assertFalse($handler->handle($record + ['level' => MonologLogger::DEBUG]));
99+
$this->assertTrue($handler->handle($record + ['level' => MonologLogger::WARNING]));
100+
}
51101
}

0 commit comments

Comments
 (0)