Enabled Factory to Inject Logger

This commit is contained in:
Jay Patel
2016-04-11 15:45:49 -05:00
parent 557fb3718f
commit c0c307f267
8 changed files with 143 additions and 176 deletions

View File

@@ -33,13 +33,6 @@ class OAuthTokenCredential extends PayPalResourceModel
*/ */
private static $expiryBufferTime = 120; private static $expiryBufferTime = 120;
/**
* Private Variable
*
* @var \PayPal\Core\PayPalLoggingManager $logger
*/
private $logger;
/** /**
* Client ID as obtained from the developer portal * Client ID as obtained from the developer portal
* *
@@ -93,7 +86,6 @@ class OAuthTokenCredential extends PayPalResourceModel
$this->clientId = $clientId; $this->clientId = $clientId;
$this->clientSecret = $clientSecret; $this->clientSecret = $clientSecret;
$this->cipher = new Cipher($this->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"])) { if ($response == null || !isset($response["access_token"]) || !isset($response["expires_in"])) {
$this->accessToken = null; $this->accessToken = null;
$this->tokenExpiresIn = null; $this->tokenExpiresIn = null;
$this->logger->warning( PayPalLoggingManager::getInstance(__CLASS__)->warning("Could not generate new Access token. Invalid response from server: ");
"Could not generate new Access token. Invalid response from server: "
);
throw new PayPalConnectionException(null, "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 { } else {
$this->accessToken = $response["access_token"]; $this->accessToken = $response["access_token"];

View File

@@ -1,26 +0,0 @@
<?php
namespace PayPal\Core;
/**
* Logging Levels.
* Class containing all the constants for Logging Levels.
*/
class PayPalLoggingLevel
{
// DEBUG Logging Level
const DEBUG = 4;
// FINE Logging Level
const FINE = 3;
// INFO Logging Level
const INFO = 2;
// WARN Logging Level
const WARN = 1;
// ERROR Logging Level
const ERROR = 0;
}

View File

@@ -1,7 +1,8 @@
<?php <?php
namespace PayPal\Core; namespace PayPal\Core;
use PayPal\Log\PayPalLogger;
use PayPal\Log\PayPalLogFactory;
use Psr\Log\LoggerInterface; use Psr\Log\LoggerInterface;
/** /**
@@ -11,32 +12,10 @@ use Psr\Log\LoggerInterface;
*/ */
class PayPalLoggingManager class PayPalLoggingManager
{ {
/** /**
* Default Logging Level * @var array of logging manager instances with class name as key
*/ */
const DEFAULT_LOGGING_LEVEL = 0; private static $instances = array();
/**
* Logger Name
* @var string
*/
private $loggerName;
/**
* Log Enabled
*
* @var bool
*/
private $isLoggingEnabled;
/**
* Configured Logging Level
*
* @var int|mixed
*/
private $loggingLevel;
/** /**
* The logger to be used for all messages * The logger to be used for all messages
@@ -45,6 +24,13 @@ class PayPalLoggingManager
*/ */
private $logger; private $logger;
/**
* Logger Name
*
* @var string
*/
private $loggerName;
/** /**
* Returns the singleton object * Returns the singleton object
* *
@@ -53,45 +39,32 @@ class PayPalLoggingManager
*/ */
public static function getInstance($loggerName = __CLASS__) public static function getInstance($loggerName = __CLASS__)
{ {
$instance = new self(); if (array_key_exists($loggerName, PayPalLoggingManager::$instances)) {
$instance->setLoggerName($loggerName); return PayPalLoggingManager::$instances[$loggerName];
}
$instance = new self($loggerName);
PayPalLoggingManager::$instances[$loggerName] = $instance;
return $instance; return $instance;
} }
/**
* Sets Logger Name. Generally defaulted to Logging Class
*
* @param string $loggerName
*/
public function setLoggerName($loggerName = __CLASS__)
{
$this->loggerName = $loggerName;
}
/** /**
* Default Constructor * Default Constructor
*
* @param string $loggerName Generally represents the class name.
*/ */
public function __construct() private function __construct($loggerName)
{ {
$config = PayPalConfigManager::getInstance()->getConfigHashmap(); $config = PayPalConfigManager::getInstance()->getConfigHashmap();
$this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1'); if (!empty($config)) {
if ($this->isLoggingEnabled) { // Checks if custom factory defined, and is it an implementation of @PayPalLogFactory
$loggingLevel = strtoupper($config['log.LogLevel']); $factory = array_key_exists('log.AdapterFactory', $config) && in_array('PayPal\Log\PayPalLogFactory', class_implements($config['log.AdapterFactory'])) ? $config['log.AdapterFactory'] : '\PayPal\Log\PayPalDefaultLogFactory';
$this->setupLogger($config); /** @var PayPalLogFactory $factoryInstance */
$this->loggingLevel = $factoryInstance = new $factory();
(isset($loggingLevel) && defined(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel")) ? $this->logger = $factoryInstance->getLogger($loggerName);
constant(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel") : $this->loggerName = $loggerName;
PayPalLoggingManager::DEFAULT_LOGGING_LEVEL;
} }
} }
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 * Log Error
* *
@@ -99,9 +72,7 @@ class PayPalLoggingManager
*/ */
public function error($message) 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) 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) 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 * @param string $message
*/ */
public function debug($message) public function debug($message)
{ {
if ($this->isLoggingEnabled) { $config = PayPalConfigManager::getInstance()->getConfigHashmap();
$config = PayPalConfigManager::getInstance()->getConfigHashmap(); // Disable debug in live mode.
// Check if logging in live if (array_key_exists('mode', $config) && $config['mode'] != 'live') {
if (array_key_exists('mode', $config) && $config['mode'] == 'live' && $this->loggingLevel >= PayPalLoggingLevel::DEBUG) { $this->logger->debug($message);
$this->logger->error("Not allowed to keep 'Debug' level for Live Environments. Reduced to 'INFO'");
} elseif (PayPalLoggingLevel::DEBUG <= $this->loggingLevel) {
$this->logger->debug($message);
}
} }
} }

View File

@@ -0,0 +1,26 @@
<?php
namespace PayPal\Log;
use Psr\Log\LoggerInterface;
/**
* Class PayPalDefaultLogFactory
*
* This factory is the default implementation of Log factory.
*
* @package PayPal\Log
*/
class PayPalDefaultLogFactory implements PayPalLogFactory
{
/**
* Returns logger instance implementing LoggerInterface.
*
* @param string $className
* @return LoggerInterface instance of logger object implementing LoggerInterface
*/
public function getLogger($className)
{
return new PayPalLogger($className);
}
}

View File

@@ -0,0 +1,17 @@
<?php
namespace PayPal\Log;
use Psr\Log\LoggerInterface;
interface PayPalLogFactory
{
/**
* Returns logger instance implementing LoggerInterface.
*
* @param string $className
* @return LoggerInterface instance of logger object implementing LoggerInterface
*/
public function getLogger($className);
}

View File

@@ -3,21 +3,31 @@
namespace PayPal\Log; namespace PayPal\Log;
use PayPal\Core\PayPalConfigManager; use PayPal\Core\PayPalConfigManager;
use PayPal\Core\PayPalLoggingManager; use Psr\Log\AbstractLogger;
use Psr\Log\LoggerInterface; use Psr\Log\LogLevel;
class PayPalLogger implements LoggerInterface { class PayPalLogger extends AbstractLogger
{
/** /**
* Default Logging Level * @var array Indexed list of all log levels.
*/ */
const DEFAULT_LOGGING_LEVEL = 0; private $loggingLevels = array(
LogLevel::EMERGENCY,
LogLevel::ALERT,
LogLevel::CRITICAL,
LogLevel::ERROR,
LogLevel::WARNING,
LogLevel::NOTICE,
LogLevel::INFO,
LogLevel::DEBUG
);
/** /**
* Configured Logging Level * Configured Logging Level
* *
* @var int|mixed * @var LogLevel $loggingLevel
*/ */
private $loggingLevel; private $loggingLevel;
@@ -28,65 +38,48 @@ class PayPalLogger implements LoggerInterface {
*/ */
private $loggerFile; private $loggerFile;
public function initialize() { /**
$config = PayPalConfigManager::getInstance()->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)) { if (!empty($config)) {
$this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log'); $this->isLoggingEnabled = (array_key_exists('log.LogEnabled', $config) && $config['log.LogEnabled'] == '1');
$loggingLevel = strtoupper($config['log.LogLevel']); if ($this->isLoggingEnabled) {
$this->loggingLevel = $this->loggerFile = ($config['log.FileName']) ? $config['log.FileName'] : ini_get('error_log');
(isset($loggingLevel) && defined(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel")) ? $loggingLevel = strtoupper($config['log.LogLevel']);
constant(__NAMESPACE__ . "\\PayPalLoggingLevel::$loggingLevel") : $this->loggingLevel = (isset($loggingLevel) && defined("\\Psr\\Log\\LogLevel::$loggingLevel")) ?
PayPalLoggingManager::DEFAULT_LOGGING_LEVEL; 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()) 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);
}
}
} }
} }

View File

@@ -86,11 +86,11 @@ function getApiContext($clientId, $clientSecret)
'mode' => 'sandbox', 'mode' => 'sandbox',
'log.LogEnabled' => true, 'log.LogEnabled' => true,
'log.FileName' => '../PayPal.log', '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, 'cache.enabled' => true,
// 'http.CURLOPT_CONNECTTIMEOUT' => 30 // 'http.CURLOPT_CONNECTTIMEOUT' => 30
// 'http.headers.PayPal-Partner-Attribution-Id' => '123123123' // '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
) )
); );

View File

@@ -25,22 +25,27 @@ mode = sandbox
;Logging Information ;Logging Information
[Log] [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 log.LogEnabled=true
; When using a relative path, the log file is created ; When using a relative path, the log file is created
; relative to the .php file that is the entry point ; relative to the .php file that is the entry point
; for this request. You can also provide an absolute ; for this request. You can also provide an absolute
; path here ; path here
; Settings for PayPalDefaultLogFactory
log.FileName=../PayPal.log log.FileName=../PayPal.log
; Logging level can be one of ; Logging level can be one of any provided at \Psr\Log\LogLevel
; Sandbox Environments: DEBUG, INFO, WARN, ERROR
; Live Environments: INFO, WARN, ERROR
; Logging is most verbose in the 'DEBUG' level and ; Logging is most verbose in the 'DEBUG' level and
; decreases as you proceed towards ERROR ; decreases as you proceed towards ERROR
; DEBUG level is disabled for live, to not log sensitive information. ; 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, ; If the level is set to DEBUG, it will be reduced to INFO automatically
; with a warning message
log.LogLevel=INFO log.LogLevel=INFO
;Caching Configuration ;Caching Configuration