19 private static $loggingHandler = null;
24 private static $logLevel = null;
29 private static $captureLog =
false;
34 private static $capturedLog = array();
41 private static $earlyLog = array();
50 private static $logLevelStack = array();
59 private static $logMask = 0;
66 const NO_TRACKID =
'_NOTRACKIDYET_';
72 private static $trackid = self::NO_TRACKID;
102 private static $format =
'%date{%b %d %H:%M:%S} %process %level %stat[%trackid] %msg';
109 private static $shutdownRegistered =
false;
116 private static $shuttingDown =
false;
135 self::log(self::EMERG, $string);
146 self::log(self::CRIT, $string);
155 public static function alert($string)
157 self::log(self::ALERT, $string);
166 public static function error($string)
168 self::log(self::ERR, $string);
179 self::log(self::WARNING, $string);
190 self::log(self::NOTICE, $string);
199 public static function info($string)
201 self::log(self::INFO, $string);
211 public static function debug($string)
222 public static function stats($string)
224 self::log(self::NOTICE, $string,
true);
235 self::$captureLog = $val;
244 return self::$capturedLog;
255 self::$trackid = $trackId;
272 self::error(
'Cannot load or create session: '.$e->getMessage());
275 self::$trackid =
$s->getTrackID();
277 self::$shuttingDown =
true;
278 foreach (self::$earlyLog as $msg) {
279 self::log($msg[
'level'], $msg[
'string'], $msg[
'statsLog']);
293 return ($errno & self::$logMask) || !($errno & error_reporting());
306 assert(is_int(
$mask));
308 $currentEnabled = error_reporting();
309 self::$logLevelStack[] = array($currentEnabled, self::$logMask);
311 $currentEnabled &= ~
$mask;
312 error_reporting($currentEnabled);
313 self::$logMask |=
$mask;
324 $lastMask = array_pop(self::$logLevelStack);
325 error_reporting($lastMask[0]);
326 self::$logMask = $lastMask[1];
340 self::$earlyLog[] = array(
'level' => $level,
'string' =>
$message,
'statsLog' =>
$stats);
343 if (!self::$shutdownRegistered) {
344 register_shutdown_function(array(
'SimpleSAML\Logger',
'flush'));
345 self::$shutdownRegistered =
true;
353 self::$loggingHandler =
false;
356 $known_handlers = array(
357 'syslog' =>
'SimpleSAML\Logger\SyslogLoggingHandler',
358 'file' =>
'SimpleSAML\Logger\FileLoggingHandler',
359 'errorlog' =>
'SimpleSAML\Logger\ErrorLogLoggingHandler',
367 self::$logLevel =
$config->getInteger(
'logging.level', self::INFO);
374 if (!array_key_exists(
$handler, $known_handlers) && class_exists(
$handler)) {
375 if (!in_array(
'SimpleSAML\Logger\LoggingHandlerInterface', class_implements(
$handler),
true)) {
376 throw new \Exception(
"The logging handler '$handler' is invalid.");
380 if (!array_key_exists(
$handler, $known_handlers)) {
381 throw new \Exception(
382 "Invalid value for the 'logging.handler' configuration option. Unknown handler '".
$handler.
"''." 394 private static function log($level, $string, $statsLog =
false)
396 if (self::$loggingHandler ===
false) {
398 self::defer($level, $string, $statsLog);
400 } elseif (php_sapi_name() ===
'cli' || defined(
'STDIN')) {
402 if (is_null(self::$loggingHandler)) {
403 self::createLoggingHandler(
'SimpleSAML\Logger\StandardErrorLoggingHandler');
406 if (self::$trackid === self::NO_TRACKID) {
407 self::$trackid =
'CL'.bin2hex(openssl_random_pseudo_bytes(4));
409 } elseif (self::$loggingHandler === null) {
411 self::createLoggingHandler();
413 if (!empty(self::$earlyLog)) {
415 foreach (self::$earlyLog as $msg) {
416 self::log($msg[
'level'], $msg[
'string'], $msg[
'statsLog']);
421 if (self::$captureLog) {
422 $ts = microtime(
true);
423 $msecs = (int) (($ts - (
int) $ts) * 1000);
424 $ts = gmdate(
'H:i:s', $ts).sprintf(
'.%03d', $msecs).
'Z';
425 self::$capturedLog[] = $ts.
' '.$string;
428 if (self::$logLevel >= $level || $statsLog) {
429 if (is_array($string)) {
430 $string = implode(
",", $string);
433 $formats = array(
'%trackid',
'%msg',
'%srcip',
'%stat');
434 $replacements = array(self::$trackid, $string,
$_SERVER[
'REMOTE_ADDR']);
440 array_push($replacements, $stat);
442 if (self::$trackid === self::NO_TRACKID && !self::$shuttingDown) {
444 self::defer($level, $string, $statsLog);
446 } elseif (self::$trackid === self::NO_TRACKID) {
448 array_shift($replacements);
449 array_unshift($replacements,
'N/A');
454 self::$loggingHandler->log($level, $string);
if((!isset($_SERVER['DOCUMENT_ROOT'])) OR(empty($_SERVER['DOCUMENT_ROOT']))) $_SERVER['DOCUMENT_ROOT']
static popErrorMask()
Pop an error mask.
static createLoggingHandler($handler=null)
static flush()
Flush any pending log messages to the logging handler.
static setCaptureLog($val=true)
static setTrackId($trackId)
Set the track identifier to use in all logs.
Attribute-related utility methods.
catch(Exception $e) $message
static getCapturedLog()
Get the captured log.
static defer($level, $message, $stats)
Defer a message for later logging.
static maskErrors($mask)
Disable error reporting for the given log levels.
static emergency($string)
static isErrorMasked($errno)
Evaluate whether errors of a certain error level are masked or not.
static getSessionFromRequest()
Retrieves the current session.
static getInstance($instancename='simplesaml')
Get a configuration file by its instance name.
static log($level, $string, $statsLog=false)