Index: /lib/PayPal/Log/PayPalDefaultLogFactory.php
===================================================================
--- /lib/PayPal/Log/PayPalDefaultLogFactory.php	(revision 7272)
+++ /lib/PayPal/Log/PayPalDefaultLogFactory.php	(revision 7272)
@@ -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);
+    }
+}
Index: /lib/PayPal/Log/PayPalLogFactory.php
===================================================================
--- /lib/PayPal/Log/PayPalLogFactory.php	(revision 7272)
+++ /lib/PayPal/Log/PayPalLogFactory.php	(revision 7272)
@@ -0,0 +1,16 @@
+<?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);
+}
Index: /lib/PayPal/Log/PayPalLogger.php
===================================================================
--- /lib/PayPal/Log/PayPalLogger.php	(revision 7272)
+++ /lib/PayPal/Log/PayPalLogger.php	(revision 7272)
@@ -0,0 +1,84 @@
+<?php
+
+namespace PayPal\Log;
+
+use PayPal\Core\PayPalConfigManager;
+use Psr\Log\AbstractLogger;
+use Psr\Log\LogLevel;
+
+class PayPalLogger extends AbstractLogger
+{
+
+    /**
+     * @var array Indexed list of all log levels.
+     */
+    private $loggingLevels = array(
+        LogLevel::EMERGENCY,
+        LogLevel::ALERT,
+        LogLevel::CRITICAL,
+        LogLevel::ERROR,
+        LogLevel::WARNING,
+        LogLevel::NOTICE,
+        LogLevel::INFO,
+        LogLevel::DEBUG
+    );
+
+    /**
+     * Configured Logging Level
+     *
+     * @var LogLevel $loggingLevel
+     */
+    private $loggingLevel;
+
+    /**
+     * Configured Logging File
+     *
+     * @var string
+     */
+    private $loggerFile;
+
+    /**
+     * 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->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 log($level, $message, array $context = array())
+    {
+        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);
+            }
+        }
+    }
+}
