Skip to content

Commit

Permalink
Tracy to PSR bridge: calls original Tracy logger directly instead of …
Browse files Browse the repository at this point in the history
…via Monolog to prevent modifying logs

prevents changing log level to PSR-compatible and prevents modifying message by Monolog
  • Loading branch information
mabar committed Jul 3, 2024
1 parent fddbfbf commit 617e6ce
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 7 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- Tracy to PSR bridge
- custom levels are mapped to info instead of error if the logged value is not an exception
- custom levels are added to context key `custom_level`
- calls original Tracy logger directly instead of via Monolog to prevent modifying logs
(prevents changing log level to PSR-compatible and prevents modifying message by Monolog)

## [1.3.1](https://github.com/orisai/nette-monolog/compare/1.3.0...1.3.1) - 2024-06-21

Expand Down
9 changes: 7 additions & 2 deletions src/DI/MonologExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@
use OriNette\Monolog\LogFlusher;
use OriNette\Monolog\StaticLoggerGetter;
use OriNette\Monolog\Tracy\LazyTracyToPsrLogger;
use OriNette\Monolog\Tracy\ToggleableTracyToPsrLoggerAdapter;
use OriNette\Monolog\Tracy\TracyPanelHandler;
use Orisai\Exceptions\Logic\InvalidArgument;
use Orisai\Exceptions\Logic\InvalidState;
use Orisai\Exceptions\Message;
use Psr\Log\LogLevel;
use stdClass;
use Tracy\Bar;
use Tracy\Bridges\Psr\TracyToPsrLoggerAdapter;
use Tracy\Debugger;
use Tracy\ILogger;
use function array_diff;
Expand Down Expand Up @@ -518,7 +518,7 @@ private function registerToTracyBridge(stdClass $config, ContainerBuilder $build

$builder->addDefinition($this->prefix('bridge.psrToTracy'))
->setFactory(
TracyToPsrLoggerAdapter::class,
ToggleableTracyToPsrLoggerAdapter::class,
[
$builder->getDefinition($tracyLoggerDefinitionName),
],
Expand Down Expand Up @@ -555,10 +555,15 @@ private function registerFromTracyBridge(
'channels',
);

$tracyAdapterDefinition = $builder->hasDefinition($this->prefix('bridge.psrToTracy'))
? $builder->getDefinition($this->prefix('bridge.psrToTracy'))
: null;

$tracyToPsrDefinition = $builder->addDefinition($this->prefix('bridge.tracyToPsr'))
->setFactory(LazyTracyToPsrLogger::class, [
'serviceMap' => $tracyToPsrChannelKeys,
'tracyOriginalLogger' => $tracyLoggerDefinition,
'toggleableTracyToPsrLoggerAdapter' => $tracyAdapterDefinition,
]);

$init = $this->getInitialization();
Expand Down
28 changes: 25 additions & 3 deletions src/Tracy/LazyTracyToPsrLogger.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,18 @@ final class LazyTracyToPsrLogger extends ServiceManager implements ILogger

private ?ILogger $tracyOriginalLogger;

public function __construct(array $serviceMap, Container $container, ?ILogger $tracyOriginalLogger = null)
private ?ToggleableTracyToPsrLoggerAdapter $toggleableTracyToPsrLoggerAdapter;

public function __construct(
array $serviceMap,
Container $container,
?ILogger $tracyOriginalLogger = null,
?ToggleableTracyToPsrLoggerAdapter $toggleableTracyToPsrLoggerAdapter = null
)
{
parent::__construct($serviceMap, $container);
$this->tracyOriginalLogger = $tracyOriginalLogger;
$this->toggleableTracyToPsrLoggerAdapter = $toggleableTracyToPsrLoggerAdapter;
}

/**
Expand All @@ -45,10 +53,24 @@ public function __construct(array $serviceMap, Container $container, ?ILogger $t
*/
public function log($value, $level = self::INFO): void
{
if ($this->tracyOriginalLogger !== null) {
$this->tracyOriginalLogger->log($value, $level);
}

[$mappedLevel, $message, $context] = $this->transform($value, $level);

foreach ($this->getLoggers() as $logger) {
$logger->log($mappedLevel, $message, $context);
if ($this->toggleableTracyToPsrLoggerAdapter !== null) {
$this->toggleableTracyToPsrLoggerAdapter->enabled = false;
}

try {
foreach ($this->getLoggers() as $logger) {
$logger->log($mappedLevel, $message, $context);
}
} finally {
if ($this->toggleableTracyToPsrLoggerAdapter !== null) {
$this->toggleableTracyToPsrLoggerAdapter->enabled = true;
}
}
}

Expand Down
27 changes: 27 additions & 0 deletions src/Tracy/ToggleableTracyToPsrLoggerAdapter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php declare(strict_types = 1);

namespace OriNette\Monolog\Tracy;

use Tracy\Bridges\Psr\TracyToPsrLoggerAdapter;

/**
* @internal
*/
final class ToggleableTracyToPsrLoggerAdapter extends TracyToPsrLoggerAdapter
{

public bool $enabled = true;

/**
* @param array<mixed> $context
*/
public function log($level, $message, array $context = []): void
{
if (!$this->enabled) {
return;
}

parent::log($level, $message, $context);
}

}
4 changes: 2 additions & 2 deletions tests/Unit/DI/MonologExtensionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -858,7 +858,7 @@ public function testTracyBothDirections(string $config): void
$container = $configurator->createContainer();

self::assertFalse($container->isCreated('monolog.handler.tracyLogger'));
self::assertFalse($container->isCreated('monolog.bridge.psrToTracy'));
self::assertTrue($container->isCreated('monolog.bridge.psrToTracy'));
self::assertTrue($container->isCreated('tracy.logger'));

$logger = $container->getService('monolog.channel.ch1');
Expand Down Expand Up @@ -924,7 +924,7 @@ public function testTracyBothDirectionsWithOptions(string $config, bool $enableD
$container = $configurator->createContainer();

self::assertFalse($container->isCreated('monolog.handler.tracyLogger'));
self::assertFalse($container->isCreated('monolog.bridge.psrToTracy'));
self::assertTrue($container->isCreated('monolog.bridge.psrToTracy'));
self::assertTrue($container->isCreated('tracy.logger'));

$logger = $container->getService('monolog.channel.ch1');
Expand Down
3 changes: 3 additions & 0 deletions tests/Unit/DI/config/tracy.fromTracy.neon
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,6 @@ monolog:

bridge:
fromTracy: ['ch1', 'ch3']

services:
tracy.logger: Tests\OriNette\Monolog\Doubles\TracyTestLogger
31 changes: 31 additions & 0 deletions tests/Unit/Tracy/ToggleableTracyToPsrLoggerAdapterTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php declare(strict_types = 1);

namespace Tests\OriNette\Monolog\Unit\Tracy;

use OriNette\Monolog\Tracy\ToggleableTracyToPsrLoggerAdapter;
use PHPUnit\Framework\TestCase;
use Tests\OriNette\Monolog\Doubles\TracyTestLogger;

final class ToggleableTracyToPsrLoggerAdapterTest extends TestCase
{

public function test(): void
{
$logger = new TracyTestLogger();
$adapter = new ToggleableTracyToPsrLoggerAdapter($logger);

self::assertCount(0, $logger->getRecords());

$adapter->error('test');
self::assertCount(1, $logger->getRecords());

$adapter->enabled = false;
$adapter->error('test');
self::assertCount(1, $logger->getRecords());

$adapter->enabled = true;
$adapter->error('test');
self::assertCount(2, $logger->getRecords());
}

}

0 comments on commit 617e6ce

Please sign in to comment.