summaryrefslogtreecommitdiffstats
path: root/lib/private/log.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/log.php')
-rw-r--r--lib/private/log.php69
1 files changed, 65 insertions, 4 deletions
diff --git a/lib/private/log.php b/lib/private/log.php
index 2f15bec433f..840713b2eda 100644
--- a/lib/private/log.php
+++ b/lib/private/log.php
@@ -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,9 +201,41 @@ class Log implements ILogger {
// interpolate replacement values into the message and return
$message = strtr($message, $replace);
- $config = \OC::$server->getSystemConfig();
+ /**
+ * 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;
+ }
+ }
+ }
+ }
- $minLevel = min($config->getValue('loglevel', \OC_Log::WARN), \OC_Log::ERROR);
+ // 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;