From 095551fa2f06a49544944d90270215fdcab5c905 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 22 Jun 2024 12:22:28 +0300 Subject: [PATCH 1/4] Remove unnecessary `unset` call in `ContextProvider` --- CHANGELOG.md | 1 + src/ContextProvider/ContextProvider.php | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c37183a5..dbbe907c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - 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) +- Enh #113: Remove unnecessary `unset` call in `ContextProvider` (@vjik) ## 2.0.0 May 22, 2022 diff --git a/src/ContextProvider/ContextProvider.php b/src/ContextProvider/ContextProvider.php index b6f43dec..5a8e3f9f 100644 --- a/src/ContextProvider/ContextProvider.php +++ b/src/ContextProvider/ContextProvider.php @@ -118,7 +118,6 @@ private function collectTrace(array $backtrace): array ); if (empty($excludedMatch)) { - unset($trace['object'], $trace['args']); $traces[] = $trace; if (++$count >= $this->traceLevel) { break; From a2bcb109dfd5b12e57eafca8729ab7e5fa68c3b6 Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 22 Jun 2024 12:26:38 +0300 Subject: [PATCH 2/4] Add `Message::trace()` --- CHANGELOG.md | 1 + src/Message.php | 30 ++++++++++++++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index dbbe907c..a185cac8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ - 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) +- New #113: Add `Message::trace()` method (@vjik) - Enh #113: Remove unnecessary `unset` call in `ContextProvider` (@vjik) ## 2.0.0 May 22, 2022 diff --git a/src/Message.php b/src/Message.php index 5d673700..d794971a 100644 --- a/src/Message.php +++ b/src/Message.php @@ -16,6 +16,14 @@ /** * Message is a data object that stores log message data. + * + * @psalm-type TraceItem = array{ + * file:string, + * line:int, + * function?:string, + * class?:string, + * type?:string, + * } */ final class Message { @@ -118,6 +126,28 @@ public function category(): string return $category; } + /** + * Returns the debug trace. + * + * @return array[]|null The debug trace or null if the trace is not set. + * + * @psalm-return list|null + */ + public function trace(): ?array + { + $trace = $this->context['trace'] ?? null; + if ($trace === null) { + return null; + } + + /** + * @psalm-var TraceItem $item We believe that the debug trace in context is always received as result of call + * `debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)`. + */ + + return $trace; + } + /** * Parses log message resolving placeholders in the form: "{foo}", * where foo will be replaced by the context data in key "foo". From f1180b840631f14c7d0781dbbc07844521733e4b Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 22 Jun 2024 12:37:09 +0300 Subject: [PATCH 3/4] Refactor --- src/ContextProvider/ContextProvider.php | 17 ++++++----------- src/Message.php | 6 +++--- src/Message/Formatter.php | 8 ++------ tests/Message/FormatterTest.php | 17 ----------------- 4 files changed, 11 insertions(+), 37 deletions(-) diff --git a/src/ContextProvider/ContextProvider.php b/src/ContextProvider/ContextProvider.php index 5a8e3f9f..11cd4424 100644 --- a/src/ContextProvider/ContextProvider.php +++ b/src/ContextProvider/ContextProvider.php @@ -8,13 +8,7 @@ use Yiisoft\Log\Message; /** - * @psalm-type Backtrace = list + * @psalm-import-type TraceItem from Message */ final class ContextProvider implements ContextProviderInterface { @@ -40,6 +34,7 @@ public function __construct( public function getContext(): array { + /** @psalm-var list $trace */ $trace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS); array_shift($trace); return [ @@ -97,11 +92,11 @@ public function setExcludedTracePaths(array $excludedTracePaths): self /** * Collects a trace when tracing is enabled with {@see Logger::setTraceLevel()}. * - * @param array $backtrace The list of call stack information. - * @psalm-param Backtrace|list $backtrace + * @param array[] $backtrace The list of call stack information. + * @psalm-param list $backtrace * - * @return array Collected a list of call stack information. - * @psalm-return Backtrace + * @return array[] Collected a list of call stack information. + * @psalm-return list */ private function collectTrace(array $backtrace): array { diff --git a/src/Message.php b/src/Message.php index d794971a..a114b4bd 100644 --- a/src/Message.php +++ b/src/Message.php @@ -18,8 +18,8 @@ * Message is a data object that stores log message data. * * @psalm-type TraceItem = array{ - * file:string, - * line:int, + * file?:string, + * line?:int, * function?:string, * class?:string, * type?:string, @@ -141,7 +141,7 @@ public function trace(): ?array } /** - * @psalm-var TraceItem $item We believe that the debug trace in context is always received as result of call + * @psalm-var list $trace We believe that the debug trace in context is always received as result of call * `debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)`. */ diff --git a/src/Message/Formatter.php b/src/Message/Formatter.php index da43c1ef..a90afc6b 100644 --- a/src/Message/Formatter.php +++ b/src/Message/Formatter.php @@ -248,17 +248,13 @@ private function getContext(Message $message, array $commonContext): string */ private function getTrace(Message $message): string { - $traces = $message->context('trace', []); - if (empty($traces) || !is_array($traces)) { + $traces = $message->trace(); + if ($traces === null) { return ''; } $lines = array_map( static function (mixed $trace): string { - if (!is_array($trace)) { - return '???'; - } - $file = $trace['file'] ?? null; $line = $trace['line'] ?? null; if (is_string($file) && is_int($line)) { diff --git a/tests/Message/FormatterTest.php b/tests/Message/FormatterTest.php index bd71a828..eab89dce 100644 --- a/tests/Message/FormatterTest.php +++ b/tests/Message/FormatterTest.php @@ -215,23 +215,6 @@ public function testFormatWithTraceInContext(string $expectedTrace, array $trace $this->assertSame($expected, $this->formatter->format($message, [])); } - public function testNonArrayTraceItem() - { - $timestamp = 1_508_160_390; - $this->formatter->setTimestampFormat('Y-m-d H:i:s'); - $message = new Message( - LogLevel::INFO, - 'message', - ['category' => 'app', 'time' => $timestamp, 'trace' => [new stdClass()]], - ); - - $expected = "2017-10-16 13:26:30 [info][app] message\n\nMessage context:\n\n" - . "trace:\n ???\n" - . "category: 'app'\ntime: $timestamp\n"; - - $this->assertSame($expected, $this->formatter->format($message, [])); - } - public function invalidCallableReturnStringProvider(): array { return [ From 0514c5cca3e551de4ba631583dfa678836d9f14c Mon Sep 17 00:00:00 2001 From: Sergei Predvoditelev Date: Sat, 22 Jun 2024 18:50:48 +0300 Subject: [PATCH 4/4] Update src/Message.php Co-authored-by: Alexander Makarov --- src/Message.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Message.php b/src/Message.php index a114b4bd..8010787b 100644 --- a/src/Message.php +++ b/src/Message.php @@ -144,7 +144,6 @@ public function trace(): ?array * @psalm-var list $trace We believe that the debug trace in context is always received as result of call * `debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS)`. */ - return $trace; }