From 5e89fb37866b657e7c3ccf88df7554a7afa421d1 Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 12:53:39 +0100 Subject: [PATCH 1/6] Feature: Allow multiple targets for logger --- composer.json | 3 +- .../InvalidLoggerConfigException.php | 15 +++++++ src/Util/Logger.php | 40 +++++++++++++++++-- 3 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 src/Exceptions/InvalidLoggerConfigException.php diff --git a/composer.json b/composer.json index 53f1cd5..2c23c4c 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,8 @@ "ext-phalcon": "^3.0", "swiftmailer/swiftmailer": "@stable", "phalcon/incubator": "^3.0", - "aws/aws-sdk-php": "^3.3" + "aws/aws-sdk-php": "^3.3", + "psr/log": "^1.0" }, "require-dev": { "phpunit/phpunit": "~4.5||~6.0", diff --git a/src/Exceptions/InvalidLoggerConfigException.php b/src/Exceptions/InvalidLoggerConfigException.php new file mode 100644 index 0000000..e12a986 --- /dev/null +++ b/src/Exceptions/InvalidLoggerConfigException.php @@ -0,0 +1,15 @@ + + * @package PhalconUtils\src\Exceptions + */ +class InvalidLoggerConfigException extends Exception +{ + +} diff --git a/src/Util/Logger.php b/src/Util/Logger.php index 545395c..d214c7a 100644 --- a/src/Util/Logger.php +++ b/src/Util/Logger.php @@ -2,9 +2,12 @@ namespace PhalconUtils\Util; -use Phalcon\Logger\Adapter\File; use Phalcon\Http\Client\Response as HttpResponse; +use Phalcon\Logger\AdapterInterface; use PhalconUtils\Http\BaseGateway; +use PhalconUtils\src\Exceptions\InvalidLoggerConfigException; +use Psr\Log\AbstractLogger; +use Psr\Log\LoggerInterface; use SoapClient; /** @@ -12,14 +15,26 @@ * @author Adeyemi Olaoye * @package PhalconUtils\Util */ -class Logger extends File +class Logger extends AbstractLogger implements LoggerInterface { protected $debugEnabled; - public function __construct($name, $options = null) + /** @var AdapterInterface[] | LoggerInterface[] */ + protected $logTargets; + + public function __construct(array $logTargets, $options = []) { $this->debugEnabled = ArrayUtils::getValue($options, 'debug', false); - parent::__construct($name, $options); + $this->logTargets = $logTargets; + + foreach ($this->logTargets as $logTarget) { + if (!($logTarget instanceof LoggerInterface || $logTarget instanceof AdapterInterface)) { + throw new InvalidLoggerConfigException( + 'Log target must be instance of ' . LoggerInterface::class . ' or ' . + AdapterInterface::class . '; encountered ' . get_class($logTarget) + ); + } + } } public function debug($message, array $context = null) @@ -61,4 +76,21 @@ public function debugHttpServiceResponse(BaseGateway $service, HttpResponse $res { $this->debug('Service Response ' . get_class($service) . ':' . var_export($response, true)); } + + /** + * Logs with an arbitrary level. + * + * @param mixed $level + * @param string $message + * @param array $context + * + * @return void + */ + public function log($level, $message, array $context = []) + { + /** @var LoggerInterface|AdapterInterface $logTarget */ + foreach ($this->logTargets as $logTarget) { + $logTarget->log($level, $message, $context); + } + } } From fd4f14b576020ead3c2d8e09fd68471817ae460e Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 13:16:59 +0100 Subject: [PATCH 2/6] Feature: Implementing mapping for phalcon log level to PSR log level --- src/Util/Logger.php | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/Util/Logger.php b/src/Util/Logger.php index d214c7a..e3ea7b8 100644 --- a/src/Util/Logger.php +++ b/src/Util/Logger.php @@ -3,11 +3,13 @@ namespace PhalconUtils\Util; use Phalcon\Http\Client\Response as HttpResponse; +use Phalcon\Logger as PhalconLogLevel; use Phalcon\Logger\AdapterInterface; use PhalconUtils\Http\BaseGateway; use PhalconUtils\src\Exceptions\InvalidLoggerConfigException; use Psr\Log\AbstractLogger; use Psr\Log\LoggerInterface; +use Psr\Log\LogLevel; use SoapClient; /** @@ -90,7 +92,32 @@ public function log($level, $message, array $context = []) { /** @var LoggerInterface|AdapterInterface $logTarget */ foreach ($this->logTargets as $logTarget) { + if ($logTarget instanceof AdapterInterface) { + $level = $this->getPhalconLoggerLevel($level); + } $logTarget->log($level, $message, $context); } } + + /** + * Get Phalcon Log Level from PSR Log level + * @author Adeyemi Olaoye + * @param $level + * @return null + */ + private function getPhalconLoggerLevel($level) + { + $levelMap = [ + LogLevel::INFO => PhalconLogLevel::INFO, + LogLevel::DEBUG => PhalconLogLevel::DEBUG, + LogLevel::ALERT => PhalconLogLevel::ALERT, + LogLevel::CRITICAL => PhalconLogLevel::CRITICAL, + LogLevel::EMERGENCY => PhalconLogLevel::EMERGENCY, + LogLevel::ERROR => PhalconLogLevel::ERROR, + LogLevel::NOTICE => PhalconLogLevel::NOTICE, + LogLevel::WARNING => PhalconLogLevel::WARNING + ]; + + return ArrayUtils::getValue($levelMap, $level, PhalconLogLevel::INFO); + } } From 5f77341036aaaff74a738d8dff405bb8ffabb8c8 Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 13:27:49 +0100 Subject: [PATCH 3/6] Feature: Update request logger middleware implementation --- src/Middleware/RequestLoggerMiddleware.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Middleware/RequestLoggerMiddleware.php b/src/Middleware/RequestLoggerMiddleware.php index efb111a..e6ff15e 100644 --- a/src/Middleware/RequestLoggerMiddleware.php +++ b/src/Middleware/RequestLoggerMiddleware.php @@ -2,6 +2,7 @@ namespace PhalconUtils\Middleware; +use Phalcon\Logger\Adapter\File; use Phalcon\Mvc\Micro; use PhalconUtils\Constants\Services; use PhalconUtils\Util\Logger; @@ -24,12 +25,13 @@ public function beforeExecuteRoute() $config = $this->getDI()->get(Services::CONFIG); - $logger = new Logger($config->application->logsDir . "requests.log"); + $fileTarget = new File($config->application->logsDir . 'requests.log'); + $logger = new Logger([$fileTarget]); - $logger->log('Request URL:' . $request->getURI(), \Phalcon\Logger::INFO); + $logger->info('Request URL:' . $request->getURI()); if ($request->isPost() || $request->isPut()) { $rawBody = $request->getRawBody(); - $logger->log('Request Body: ' . $rawBody, \Phalcon\Logger::INFO); + $logger->info('Request Body: ' . $rawBody); } } From c08081f32f5264f9d6e0ab36849f418ee422a920 Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 14:44:52 +0100 Subject: [PATCH 4/6] Feature: Update request logger middleware implementation --- CHANGELOG.md | 6 +++++- src/Middleware/RequestLoggerMiddleware.php | 23 +++++++++++++++------- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 874e5d9..1043fb3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -91,4 +91,8 @@ - Added Transformable interface - Added Response Data Serializer for consistent response from transformers - Added Date, File and Text Utils -- Added Custom Logger \ No newline at end of file +- Added Custom Logger + +# [2.3.0](https://github.com/CottaCush/phalcon-utils/releases/tag/2.3.0) (2017-09-08) +- Add Multiple Logging targets +- Allow Multiple log targets for request logger middleware \ No newline at end of file diff --git a/src/Middleware/RequestLoggerMiddleware.php b/src/Middleware/RequestLoggerMiddleware.php index e6ff15e..f4898a1 100644 --- a/src/Middleware/RequestLoggerMiddleware.php +++ b/src/Middleware/RequestLoggerMiddleware.php @@ -14,6 +14,20 @@ */ class RequestLoggerMiddleware extends BaseMiddleware { + /** @var Logger */ + protected $logger; + + public function __construct($logTargets = []) + { + $config = $this->getDI()->get(Services::CONFIG); + + if (!$logTargets) { + $fileTarget = new File($config->application->logsDir . 'requests.log'); + $logger = new Logger([$fileTarget]); + $this->logger = $logger; + } + } + public function beforeExecuteRoute() { if ($this->isExcludedPath($this->getDI()->get(Services::CONFIG)->requestLogger->excluded_paths)) { @@ -23,15 +37,10 @@ public function beforeExecuteRoute() /** @var \Phalcon\Http\Request $request */ $request = $this->getDI()->get(Services::REQUEST); - $config = $this->getDI()->get(Services::CONFIG); - - $fileTarget = new File($config->application->logsDir . 'requests.log'); - $logger = new Logger([$fileTarget]); - - $logger->info('Request URL:' . $request->getURI()); + $this->logger->info('Request URL:' . $request->getURI()); if ($request->isPost() || $request->isPut()) { $rawBody = $request->getRawBody(); - $logger->info('Request Body: ' . $rawBody); + $this->logger->info('Request Body: ' . $rawBody); } } From 121f5a549fca9bb54ff6bd6ec65c67811431d037 Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 17:33:56 +0100 Subject: [PATCH 5/6] Fix: Fix issue with log level for targets after phalcon targets --- src/Util/Logger.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Util/Logger.php b/src/Util/Logger.php index e3ea7b8..a5a17e1 100644 --- a/src/Util/Logger.php +++ b/src/Util/Logger.php @@ -27,7 +27,7 @@ class Logger extends AbstractLogger implements LoggerInterface public function __construct(array $logTargets, $options = []) { $this->debugEnabled = ArrayUtils::getValue($options, 'debug', false); - $this->logTargets = $logTargets; + $this->logTargets = array_filter($logTargets); foreach ($this->logTargets as $logTarget) { if (!($logTarget instanceof LoggerInterface || $logTarget instanceof AdapterInterface)) { @@ -92,10 +92,11 @@ public function log($level, $message, array $context = []) { /** @var LoggerInterface|AdapterInterface $logTarget */ foreach ($this->logTargets as $logTarget) { - if ($logTarget instanceof AdapterInterface) { - $level = $this->getPhalconLoggerLevel($level); + if (($logTarget instanceof AdapterInterface)) { + $logTarget->log($this->getPhalconLoggerLevel($level), $message, $context); + } else { + $logTarget->log($level, $message, $context); } - $logTarget->log($level, $message, $context); } } From 31bd75d116a43a3f1c87153ef4b41ba2afc49f54 Mon Sep 17 00:00:00 2001 From: Adeyemi Olaoye Date: Fri, 8 Sep 2017 17:34:38 +0100 Subject: [PATCH 6/6] Fix: Set logger for request middleware --- src/Middleware/RequestLoggerMiddleware.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Middleware/RequestLoggerMiddleware.php b/src/Middleware/RequestLoggerMiddleware.php index f4898a1..d1822c7 100644 --- a/src/Middleware/RequestLoggerMiddleware.php +++ b/src/Middleware/RequestLoggerMiddleware.php @@ -23,9 +23,11 @@ public function __construct($logTargets = []) if (!$logTargets) { $fileTarget = new File($config->application->logsDir . 'requests.log'); - $logger = new Logger([$fileTarget]); - $this->logger = $logger; + $logTargets = [$fileTarget]; } + + $this->logger = new Logger($logTargets); + } public function beforeExecuteRoute()