Compare commits

...

2 Commits

Author SHA1 Message Date
Robin Appelman d1008a5590 feat: log app version
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-11 17:59:35 +02:00
Robin Appelman e3f97eac11 fix: make the PsrLoggerAdapter load the real logger lazily
Signed-off-by: Robin Appelman <robin@icewind.nl>
2025-09-11 15:57:05 +02:00
3 changed files with 38 additions and 6 deletions
+17 -1
View File
@@ -12,6 +12,7 @@ use Exception;
use Nextcloud\LogNormalizer\Normalizer;
use OC\AppFramework\Bootstrap\Coordinator;
use OC\Log\ExceptionSerializer;
use OCP\App\IAppManager;
use OCP\EventDispatcher\IEventDispatcher;
use OCP\ILogger;
use OCP\IRequest;
@@ -38,13 +39,26 @@ class Log implements ILogger, IDataLogger {
private ?bool $logConditionSatisfied = null;
private ?IEventDispatcher $eventDispatcher = null;
private int $nestingLevel = 0;
/** @var callable(): IAppManager */
private $appManagerFactory;
private ?IAppManager $appManager = null;
public function __construct(
private IWriter $logger,
private SystemConfig $config,
private Normalizer $normalizer = new Normalizer(),
private ?IRegistry $crashReporters = null,
?callable $appManagerFactory = null,
) {
$this->appManagerFactory = $appManagerFactory ?? fn() => \OCP\Server::get(IAppManager::class);
}
private function getAppManager(): IAppManager {
if (!$this->appManager) {
$this->appManager = ($this->appManagerFactory)();
}
return $this->appManager;
}
public function setEventDispatcher(IEventDispatcher $eventDispatcher): void {
@@ -142,7 +156,6 @@ class Log implements ILogger, IDataLogger {
$this->log(ILogger::DEBUG, $message, $context);
}
/**
* Logs with an arbitrary level.
*
@@ -158,6 +171,9 @@ class Log implements ILogger, IDataLogger {
return; // no crash reporter, no listeners, we can stop for lower log level
}
if (isset($context['app']) && $version = $this->getAppManager()->getAppVersion($context['app'])) {
$context['app_version'] = $version;
}
array_walk($context, [$this->normalizer, 'format']);
$app = $context['app'] ?? 'no app in context';
+17 -5
View File
@@ -20,11 +20,23 @@ use function array_key_exists;
use function array_merge;
final class PsrLoggerAdapter implements LoggerInterface, IDataLogger {
private ?Log $logger = null;
/**
* @param \Closure(): Log $loggerClosure
*/
public function __construct(
private Log $logger,
private $loggerClosure,
) {
}
private function getLogger(): Log {
if (!$this->logger) {
$this->logger = ($this->loggerClosure)();
}
return $this->logger;
}
public static function logLevelToInt(string $level): int {
return match ($level) {
LogLevel::ALERT => ILogger::ERROR,
@@ -40,7 +52,7 @@ final class PsrLoggerAdapter implements LoggerInterface, IDataLogger {
}
public function setEventDispatcher(IEventDispatcher $eventDispatcher): void {
$this->logger->setEventDispatcher($eventDispatcher);
$this->getLogger()->setEventDispatcher($eventDispatcher);
}
private function containsThrowable(array $context): bool {
@@ -158,7 +170,7 @@ final class PsrLoggerAdapter implements LoggerInterface, IDataLogger {
throw new InvalidArgumentException('Unsupported custom log level');
}
if ($this->containsThrowable($context)) {
$this->logger->logException($context['exception'], array_merge(
$this->getLogger()->logException($context['exception'], array_merge(
[
'message' => (string)$message,
'level' => $level,
@@ -166,11 +178,11 @@ final class PsrLoggerAdapter implements LoggerInterface, IDataLogger {
$context
));
} else {
$this->logger->log($level, (string)$message, $context);
$this->getLogger()->log($level, (string)$message, $context);
}
}
public function logData(string $message, array $data, array $context = []): void {
$this->logger->logData($message, $data, $context);
$this->getLogger()->logData($message, $data, $context);
}
}
+4
View File
@@ -669,11 +669,15 @@ class Server extends ServerContainer implements IServerContainer {
$factory = new LogFactory($c, $this->get(SystemConfig::class));
$logger = $factory->get($logType);
$registry = $c->get(\OCP\Support\CrashReport\IRegistry::class);
$appManagerFactory = fn() => $c->get(IAppManager::class);
return new Log($logger, $this->get(SystemConfig::class), crashReporters: $registry);
});
// PSR-3 logger
$this->registerAlias(LoggerInterface::class, PsrLoggerAdapter::class);
$this->registerService(PsrLoggerAdapter::class, function (Server $c) {
return new PsrLoggerAdapter(fn () => $c->get(Log::class));
});
$this->registerService(ILogFactory::class, function (Server $c) {
return new LogFactory($c, $this->get(SystemConfig::class));