diff --git a/lib/private/Log.php b/lib/private/Log.php index 301a25d12c1..3e3d912533e 100644 --- a/lib/private/Log.php +++ b/lib/private/Log.php @@ -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'; diff --git a/lib/private/Server.php b/lib/private/Server.php index 144acc42cb3..70af8b1bac8 100644 --- a/lib/private/Server.php +++ b/lib/private/Server.php @@ -669,6 +669,7 @@ 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); });