]> source.dussan.org Git - nextcloud-server.git/commitdiff
emit an event when a message is logged
authorRobin Appelman <robin@icewind.nl>
Fri, 26 May 2023 16:57:42 +0000 (18:57 +0200)
committerRobin Appelman <robin@icewind.nl>
Mon, 18 Sep 2023 14:33:30 +0000 (16:33 +0200)
Signed-off-by: Robin Appelman <robin@icewind.nl>
lib/composer/composer/autoload_classmap.php
lib/composer/composer/autoload_static.php
lib/private/EventDispatcher/EventDispatcher.php
lib/private/Log.php
lib/private/Log/PsrLoggerAdapter.php
lib/public/Log/BeforeMessageLoggedEvent.php [new file with mode: 0644]

index 145bd9b8ce94cbade6ac53f8627c57203ee95845..704142956923725672ae892b45e38adaab314ded 100644 (file)
@@ -473,6 +473,7 @@ return array(
     'OCP\\Lock\\ManuallyLockedException' => $baseDir . '/lib/public/Lock/ManuallyLockedException.php',
     'OCP\\Lockdown\\ILockdownManager' => $baseDir . '/lib/public/Lockdown/ILockdownManager.php',
     'OCP\\Log\\Audit\\CriticalActionPerformedEvent' => $baseDir . '/lib/public/Log/Audit/CriticalActionPerformedEvent.php',
+    'OCP\\Log\\BeforeMessageLoggedEvent' => $baseDir . '/lib/public/Log/BeforeMessageLoggedEvent.php',
     'OCP\\Log\\IDataLogger' => $baseDir . '/lib/public/Log/IDataLogger.php',
     'OCP\\Log\\IFileBased' => $baseDir . '/lib/public/Log/IFileBased.php',
     'OCP\\Log\\ILogFactory' => $baseDir . '/lib/public/Log/ILogFactory.php',
index 8d05bda3ad4d70194f596fb61592f594c04409ff..6fa8f7b4a09fe542d5599000c63ff1f176125bcb 100644 (file)
@@ -506,6 +506,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2
         'OCP\\Lock\\ManuallyLockedException' => __DIR__ . '/../../..' . '/lib/public/Lock/ManuallyLockedException.php',
         'OCP\\Lockdown\\ILockdownManager' => __DIR__ . '/../../..' . '/lib/public/Lockdown/ILockdownManager.php',
         'OCP\\Log\\Audit\\CriticalActionPerformedEvent' => __DIR__ . '/../../..' . '/lib/public/Log/Audit/CriticalActionPerformedEvent.php',
+        'OCP\\Log\\BeforeMessageLoggedEvent' => __DIR__ . '/../../..' . '/lib/public/Log/BeforeMessageLoggedEvent.php',
         'OCP\\Log\\IDataLogger' => __DIR__ . '/../../..' . '/lib/public/Log/IDataLogger.php',
         'OCP\\Log\\IFileBased' => __DIR__ . '/../../..' . '/lib/public/Log/IFileBased.php',
         'OCP\\Log\\ILogFactory' => __DIR__ . '/../../..' . '/lib/public/Log/ILogFactory.php',
index 2a3063449233a8d0ecd5187bd76b45c730ea4c84..d64ad88be7e7c8dc0037dd940432b259b348b015 100644 (file)
@@ -27,6 +27,7 @@ declare(strict_types=1);
  */
 namespace OC\EventDispatcher;
 
+use OC\Log;
 use Psr\Log\LoggerInterface;
 use function get_class;
 use OC\Broadcast\Events\BroadcastEvent;
@@ -54,6 +55,12 @@ class EventDispatcher implements IEventDispatcher {
                $this->dispatcher = $dispatcher;
                $this->container = $container;
                $this->logger = $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 or $this->logger instanceof Log\PsrLoggerAdapter) {
+                       $this->logger->setEventDispatcher($this);
+               }
        }
 
        public function addListener(string $eventName,
index 5c1862370fed8e4af20e5318c21c69b3f92b065f..3ba87526941bcd2895d6a277a5443660a8f9a31d 100644 (file)
@@ -38,6 +38,8 @@ namespace OC;
 
 use Exception;
 use Nextcloud\LogNormalizer\Normalizer;
+use OCP\EventDispatcher\IEventDispatcher;
+use OCP\Log\BeforeMessageLoggedEvent;
 use OCP\ILogger;
 use OCP\IUserSession;
 use OCP\Log\IDataLogger;
@@ -65,6 +67,7 @@ class Log implements ILogger, IDataLogger {
        private ?bool $logConditionSatisfied = null;
        private ?Normalizer $normalizer;
        private ?IRegistry $crashReporters;
+       private ?IEventDispatcher $eventDispatcher;
 
        /**
         * @param IWriter $logger The logger that should be used
@@ -91,6 +94,11 @@ class Log implements ILogger, IDataLogger {
                        $this->normalizer = $normalizer;
                }
                $this->crashReporters = $registry;
+               $this->eventDispatcher = null;
+       }
+
+       public function setEventDispatcher(IEventDispatcher $eventDispatcher) {
+               $this->eventDispatcher = $eventDispatcher;
        }
 
        /**
@@ -209,6 +217,10 @@ class Log implements ILogger, IDataLogger {
                $app = $context['app'] ?? 'no app in context';
                $entry = $this->interpolateMessage($context, $message);
 
+               if ($this->eventDispatcher) {
+                       $this->eventDispatcher->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $entry));
+               }
+
                try {
                        if ($level >= $minLevel) {
                                $this->writeLog($app, $entry, $level);
@@ -331,6 +343,10 @@ class Log implements ILogger, IDataLogger {
 
                array_walk($context, [$this->normalizer, 'format']);
 
+               if ($this->eventDispatcher) {
+                       $this->eventDispatcher->dispatchTyped(new BeforeMessageLoggedEvent($app, $level, $data));
+               }
+
                try {
                        if ($level >= $minLevel) {
                                if (!$this->logger instanceof IFileBased) {
index 80c4c187b13b15080b2cabba7f175ad13f191c40..07a898e2528b616a930bbf94b41d749f55da201b 100644 (file)
@@ -26,6 +26,7 @@ declare(strict_types=1);
 namespace OC\Log;
 
 use OC\Log;
+use OCP\EventDispatcher\IEventDispatcher;
 use OCP\ILogger;
 use OCP\Log\IDataLogger;
 use Psr\Log\InvalidArgumentException;
@@ -42,6 +43,10 @@ final class PsrLoggerAdapter implements LoggerInterface, IDataLogger {
                $this->logger = $logger;
        }
 
+       public function setEventDispatcher(IEventDispatcher $eventDispatcher) {
+               $this->logger->setEventDispatcher($eventDispatcher);
+       }
+
        private function containsThrowable(array $context): bool {
                return array_key_exists('exception', $context) && $context['exception'] instanceof Throwable;
        }
diff --git a/lib/public/Log/BeforeMessageLoggedEvent.php b/lib/public/Log/BeforeMessageLoggedEvent.php
new file mode 100644 (file)
index 0000000..42e57f0
--- /dev/null
@@ -0,0 +1,78 @@
+<?php
+
+declare(strict_types=1);
+/**
+ * @copyright Copyright (c) 2023 Robin Appelman <robin@icewind.nl>
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+namespace OCP\Log;
+
+use OCP\EventDispatcher\Event;
+
+/**
+ * Even for when a log item is being logged
+ *
+ * @since 26.0.7
+ */
+class BeforeMessageLoggedEvent extends Event {
+       private int $level;
+       private string $app;
+       private $message;
+
+       /**
+        * @since 28.0.0
+        */
+       public function __construct(string $app, int $level, $message) {
+               $this->level = $level;
+               $this->app = $app;
+               $this->message = $message;
+       }
+
+       /**
+        * Get the level of the log item
+        *
+        * @return int
+        * @since 28.0.0
+        */
+       public function getLevel(): int {
+               return $this->level;
+       }
+
+
+       /**
+        * Get the app context of the log item
+        *
+        * @return string
+        * @since 28.0.0
+        */
+       public function getApp(): string {
+               return $this->app;
+       }
+
+
+       /**
+        * Get the message of the log item
+        *
+        * @return string
+        * @since 28.0.0
+        */
+       public function getMessage(): string {
+               return $this->message;
+       }
+}