@ -28,6 +28,7 @@
namespace OC ;
namespace OC ;
use \OCP\ILogger ;
use \OCP\ILogger ;
use OCP\Security\StringUtils ;
/**
/**
* logging utilities
* logging utilities
@ -41,15 +42,29 @@ use \OCP\ILogger;
class Log implements ILogger {
class Log implements ILogger {
/** @var string */
private $logger ;
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 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
// FIXME: Add this for backwards compatibility, should be fixed at some point probably
if ( $logger === null ) {
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' ));
call_user_func ( array ( $this -> logger , 'init' ));
} else {
} else {
$this -> logger = $logger ;
$this -> logger = $logger ;
@ -158,8 +173,22 @@ class Log implements ILogger {
* @ param array $context
* @ param array $context
*/
*/
public function log ( $level , $message , array $context = array ()) {
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' ])) {
if ( isset ( $context [ 'app' ])) {
$app = $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 {
} else {
$app = 'no app in context' ;
$app = 'no app in context' ;
}
}
@ -172,9 +201,41 @@ class Log implements ILogger {
// interpolate replacement values into the message and return
// interpolate replacement values into the message and return
$message = strtr ( $message , $replace );
$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 ) {
if ( $level >= $minLevel ) {
$logger = $this -> logger ;
$logger = $this -> logger ;