|
|
|
|
@ -28,6 +28,7 @@ |
|
|
|
|
namespace OC; |
|
|
|
|
|
|
|
|
|
use \OCP\ILogger; |
|
|
|
|
use OCP\Security\StringUtils; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* logging utilities |
|
|
|
|
@ -41,15 +42,29 @@ use \OCP\ILogger; |
|
|
|
|
|
|
|
|
|
class Log implements ILogger { |
|
|
|
|
|
|
|
|
|
/** @var string */ |
|
|
|
|
private $logger; |
|
|
|
|
/** @var SystemConfig */ |
|
|
|
|
private $config; |
|
|
|
|
|
|
|
|
|
/** @var boolean|null cache the result of the log condition check for the request */ |
|
|
|
|
private $logConditionSatisfied = null; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* @param string $logger The logger that should be used |
|
|
|
|
* @param SystemConfig $config the system config object |
|
|
|
|
*/ |
|
|
|
|
public function __construct($logger=null) { |
|
|
|
|
public function __construct($logger=null, SystemConfig $config=null) { |
|
|
|
|
// FIXME: Add this for backwards compatibility, should be fixed at some point probably |
|
|
|
|
if($config === null) { |
|
|
|
|
$config = \OC::$server->getSystemConfig(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
$this->config = $config; |
|
|
|
|
|
|
|
|
|
// FIXME: Add this for backwards compatibility, should be fixed at some point probably |
|
|
|
|
if($logger === null) { |
|
|
|
|
$this->logger = 'OC_Log_'.ucfirst(\OC_Config::getValue('log_type', 'owncloud')); |
|
|
|
|
$this->logger = 'OC_Log_'.ucfirst($this->config->getValue('log_type', 'owncloud')); |
|
|
|
|
call_user_func(array($this->logger, 'init')); |
|
|
|
|
} else { |
|
|
|
|
$this->logger = $logger; |
|
|
|
|
@ -158,8 +173,22 @@ class Log implements ILogger { |
|
|
|
|
* @param array $context |
|
|
|
|
*/ |
|
|
|
|
public function log($level, $message, array $context = array()) { |
|
|
|
|
$minLevel = min($this->config->getValue('loglevel', \OC_Log::WARN), \OC_Log::ERROR); |
|
|
|
|
$logCondition = $this->config->getValue('log.condition', []); |
|
|
|
|
|
|
|
|
|
if (isset($context['app'])) { |
|
|
|
|
$app = $context['app']; |
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
* check log condition based on the context of each log message |
|
|
|
|
* once this is met -> change the required log level to debug |
|
|
|
|
*/ |
|
|
|
|
if(!empty($logCondition) |
|
|
|
|
&& isset($logCondition['apps']) |
|
|
|
|
&& in_array($app, $logCondition['apps'], true)) { |
|
|
|
|
$minLevel = \OC_Log::DEBUG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} else { |
|
|
|
|
$app = 'no app in context'; |
|
|
|
|
} |
|
|
|
|
@ -172,7 +201,45 @@ class Log implements ILogger { |
|
|
|
|
// interpolate replacement values into the message and return |
|
|
|
|
$message = strtr($message, $replace); |
|
|
|
|
|
|
|
|
|
$logger = $this->logger; |
|
|
|
|
call_user_func(array($logger, 'write'), $app, $message, $level); |
|
|
|
|
/** |
|
|
|
|
* check for a special log condition - this enables an increased log on |
|
|
|
|
* a per request/user base |
|
|
|
|
*/ |
|
|
|
|
if($this->logConditionSatisfied === null) { |
|
|
|
|
// default to false to just process this once per request |
|
|
|
|
$this->logConditionSatisfied = false; |
|
|
|
|
if(!empty($logCondition)) { |
|
|
|
|
|
|
|
|
|
// check for secret token in the request |
|
|
|
|
if(isset($logCondition['shared_secret'])) { |
|
|
|
|
$request = \OC::$server->getRequest(); |
|
|
|
|
|
|
|
|
|
// if token is found in the request change set the log condition to satisfied |
|
|
|
|
if($request && StringUtils::equals($request->getParam('log_secret'), $logCondition['shared_secret'])) { |
|
|
|
|
$this->logConditionSatisfied = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// check for user |
|
|
|
|
if(isset($logCondition['users'])) { |
|
|
|
|
$user = \OC::$server->getUserSession()->getUser(); |
|
|
|
|
|
|
|
|
|
// if the user matches set the log condition to satisfied |
|
|
|
|
if($user !== null && in_array($user->getUID(), $logCondition['users'], true)) { |
|
|
|
|
$this->logConditionSatisfied = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// if log condition is satisfied change the required log level to DEBUG |
|
|
|
|
if($this->logConditionSatisfied) { |
|
|
|
|
$minLevel = \OC_Log::DEBUG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($level >= $minLevel) { |
|
|
|
|
$logger = $this->logger; |
|
|
|
|
call_user_func(array($logger, 'write'), $app, $message, $level); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|