diff --git a/CHANGELOG.md b/CHANGELOG.md index d5fb3933..c37183a5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,8 @@ - Chg #109: Deprecate `Logger` methods `setTraceLevel()` and `setExcludedTracePaths()` in favor of context provider usage (@vjik) - New #111: Add `DateTime` and `DateTimeImmutable` support as time in log context (@vjik) +- New #112: Add `Message::category()` method and `Message::DEFAULT_CATEGORY` constant, deprecate + `CategoryFilter::DEFAULT` in favor it (@vjik) ## 2.0.0 May 22, 2022 diff --git a/src/ContextProvider/ContextProvider.php b/src/ContextProvider/ContextProvider.php index 8fc3b59c..b6f43dec 100644 --- a/src/ContextProvider/ContextProvider.php +++ b/src/ContextProvider/ContextProvider.php @@ -5,7 +5,7 @@ namespace Yiisoft\Log\ContextProvider; use InvalidArgumentException; -use Yiisoft\Log\Message\CategoryFilter; +use Yiisoft\Log\Message; /** * @psalm-type Backtrace = list microtime(true), 'trace' => $this->collectTrace($trace), 'memory' => memory_get_usage(), - 'category' => CategoryFilter::DEFAULT, + 'category' => Message::DEFAULT_CATEGORY, ]; } diff --git a/src/Message.php b/src/Message.php index 519aed24..5d673700 100644 --- a/src/Message.php +++ b/src/Message.php @@ -4,6 +4,7 @@ namespace Yiisoft\Log; +use LogicException; use Psr\Log\InvalidArgumentException; use Psr\Log\LoggerTrait; use Psr\Log\LogLevel; @@ -18,6 +19,8 @@ */ final class Message { + public const DEFAULT_CATEGORY = 'application'; + /** * @var string Log message level. * @@ -99,6 +102,22 @@ public function context(string $name = null, mixed $default = null): mixed return $this->context[$name] ?? $default; } + /** + * Returns the log message category. {@see self::DEFAULT_CATEGORY} is returned if the category is not set. + * + * @return string The log message category. + */ + public function category(): string + { + $category = $this->context['category'] ?? self::DEFAULT_CATEGORY; + if (!is_string($category)) { + throw new LogicException( + 'Invalid category value in log context. Expected "string", got "' . get_debug_type($category) . '".' + ); + } + return $category; + } + /** * Parses log message resolving placeholders in the form: "{foo}", * where foo will be replaced by the context data in key "foo". diff --git a/src/Message/CategoryFilter.php b/src/Message/CategoryFilter.php index 5b38d3a0..22e77795 100644 --- a/src/Message/CategoryFilter.php +++ b/src/Message/CategoryFilter.php @@ -6,6 +6,8 @@ use InvalidArgumentException; +use Yiisoft\Log\Message; + use function gettype; use function is_string; use function rtrim; @@ -18,6 +20,9 @@ */ final class CategoryFilter { + /** + * @deprecated Since 2.1, will be removed in 3.0. Use {@see Message::DEFAULT_CATEGORY} instead. + */ public const DEFAULT = 'application'; /** diff --git a/src/Message/Formatter.php b/src/Message/Formatter.php index f54685e7..da43c1ef 100644 --- a/src/Message/Formatter.php +++ b/src/Message/Formatter.php @@ -127,10 +127,8 @@ private function defaultFormat(Message $message, array $commonContext): string $time = $this->getTime($message); $prefix = $this->getPrefix($message, $commonContext); $context = $this->getContext($message, $commonContext); - /** @var string $category */ - $category = $message->context('category', CategoryFilter::DEFAULT); - return "{$time} {$prefix}[{$message->level()}][{$category}] {$message->message()}{$context}"; + return "{$time} {$prefix}[{$message->level()}][{$message->category()}] {$message->message()}{$context}"; } /** diff --git a/src/Target.php b/src/Target.php index 792caffc..d2cb7d72 100644 --- a/src/Target.php +++ b/src/Target.php @@ -384,10 +384,7 @@ private function filterMessages(array $messages): void continue; } - /** @var string $category */ - $category = $message->context('category', ''); - - if ($this->categories->isExcluded($category)) { + if ($this->categories->isExcluded($message->category())) { unset($messages[$i]); continue; } diff --git a/tests/MessageTest.php b/tests/MessageTest.php index 064f16b6..6751133f 100644 --- a/tests/MessageTest.php +++ b/tests/MessageTest.php @@ -4,6 +4,7 @@ namespace Yiisoft\Log\Tests; +use LogicException; use PHPUnit\Framework\TestCase; use Psr\Log\InvalidArgumentException; use Psr\Log\LogLevel; @@ -167,4 +168,31 @@ public function testParseMessage(string $message, array $context, string $expect $message = new Message(LogLevel::INFO, $message, $context); $this->assertSame($expected, $message->message()); } + + public static function dataCategory(): array + { + return [ + 'without-category' => [Message::DEFAULT_CATEGORY, []], + 'null-category' => [Message::DEFAULT_CATEGORY, ['category' => null]], + 'with-category' => ['test', ['category' => 'test']], + ]; + } + + /** + * @dataProvider dataCategory + */ + public function testCategory(string $expected, array $context): void + { + $message = new Message(LogLevel::INFO, 'message', $context); + $this->assertSame($expected, $message->category()); + } + + public function testInvalidCategoryType(): void + { + $message = new Message(LogLevel::INFO, 'message', ['category' => 23.1]); + + $this->expectException(LogicException::class); + $this->expectExceptionMessage('Invalid category value in log context. Expected "string", got "float".'); + $message->category(); + } }