<?php
/**
 * LoggerAggregator file
 *
 * Copyright (c) 2016, Kiril Savchev
 * All rights reserved.
 *
 * @category Libs
 * @package Logger
 *
 * @author Kiril Savchev < [email protected]>
 *
 * @license https://opensource.org/licenses/BSD-3-Clause BSD 3 License
 * @link http://ifthenelse.info
 */
namespace Ite\Logger;
use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface;
/**
 * LoggerAggregator
 *
 * Aggregates multiple loggers into one object and allow them to be registered
 * for a specific level of logging or for all levels.
 *
 * @uses psr\log
 *
 * @version 1.0
 *
 * @usage $loggerAggregator = new LoggerAggregator(['error' => $logger, 'alert' => $logger]);
 * @usage $loggerAggregator->attachLogger($logger2, ['info', 'debug', 'error']);
 * @usage $loggerAggregator->attachLogger($logger3);
 * @usage $loggerAggregator->detachLogger($logger2, 'debug');
 * @usage $loggerAggregator->info("Test info",['a' => 'test context']);
 * @usage $loggerAggregator->error("Test error", ['exception' => new Exception("Tesitng exceptions")]);
 * @usage $loggerAggregator->alert("Test alert", ['exception' => new Exception("Tesitng exceptions"),'a' => 'test context']);
 * @usage $loggerAggregator->debug("Test debug");
 *
 * @author Kiril Savchev <k.savchev@gmail>
 */
class LoggerAggregator extends AbstractLogger implements LoggerAggregatorInterfrace {
        use LoggerAggregatorTrait;
        const ALL_LVL = '*';
        /**
         * File aggregator
         *
         * Creates a logger aggregator with a set of loggers which log()
         * method will be triggered when the aggregator's log() is used.
         * Loggers added to the special level of '*' will be triggered
         * when every level of logging is called.
         *
         * @param array $loggers [Optional] A set of loggers in ['level' => $logger] format
         */
        public function __construct(array $loggers = []) {
                if ($loggers) {
                        $this->setLoggers($loggers);
                }
                if (!array_key_exists(self::ALL_LVL, $this->loggers)) {
                        $this->loggers[self::ALL_LVL] = [];
                }
        }
        /**
         *
         * Logs messages with specific level and context
         *
         * Fires all agregated loggers log() method
         *
         * @param string $level
         * @param string $message
         * @param array $context
         */
        public function log($level, $message, array $context = []) {
                $loggers = $this->loggers[self::ALL_LVL];
                if (array_key_exists($level, $this->loggers) && is_array($this->loggers[$level])) {
                        $loggers = array_merge($loggers, $this->loggers[$level]);
                }
                foreach ($loggers as $logger) {
                        /* @var $logger LoggerInterface */
                        $logger->log($level, $message, $context);
                }
        }
}
 
  |