From 806de37cc934bdc412d0cca1da7b8739f44a8767 Mon Sep 17 00:00:00 2001 From: Daniel Seifert Date: Wed, 13 May 2020 18:53:56 +0200 Subject: [PATCH] add configurable FirePHP handler --- composer.json | 3 +- src/Extensions/d3FirePHP.php | 79 ++++++++++++++++++++++++++++++++ src/Handler/d3FirePHPHandler.php | 43 +++++++++++++++++ src/LoggerFactory.php | 47 +++++++++++++++++-- 4 files changed, 167 insertions(+), 5 deletions(-) create mode 100644 src/Extensions/d3FirePHP.php create mode 100644 src/Handler/d3FirePHPHandler.php diff --git a/composer.json b/composer.json index 6b57bb4..df02579 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,8 @@ "type": "library", "require": { "monolog/monolog": "^1", - "nilportugues/sql-query-formatter": "^1.2.2" + "nilportugues/sql-query-formatter": "^1.2.2", + "firephp/firephp-core": "^0.5.3" }, "license": "GPL-3.0", "autoload": { diff --git a/src/Extensions/d3FirePHP.php b/src/Extensions/d3FirePHP.php new file mode 100644 index 0000000..dca9725 --- /dev/null +++ b/src/Extensions/d3FirePHP.php @@ -0,0 +1,79 @@ + + * @link http://www.oxidmodule.com + */ + +namespace D3\OxidSqlLogger\Extensions; + +use D3\OxidSqlLogger\Handler\d3FirePHPHandler; +use D3\OxidSqlLogger\OxidSQLLogger; +use Doctrine\DBAL\Connection; +use \FirePHP; +use Monolog\Handler\AbstractProcessingHandler; +use Monolog\Logger; +use OxidEsales\EshopCommunity\Core\Database\Adapter\Doctrine\Database; + +class d3FirePHP extends FirePHP +{ + /** + * Gets singleton instance of FirePHP + * + * @param boolean $autoCreate + * @return FirePHP + */ + public static function getInstance($autoCreate = false) + { + if ($autoCreate === true && !self::$instance) { + self::init(); + } + return self::$instance; + } + + /** + * Creates FirePHP object and stores it for singleton access + * + * @return FirePHP + */ + public static function init() + { + return self::setInstance(new self()); + } + + public function __construct() + { + parent::__construct(); + + $this->ignoreClassInTraces(d3FirePHP::class); + $this->ignoreClassInTraces(d3FirePHPHandler::class); + $this->ignoreClassInTraces(Logger::class); + $this->ignoreClassInTraces(AbstractProcessingHandler::class); + $this->ignoreClassInTraces(OxidSQLLogger::class); + $this->ignoreClassInTraces(Connection::class); + $this->ignoreClassInTraces(Database::class); + } + + /** + * Log a trace in the firebug console + * + * @see FirePHP::TRACE + * @param string $label + * @return true + * @throws Exception + */ + public function trace($label) + { + return $this->fb($label, $label, FirePHP::TRACE, array( + 'trace' => debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS) + )); + } +} \ No newline at end of file diff --git a/src/Handler/d3FirePHPHandler.php b/src/Handler/d3FirePHPHandler.php new file mode 100644 index 0000000..a007860 --- /dev/null +++ b/src/Handler/d3FirePHPHandler.php @@ -0,0 +1,43 @@ + + * @link http://www.oxidmodule.com + */ + +namespace D3\OxidSqlLogger\Handler; + +use D3\OxidSqlLogger\Extensions\d3FirePHP; +use OxidEsales\Eshop\Core\Registry; + +class d3FirePHPHandler extends \Monolog\Handler\AbstractProcessingHandler +{ + const ADD_TRACE = 'addTrace'; + + protected function write(array $record): void + { + $options = Registry::getConfig()->getConfigParam(d3FirePHPOptions); + $options = isset($options) && is_array($options) ? $options : []; + + $fp = d3FirePHP::getInstance(true); + + if (in_array(self::ADD_TRACE, $options)) { + $fp->group( $record['message'], [ 'Collapsed' => true ] ); + } + + $fp->log( $record['formatted'], $record['message']); + + if (in_array(self::ADD_TRACE, $options)) { + $fp->trace( 'trace', 'trace' ); + $fp->groupEnd(); + } + } +} \ No newline at end of file diff --git a/src/LoggerFactory.php b/src/LoggerFactory.php index d1643cc..4d2a5e2 100644 --- a/src/LoggerFactory.php +++ b/src/LoggerFactory.php @@ -8,6 +8,7 @@ namespace D3\OxidSqlLogger; use Monolog; +use OxidEsales\Eshop\Core\Registry; use Symfony\Component\Console\Formatter\OutputFormatterStyle; /** @@ -29,16 +30,54 @@ class LoggerFactory */ private function getHandlers() { - $handlers = []; if (PHP_SAPI == 'cli') { - $handlers[] = $this->getStreamHandler(); + $configuredHandlers = Registry::getConfig()->getConfigParam('SqlLoggerCLIHandlers'); + + $handlers = (isset($configuredHandlers) && $this->is_iterable($configuredHandlers)) ? + $this->getInstancesFromHandlerList($configuredHandlers) : + [$this->getStreamHandler()]; } else { - $handlers[] = $this->getBrowserConsoleHandler(); - $handlers[] = $this->getFirePHPHandler(); + $configuredHandlers = Registry::getConfig()->getConfigParam('SqlLoggerGUIHandlers'); + + $handlers = (isset($configuredHandlers) && $this->is_iterable($configuredHandlers)) ? + $this->getInstancesFromHandlerList($configuredHandlers) : + [ + $this->getBrowserConsoleHandler(), + $this->getFirePHPHandler() + ]; } + return $handlers; } + /** + * @param array $classNames + * + * @return array + */ + private function getInstancesFromHandlerList(array $classNames) + { + return array_map( + function($className){ + return new $className(); + }, + $classNames + ); + } + + /** + * polyfill for is_iterable() - available from PHP 7.1 + * @param $obj + * + * @return bool + */ + private function is_iterable($obj) + { + return function_exists('is_iterable') ? + is_iterable($obj) : + is_array($obj) || (is_object($obj) && ($obj instanceof \Traversable)); + } + /** * @return Monolog\Handler\StreamHandler */