From e9f8522bde7881fb8265064eac183d0a1b8d7053 Mon Sep 17 00:00:00 2001 From: Ralf Lang Date: Sun, 12 Apr 2026 08:19:29 +0200 Subject: [PATCH] feat: Add a BufferHandler which aggregates messages to later dump them into another logger --- src/Handler/BufferHandler.php | 94 +++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 src/Handler/BufferHandler.php diff --git a/src/Handler/BufferHandler.php b/src/Handler/BufferHandler.php new file mode 100644 index 0000000..969e522 --- /dev/null +++ b/src/Handler/BufferHandler.php @@ -0,0 +1,94 @@ + + * $buffer = new BufferHandler(); + * $earlyLogger = new Logger([$buffer]); + * $earlyLogger->info('Starting up...'); + * + * // Later, once the real logger is ready: + * $buffer->drain($realLogger); + * + * + * @category Horde + * @license http://www.horde.org/licenses/bsd BSD + * @package Log + * @subpackage Handlers + */ +class BufferHandler extends BaseHandler +{ + use SetOptionsTrait; + + /** @var LogMessage[] */ + private array $buffer = []; + + /** + * Write a message to the in-memory buffer. + * + * @param LogMessage $event Log event. + * + * @return bool True. + */ + public function write(LogMessage $event): bool + { + $this->buffer[] = $event; + return true; + } + + /** + * Replay all buffered messages through the target logger, then clear. + * + * Messages are replayed in the order they were received. Each message + * re-enters the target logger's full pipeline (global filters, handlers). + * + * @param Logger $target Logger to drain messages into. + */ + public function drain(Logger $target): void + { + foreach ($this->buffer as $message) { + $target->log( + $message->level(), + $message->message(), + $message->context(), + ); + } + $this->buffer = []; + } + + /** + * Return the number of buffered messages. + */ + public function count(): int + { + return count($this->buffer); + } +}