From ef18be0617b731829290d4d720209495957fed48 Mon Sep 17 00:00:00 2001 From: OhMyFelix Date: Mon, 23 Feb 2026 11:28:22 +0000 Subject: [PATCH 1/2] Code: add working MultiLogger extension --- .docs/README.md | 13 ++++++++- src/DI/LoggerExtension.php | 40 ++++++++++++++++++++++++++ src/Logger/MultiLogger.php | 25 ++++++++++++++++ tests/Cases/DI/LoggerExtension.phpt | 38 ++++++++++++++++++++++++ tests/Cases/Logger/MultiLogger.phpt | 27 +++++++++++++++++ tests/Fixtures/Logger/MemoryLogger.php | 21 ++++++++++++++ tests/Fixtures/Logger/SpyLogger.php | 21 ++++++++++++++ 7 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 src/DI/LoggerExtension.php create mode 100644 src/Logger/MultiLogger.php create mode 100644 tests/Cases/DI/LoggerExtension.phpt create mode 100644 tests/Cases/Logger/MultiLogger.phpt create mode 100644 tests/Fixtures/Logger/MemoryLogger.php create mode 100644 tests/Fixtures/Logger/SpyLogger.php diff --git a/.docs/README.md b/.docs/README.md index ba1ba94..26ef805 100644 --- a/.docs/README.md +++ b/.docs/README.md @@ -6,7 +6,7 @@ Tuned Tracy Bars/Panels/BlueScreens for easy-developing. - [Setup](#setup) - [TracyBlueScreens - better BlueScreen panels](#tracybluescreen) -- [NavigationPanel - navigate easily through all presenters](#navigationpanel) +- [Logger - register additional Tracy loggers](#logger) ## Setup @@ -26,5 +26,16 @@ extensions: ![Container Builder - parameters][container-builder-parameters] ![Container Builder - definitions][container-builder-definitions] +## Logger + +`LoggerExtension` replaces Tracy logger with `MultiLogger` so you can register additional logger services. + +```neon +extensions: + tracy.logger: Contributte\Tracy\DI\LoggerExtension +``` + +Extra loggers can then be wired in your app and added to the multi logger. + [container-builder-parameters]: https://raw.githubusercontent.com/contributte/tracy/master/.docs/assets/container-builder-parameters.png "Container Builder - parameters" [container-builder-definitions]: https://raw.githubusercontent.com/contributte/tracy/master/.docs/assets/container-builder-definitions.png "Container Builder - definitions" diff --git a/src/DI/LoggerExtension.php b/src/DI/LoggerExtension.php new file mode 100644 index 0000000..e0f1f1a --- /dev/null +++ b/src/DI/LoggerExtension.php @@ -0,0 +1,40 @@ +getContainerBuilder() + ->addDefinition($this->prefix('logger')) + ->setFactory(MultiLogger::class); + } + + public function beforeCompile(): void + { + $builder = $this->getContainerBuilder(); + + $tracyLogger = $builder->getDefinition('tracy.logger'); + assert($tracyLogger instanceof ServiceDefinition); + $tracyLogger->setAutowired(false); + + $multiLogger = $builder->getDefinition($this->prefix('logger')); + assert($multiLogger instanceof ServiceDefinition); + $multiLogger->addSetup('addLogger', [$tracyLogger]); + } + + public function afterCompile(ClassType $class): void + { + $class->getMethod('initialize') + ->addBody('?::setLogger($this->getService(?));', [Debugger::class, $this->prefix('logger')]); + } + +} diff --git a/src/Logger/MultiLogger.php b/src/Logger/MultiLogger.php new file mode 100644 index 0000000..701481f --- /dev/null +++ b/src/Logger/MultiLogger.php @@ -0,0 +1,25 @@ + */ + private array $loggers = []; + + public function addLogger(ILogger $logger): void + { + $this->loggers[] = $logger; + } + + public function log(mixed $value, string $level = self::INFO): void + { + foreach ($this->loggers as $logger) { + $logger->log($value, $level); + } + } + +} diff --git a/tests/Cases/DI/LoggerExtension.phpt b/tests/Cases/DI/LoggerExtension.phpt new file mode 100644 index 0000000..8b8a8ce --- /dev/null +++ b/tests/Cases/DI/LoggerExtension.phpt @@ -0,0 +1,38 @@ +withCompiler(static function (Compiler $compiler): void { + $compiler->addConfig([ + 'services' => [ + 'tracy.logger' => SpyLogger::class, + ], + ]); + + $compiler->addExtension('logger', new LoggerExtension()); + }) + ->build(); + + $container->initialize(); + + Assert::type(MultiLogger::class, Debugger::getLogger()); + + Debugger::log('foo'); + Assert::count(1, SpyLogger::$logs); + Assert::same('foo', SpyLogger::$logs[0]['value']); + Assert::same(ILogger::INFO, SpyLogger::$logs[0]['level']); +}); diff --git a/tests/Cases/Logger/MultiLogger.phpt b/tests/Cases/Logger/MultiLogger.phpt new file mode 100644 index 0000000..8faa124 --- /dev/null +++ b/tests/Cases/Logger/MultiLogger.phpt @@ -0,0 +1,27 @@ +addLogger($first); + $logger->addLogger($second); + $logger->log('boom', ILogger::ERROR); + + Assert::count(1, $first->logs); + Assert::same('boom', $first->logs[0]['value']); + Assert::same(ILogger::ERROR, $first->logs[0]['level']); + + Assert::count(1, $second->logs); + Assert::same('boom', $second->logs[0]['value']); + Assert::same(ILogger::ERROR, $second->logs[0]['level']); +}); diff --git a/tests/Fixtures/Logger/MemoryLogger.php b/tests/Fixtures/Logger/MemoryLogger.php new file mode 100644 index 0000000..0750a7c --- /dev/null +++ b/tests/Fixtures/Logger/MemoryLogger.php @@ -0,0 +1,21 @@ + */ + public array $logs = []; + + public function log(mixed $value, string $level = self::INFO): void + { + $this->logs[] = [ + 'value' => $value, + 'level' => $level, + ]; + } + +} diff --git a/tests/Fixtures/Logger/SpyLogger.php b/tests/Fixtures/Logger/SpyLogger.php new file mode 100644 index 0000000..1107c81 --- /dev/null +++ b/tests/Fixtures/Logger/SpyLogger.php @@ -0,0 +1,21 @@ + */ + public static array $logs = []; + + public function log(mixed $value, string $level = self::INFO): void + { + self::$logs[] = [ + 'value' => $value, + 'level' => $level, + ]; + } + +} From d29d562b6f4587610b96b8a6c97a431068fb0a89 Mon Sep 17 00:00:00 2001 From: OhMyFelix Date: Mon, 23 Feb 2026 11:28:33 +0000 Subject: [PATCH 2/2] Composer: upgrade dependencies --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index 47cbf52..cb91e90 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ ], "require": { "php": ">=8.2", - "tracy/tracy": "^2.9.0" + "tracy/tracy": "^2.11.2" }, "require-dev": { "nette/di": "^3.1.2",