use Friendica\Content\Nav;
use Friendica\Core\Config\Factory\Config;
use Friendica\Core\Container;
+use Friendica\Core\Logger\LoggerManager;
use Friendica\Core\Renderer;
use Friendica\Core\Session\Capability\IHandleUserSessions;
use Friendica\Database\Definition\DbaDefinition;
$this->container->setup(LogChannel::APP, false);
+ /** @var LoggerManager */
+ $loggerManager = $this->container->create(LoggerManager::class);
+ $loggerManager->changeLogChannel(LogChannel::APP);
+
$this->requestId = $this->container->create(Request::class)->getRequestId();
$this->auth = $this->container->create(Authentication::class);
$this->config = $this->container->create(IManageConfigValues::class);
*/
final class LoggerManager
{
+ /**
+ * Workaround: $logger must be static
+ * because Dice always creates a new LoggerManager object
+ *
+ * @var LoggerInterface|null
+ */
+ private static $logger = null;
+
private IManageConfigValues $config;
private bool $debug;
private string $logLevel;
- private string $logChannel;
-
private bool $profiling;
- private LoggerInterface $logger;
+ private string $logChannel;
public function __construct(IManageConfigValues $config)
{
$this->debug = (bool) $config->get('system', 'debugging') ?? false;
$this->logLevel = (string) $config->get('system', 'loglevel') ?? LogLevel::NOTICE;
- $this->logChannel = LogChannel::DEFAULT;
$this->profiling = (bool) $config->get('system', 'profiling') ?? false;
+ $this->logChannel = LogChannel::DEFAULT;
+ }
+
+ public function changeLogChannel(string $logChannel): void
+ {
+ $this->logChannel = $logChannel;
+
+ self::$logger = null;
}
/**
*/
public function getLogger(): LoggerInterface
{
- if (! isset($this->logger)) {
- $this->logger = $this->createProfiledLogger();
+ if (self::$logger === null) {
+ self::$logger = $this->createProfiledLogger();
}
- return $this->logger;
+ return self::$logger;
}
private function createProfiledLogger(): LoggerInterface
namespace Friendica\Test\Unit\Core\Logger;
use Friendica\Core\Config\Capability\IManageConfigValues;
+use Friendica\Core\Logger\Capability\LogChannel;
use Friendica\Core\Logger\LoggerManager;
use Friendica\Core\Logger\Type\ProfilerLogger;
use PHPUnit\Framework\TestCase;
{
public function testGetLoggerReturnsPsrLogger(): void
{
+ $reflectionProperty = new \ReflectionProperty(LoggerManager::class, 'logger');
+ $reflectionProperty->setAccessible(true);
+ $reflectionProperty->setValue(null, null);
+
$factory = new LoggerManager($this->createStub(IManageConfigValues::class));
$this->assertInstanceOf(LoggerInterface::class, $factory->getLogger());
public function testGetLoggerReturnsSameObject(): void
{
+ $reflectionProperty = new \ReflectionProperty(LoggerManager::class, 'logger');
+ $reflectionProperty->setAccessible(true);
+ $reflectionProperty->setValue(null, null);
+
$factory = new LoggerManager($this->createStub(IManageConfigValues::class));
$this->assertSame($factory->getLogger(), $factory->getLogger());
['system', 'debugging', null, false],
]);
+ $reflectionProperty = new \ReflectionProperty(LoggerManager::class, 'logger');
+ $reflectionProperty->setAccessible(true);
+ $reflectionProperty->setValue(null, null);
+
$factory = new LoggerManager($config);
$this->assertInstanceOf(NullLogger::class, $factory->getLogger());
['system', 'profiling', null, true],
]);
+ $reflectionProperty = new \ReflectionProperty(LoggerManager::class, 'logger');
+ $reflectionProperty->setAccessible(true);
+ $reflectionProperty->setValue(null, null);
+
$factory = new LoggerManager($config);
$this->assertInstanceOf(ProfilerLogger::class, $factory->getLogger());
}
+
+ public function testChangeChannelReturnsDifferentLogger(): void
+ {
+ $config = $this->createStub(IManageConfigValues::class);
+ $config->method('get')->willReturnMap([
+ ['system', 'debugging', null, false],
+ ['system', 'profiling', null, true],
+ ]);
+
+ $reflectionProperty = new \ReflectionProperty(LoggerManager::class, 'logger');
+ $reflectionProperty->setAccessible(true);
+ $reflectionProperty->setValue(null, null);
+
+ $factory = new LoggerManager($config);
+
+ $logger1 = $factory->getLogger();
+
+ $factory->changeLogChannel(LogChannel::CONSOLE);
+
+ $this->assertNotSame($logger1, $factory->getLogger());
+ }
}