From c0c307f267b70cac77efc652246532ab1aff8e81 Mon Sep 17 00:00:00 2001 From: Jay Patel Date: Mon, 11 Apr 2016 15:45:49 -0500 Subject: [PATCH] Enabled Factory to Inject Logger --- lib/PayPal/Auth/OAuthTokenCredential.php | 12 +-- lib/PayPal/Core/PayPalLoggingLevel.php | 26 ----- lib/PayPal/Core/PayPalLoggingManager.php | 106 +++++++------------ lib/PayPal/Log/PayPalDefaultLogFactory.php | 26 +++++ lib/PayPal/Log/PayPalLogFactory.php | 17 ++++ lib/PayPal/Log/PayPalLogger.php | 113 ++++++++++----------- sample/bootstrap.php | 4 +- sample/sdk_config.ini | 15 ++- 8 files changed, 143 insertions(+), 176 deletions(-) delete mode 100644 lib/PayPal/Core/PayPalLoggingLevel.php create mode 100644 lib/PayPal/Log/PayPalDefaultLogFactory.php create mode 100644 lib/PayPal/Log/PayPalLogFactory.php diff --git a/lib/PayPal/Auth/OAuthTokenCredential.php b/lib/PayPal/Auth/OAuthTokenCredential.php index 30749d6..521de2a 100644 --- a/lib/PayPal/Auth/OAuthTokenCredential.php +++ b/lib/PayPal/Auth/OAuthTokenCredential.php @@ -33,13 +33,6 @@ class OAuthTokenCredential extends PayPalResourceModel */ private static $expiryBufferTime = 120; - /** - * Private Variable - * - * @var \PayPal\Core\PayPalLoggingManager $logger - */ - private $logger; - /** * Client ID as obtained from the developer portal * @@ -93,7 +86,6 @@ class OAuthTokenCredential extends PayPalResourceModel $this->clientId = $clientId; $this->clientSecret = $clientSecret; $this->cipher = new Cipher($this->clientSecret); - $this->logger = PayPalLoggingManager::getInstance(__CLASS__); } /** @@ -276,9 +268,7 @@ class OAuthTokenCredential extends PayPalResourceModel if ($response == null || !isset($response["access_token"]) || !isset($response["expires_in"])) { $this->accessToken = null; $this->tokenExpiresIn = null; - $this->logger->warning( - "Could not generate new Access token. Invalid response from server: " - ); + PayPalLoggingManager::getInstance(__CLASS__)->warning("Could not generate new Access token. Invalid response from server: "); throw new PayPalConnectionException(null, "Could not generate new Access token. Invalid response from server: "); } else { $this->accessToken = $response["access_token"]; diff --git a/lib/PayPal/Core/PayPalLoggingLevel.php b/lib/PayPal/Core/PayPalLoggingLevel.php deleted file mode 100644 index 607420a..0000000 --- a/lib/PayPal/Core/PayPalLoggingLevel.php +++ /dev/null @@ -1,26 +0,0 @@ -setLoggerName($loggerName); + if (array_key_exists($loggerName, PayPalLoggingManager::$instances)) { + return PayPalLoggingManager::$instances[$loggerName]; + } + $instance = new self($loggerName); + PayPalLoggingManager::$instances[$loggerName] = $instance; return $instance; } - /** - * Sets Logger Name. Generally defaulted to Logging Class - * - * @param string $loggerName - */ - public function setLoggerName($loggerName = __CLASS__) - { - $this->loggerName = $loggerName; - } - /** * Default Constructor + * + * @param string $loggerName Generally represents the class name. */ - public function __construct() + private function __construct($loggerName) { $config = PayPalConfigManager::getInstance()->getConfigHashmap(); - $this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1'); - if ($this->isLoggingEnabled) { - $loggingLevel = strtoupper($config['log.LogLevel']); - $this->setupLogger($config); - $this->loggingLevel = - (isset($loggingLevel) && defined(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel")) ? - constant(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel") : - PayPalLoggingManager::DEFAULT_LOGGING_LEVEL; + if (!empty($config)) { + // Checks if custom factory defined, and is it an implementation of @PayPalLogFactory + $factory = array_key_exists('log.AdapterFactory', $config) && in_array('PayPal\Log\PayPalLogFactory', class_implements($config['log.AdapterFactory'])) ? $config['log.AdapterFactory'] : '\PayPal\Log\PayPalDefaultLogFactory'; + /** @var PayPalLogFactory $factoryInstance */ + $factoryInstance = new $factory(); + $this->logger = $factoryInstance->getLogger($loggerName); + $this->loggerName = $loggerName; } } - private function setupLogger($config = array()) { - // Checks if custom adapter defined, and is it an implementation of @LoggerInterface - $loggingAdapter = array_key_exists('log.Adapter', $config) && in_array('\Psr\Log\LoggerInterface', class_implements($config['log.Adapter']))? $config['log.Adapter'] : '\PayPal\Log\PayPalLogger'; - $this->logger = new $loggingAdapter(); - } - - /** * Log Error * @@ -99,9 +72,7 @@ class PayPalLoggingManager */ public function error($message) { - if ($this->isLoggingEnabled && $this->loggingLevel >= PayPalLoggingLevel::ERROR) { - $this->logger->error($message); - } + $this->logger->error($message); } /** @@ -111,10 +82,7 @@ class PayPalLoggingManager */ public function warning($message) { - if ($this->isLoggingEnabled && $this->loggingLevel >= PayPalLoggingLevel::WARN) { - $this->logger->warning($message); - } - + $this->logger->warning($message); } /** @@ -124,9 +92,7 @@ class PayPalLoggingManager */ public function info($message) { - if ($this->isLoggingEnabled && $this->loggingLevel >= PayPalLoggingLevel::INFO) { - $this->logger->info($message); - } + $this->logger->info($message); } /** @@ -140,20 +106,16 @@ class PayPalLoggingManager } /** - * Log Fine + * Log Debug * * @param string $message */ public function debug($message) { - if ($this->isLoggingEnabled) { - $config = PayPalConfigManager::getInstance()->getConfigHashmap(); - // Check if logging in live - if (array_key_exists('mode', $config) && $config['mode'] == 'live' && $this->loggingLevel >= PayPalLoggingLevel::DEBUG) { - $this->logger->error("Not allowed to keep 'Debug' level for Live Environments. Reduced to 'INFO'"); - } elseif (PayPalLoggingLevel::DEBUG <= $this->loggingLevel) { - $this->logger->debug($message); - } + $config = PayPalConfigManager::getInstance()->getConfigHashmap(); + // Disable debug in live mode. + if (array_key_exists('mode', $config) && $config['mode'] != 'live') { + $this->logger->debug($message); } } diff --git a/lib/PayPal/Log/PayPalDefaultLogFactory.php b/lib/PayPal/Log/PayPalDefaultLogFactory.php new file mode 100644 index 0000000..1ac894f --- /dev/null +++ b/lib/PayPal/Log/PayPalDefaultLogFactory.php @@ -0,0 +1,26 @@ +getConfigHashmap(); + /** + * Log Enabled + * + * @var bool + */ + private $isLoggingEnabled; + + /** + * Logger Name. Generally corresponds to class name + * + * @var string + */ + private $loggerName; + + public function __construct($className) + { + $this->loggerName = $className; + $this->initialize(); + } + + public function initialize() + { + $config = PayPalConfigManager::getInstance()->getConfigHashmap(); if (!empty($config)) { - $this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log'); - $loggingLevel = strtoupper($config['log.LogLevel']); - $this->loggingLevel = - (isset($loggingLevel) && defined(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel")) ? - constant(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel") : - PayPalLoggingManager::DEFAULT_LOGGING_LEVEL; + $this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1'); + if ($this->isLoggingEnabled) { + $this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log'); + $loggingLevel = strtoupper($config['log.LogLevel']); + $this->loggingLevel = (isset($loggingLevel) && defined("\\Psr\\Log\\LogLevel::$loggingLevel")) ? + constant("\\Psr\\Log\\LogLevel::$loggingLevel") : + LogLevel::INFO; + } } } - public function emergency($message, array $context = array()) - { - $this->error($message, $context); - } - - public function alert($message, array $context = array()) - { - $this->error($message, $context); - } - - public function critical($message, array $context = array()) - { - $this->error($message, $context); - } - - public function error($message, array $context = array()) - { - $this->initialize(); - error_log("[" . date('d-m-Y h:i:s') . "] ERROR: $message\n", 3, $this->loggerFile); - } - - public function warning($message, array $context = array()) - { - $this->initialize(); - error_log("[" . date('d-m-Y h:i:s') . "] WARNING: $message\n", 3, $this->loggerFile); - } - - public function notice($message, array $context = array()) - { - $this->initialize(); - error_log("[" . date('d-m-Y h:i:s') . "] NOTICE: $message\n", 3, $this->loggerFile); - } - - public function info($message, array $context = array()) - { - $this->initialize(); - error_log("[" . date('d-m-Y h:i:s') . "] INFO: $message\n", 3, $this->loggerFile); - } - - public function debug($message, array $context = array()) - { - $this->initialize(); - error_log("[" . date('d-m-Y h:i:s') . "] DEBUG: $message\n", 3, $this->loggerFile); - } - public function log($level, $message, array $context = array()) { - $this->debug($message, $context); + if($this->isLoggingEnabled) { + // Checks if the message is at level below configured logging level + if (array_search($level, $this->loggingLevels) <= array_search($this->loggingLevel, $this->loggingLevels)) { + error_log("[" . date('d-m-Y h:i:s') . "] " . $this->loggerName . " : " . strtoupper($level) . ": $message\n", 3, $this->loggerFile); + } + } } } \ No newline at end of file diff --git a/sample/bootstrap.php b/sample/bootstrap.php index c85fb47..e2a23bb 100644 --- a/sample/bootstrap.php +++ b/sample/bootstrap.php @@ -86,11 +86,11 @@ function getApiContext($clientId, $clientSecret) 'mode' => 'sandbox', 'log.LogEnabled' => true, 'log.FileName' => '../PayPal.log', - 'log.LogLevel' => 'DEBUG', // PLEASE USE `FINE` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS + 'log.LogLevel' => 'DEBUG', // PLEASE USE `INFO` LEVEL FOR LOGGING IN LIVE ENVIRONMENTS 'cache.enabled' => true, // 'http.CURLOPT_CONNECTTIMEOUT' => 30 // 'http.headers.PayPal-Partner-Attribution-Id' => '123123123' - // 'log.Adapter' => '\Your\Custom\Logger' // Class name of the logger to be used. Must be implementing Psr\Log\LoggerInterface + //'log.AdapterFactory' => '\PayPal\Log\DefaultLogFactory' // Factory class implementing \PayPal\Log\PayPalLogFactory ) ); diff --git a/sample/sdk_config.ini b/sample/sdk_config.ini index bec2fc3..4eddc46 100644 --- a/sample/sdk_config.ini +++ b/sample/sdk_config.ini @@ -25,22 +25,27 @@ mode = sandbox ;Logging Information [Log] +; For custom logging implementation, you can set the +; logging factory provider class here. +; The class should be implementing \PayPal\Log\PayPalLogFactory. +; If this is not set, it will default to \PayPal\Log\PayPalDefaultLogFactory. +;log.AdapterFactory=\PayPal\Log\PayPalDefaultLogFactory + +; Settings for PayPalDefaultLogFactory log.LogEnabled=true ; When using a relative path, the log file is created ; relative to the .php file that is the entry point ; for this request. You can also provide an absolute ; path here +; Settings for PayPalDefaultLogFactory log.FileName=../PayPal.log -; Logging level can be one of -; Sandbox Environments: DEBUG, INFO, WARN, ERROR -; Live Environments: INFO, WARN, ERROR +; Logging level can be one of any provided at \Psr\Log\LogLevel ; Logging is most verbose in the 'DEBUG' level and ; decreases as you proceed towards ERROR ; DEBUG level is disabled for live, to not log sensitive information. -; If the level is set to DEBUG, it will be reduced to FINE automatically, -; with a warning message +; If the level is set to DEBUG, it will be reduced to INFO automatically log.LogLevel=INFO ;Caching Configuration