|
|
|
|
@ -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);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|