aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private
diff options
context:
space:
mode:
authorJohn Molakvoæ <skjnldsv@users.noreply.github.com>2024-02-23 21:56:13 +0100
committerGitHub <noreply@github.com>2024-02-23 21:56:13 +0100
commit52072741486447195d1c1852320cc29592a5ef36 (patch)
tree3172ea92f964bd6e75dcc473f56974cb02e90039 /lib/private
parentb1720970b06f3e3c9558e936ef3f0d3a71ca06a9 (diff)
parent2232753b994dfb65ae46f07f827b89858faea4db (diff)
downloadnextcloud-server-52072741486447195d1c1852320cc29592a5ef36.tar.gz
nextcloud-server-52072741486447195d1c1852320cc29592a5ef36.zip
Merge pull request #43529 from nextcloud/enh/noid/leave-log-early-if-no-crash-reporter
Diffstat (limited to 'lib/private')
-rw-r--r--lib/private/EventDispatcher/EventDispatcher.php26
-rw-r--r--lib/private/Log.php36
2 files changed, 25 insertions, 37 deletions
diff --git a/lib/private/EventDispatcher/EventDispatcher.php b/lib/private/EventDispatcher/EventDispatcher.php
index 14c13d516c0..39bf2a6afa9 100644
--- a/lib/private/EventDispatcher/EventDispatcher.php
+++ b/lib/private/EventDispatcher/EventDispatcher.php
@@ -33,29 +33,17 @@ use OCP\Broadcast\Events\IBroadcastEvent;
use OCP\EventDispatcher\ABroadcastedEvent;
use OCP\EventDispatcher\Event;
use OCP\EventDispatcher\IEventDispatcher;
-use OCP\IContainer;
use OCP\IServerContainer;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventDispatcher as SymfonyDispatcher;
use function get_class;
class EventDispatcher implements IEventDispatcher {
- /** @var SymfonyDispatcher */
- private $dispatcher;
-
- /** @var IContainer */
- private $container;
-
- /** @var LoggerInterface */
- private $logger;
-
- public function __construct(SymfonyDispatcher $dispatcher,
- IServerContainer $container,
- LoggerInterface $logger) {
- $this->dispatcher = $dispatcher;
- $this->container = $container;
- $this->logger = $logger;
-
+ public function __construct(
+ private SymfonyDispatcher $dispatcher,
+ private IServerContainer $container,
+ private LoggerInterface $logger,
+ ) {
// inject the event dispatcher into the logger
// this is done here because there is a cyclic dependency between the event dispatcher and logger
if ($this->logger instanceof Log || $this->logger instanceof Log\PsrLoggerAdapter) {
@@ -86,6 +74,10 @@ class EventDispatcher implements IEventDispatcher {
$this->addListener($eventName, $listener, $priority);
}
+ public function hasListeners(string $eventName): bool {
+ return $this->dispatcher->hasListeners($eventName);
+ }
+
/**
* @deprecated
*/
diff --git a/lib/private/Log.php b/lib/private/Log.php
index 9975696ff06..2ad214ddec5 100644
--- a/lib/private/Log.php
+++ b/lib/private/Log.php
@@ -62,24 +62,22 @@ use function strtr;
* MonoLog is an example implementing this interface.
*/
class Log implements ILogger, IDataLogger {
- private IWriter $logger;
private ?SystemConfig $config;
private ?bool $logConditionSatisfied = null;
private ?Normalizer $normalizer;
- private ?IRegistry $crashReporters;
private ?IEventDispatcher $eventDispatcher;
/**
* @param IWriter $logger The logger that should be used
- * @param SystemConfig $config the system config object
+ * @param SystemConfig|null $config the system config object
* @param Normalizer|null $normalizer
- * @param IRegistry|null $registry
+ * @param IRegistry|null $crashReporters
*/
public function __construct(
- IWriter $logger,
+ private IWriter $logger,
SystemConfig $config = null,
Normalizer $normalizer = null,
- IRegistry $registry = null
+ private ?IRegistry $crashReporters = null
) {
// FIXME: Add this for backwards compatibility, should be fixed at some point probably
if ($config === null) {
@@ -87,13 +85,11 @@ class Log implements ILogger, IDataLogger {
}
$this->config = $config;
- $this->logger = $logger;
if ($normalizer === null) {
$this->normalizer = new Normalizer();
} else {
$this->normalizer = $normalizer;
}
- $this->crashReporters = $registry;
$this->eventDispatcher = null;
}
@@ -211,15 +207,18 @@ class Log implements ILogger, IDataLogger {
*/
public function log(int $level, string $message, array $context = []) {
$minLevel = $this->getLogLevel($context);
+ if ($level < $minLevel
+ && (($this->crashReporters?->hasReporters() ?? false) === false)
+ && (($this->eventDispatcher?->hasListeners(BeforeMessageLoggedEvent::class) ?? false) === false)) {
+ return; // no crash reporter, no listeners, we can stop for lower log level
+ }
array_walk($context, [$this->normalizer, 'format']);
$app = $context['app'] ?? 'no app in context';
$entry = $this->interpolateMessage($context, $message);
- if ($this->eventDispatcher) {
- $this->eventDispatcher->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $entry));
- }
+ $this->eventDispatcher?->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $entry));
$hasBacktrace = isset($entry['exception']);
$logBacktrace = $this->config->getValue('log.backtrace', false);
@@ -241,9 +240,7 @@ class Log implements ILogger, IDataLogger {
$this->crashReporters->delegateMessage($entry['message'], $messageContext);
}
} else {
- if ($this->crashReporters !== null) {
- $this->crashReporters->delegateBreadcrumb($entry['message'], 'log', $context);
- }
+ $this->crashReporters?->delegateBreadcrumb($entry['message'], 'log', $context);
}
} catch (Throwable $e) {
// make sure we dont hard crash if logging fails
@@ -329,8 +326,10 @@ class Log implements ILogger, IDataLogger {
$level = $context['level'] ?? ILogger::ERROR;
$minLevel = $this->getLogLevel($context);
- if ($level < $minLevel && ($this->crashReporters === null || !$this->crashReporters->hasReporters())) {
- return;
+ if ($level < $minLevel
+ && (($this->crashReporters?->hasReporters() ?? false) === false)
+ && (($this->eventDispatcher?->hasListeners(BeforeMessageLoggedEvent::class) ?? false) === false)) {
+ return; // no crash reporter, no listeners, we can stop for lower log level
}
// if an error is raised before the autoloader is properly setup, we can't serialize exceptions
@@ -346,12 +345,9 @@ class Log implements ILogger, IDataLogger {
$data = array_merge($serializer->serializeException($exception), $data);
$data = $this->interpolateMessage($data, isset($context['message']) && $context['message'] !== '' ? $context['message'] : ('Exception thrown: ' . get_class($exception)), 'CustomMessage');
-
array_walk($context, [$this->normalizer, 'format']);
- if ($this->eventDispatcher) {
- $this->eventDispatcher->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $data));
- }
+ $this->eventDispatcher?->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $data));
try {
if ($level >= $minLevel) {