Changeset View
Changeset View
Standalone View
Standalone View
core/kernel/utility/logger.php
Show First 20 Lines • Show All 707 Lines • ▼ Show 20 Line(s) | |||||
$this->_logRecord['LogLevel'] = $log_level; | $this->_logRecord['LogLevel'] = $log_level; | ||||
return $this; | return $this; | ||||
} | } | ||||
/** | /** | ||||
* Writes prepared log to database or disk, when database isn't available | * Writes prepared log to database or disk, when database isn't available | ||||
* | * | ||||
* @param int $storage_medium | * @param integer $storage_medium Storage medium. | ||||
* @return bool|int | * @param boolean $check_origin Check error origin. | ||||
* @access public | * | ||||
* @throws InvalidArgumentException | * @return integer|boolean | ||||
* @throws InvalidArgumentException When unknown storage medium is given. | |||||
*/ | */ | ||||
public function write($storage_medium = self::LS_AUTOMATIC) | public function write($storage_medium = self::LS_AUTOMATIC, $check_origin = false) | ||||
{ | { | ||||
if ( !$this->_logRecord || $this->_logRecord['LogLevel'] > $this->_maxLogLevel || $this->_state == self::STATE_DISABLED ) { | if ( $check_origin && isset($this->_logRecord['LogSourceFilename']) ) { | ||||
// nothing to save OR less detailed logging requested OR disabled | $origin_allowed = self::isErrorOriginAllowed($this->_logRecord['LogSourceFilename']); | ||||
} | |||||
else { | |||||
$origin_allowed = true; | |||||
} | |||||
if ( !$this->_logRecord | |||||
|| $this->_logRecord['LogLevel'] > $this->_maxLogLevel | |||||
|| !$origin_allowed | |||||
|| $this->_state == self::STATE_DISABLED | |||||
) { | |||||
// Nothing to save OR less detailed logging requested OR origin not allowed OR disabled. | |||||
$this->_logRecord = array(); | |||||
alex: We should additionally check that `LogSourceFilename` key exists in the `$this->_logRecord`… | |||||
return true; | return true; | ||||
} | } | ||||
$this->_logRecord['LogMemoryUsed'] = memory_get_usage(); | $this->_logRecord['LogMemoryUsed'] = memory_get_usage(); | ||||
$this->_logRecord['LogTimestamp'] = adodb_mktime(); | $this->_logRecord['LogTimestamp'] = adodb_mktime(); | ||||
$this->_logRecord['LogDate'] = adodb_date('Y-m-d H:i:s'); | $this->_logRecord['LogDate'] = adodb_date('Y-m-d H:i:s'); | ||||
if ( $storage_medium == self::LS_AUTOMATIC ) { | if ( $storage_medium == self::LS_AUTOMATIC ) { | ||||
▲ Show 20 Lines • Show All 260 Lines • ▼ Show 20 Line(s) | |||||
} | } | ||||
} | } | ||||
} | } | ||||
return $message; | return $message; | ||||
} | } | ||||
/** | /** | ||||
* Determines if error should be logged based on it's origin. | |||||
* | |||||
* @param string $file File. | |||||
* | |||||
* @return boolean | |||||
*/ | |||||
public static function isErrorOriginAllowed($file) | |||||
{ | |||||
static $error_origin_regexp; | |||||
// Lazy detect error origins, because they're not available at construction time. | |||||
if ( !$error_origin_regexp ) { | |||||
$error_origins = array(); | |||||
$application = kApplication::Instance(); | |||||
foreach ( $application->ModuleInfo as $module_info ) { | |||||
$error_origins[] = preg_quote(rtrim($module_info['Path'], '/'), '/'); | |||||
} | |||||
$error_origins = array_unique($error_origins); | |||||
$error_origin_regexp = '/^' . preg_quote(FULL_PATH, '/') . '\/(' . implode('|', $error_origins) . ')\//'; | |||||
} | |||||
// Allow dynamically generated code. | |||||
if ( strpos($file, 'eval()\'d code') !== false ) { | |||||
return true; | |||||
} | |||||
// Allow known modules. | |||||
if ( preg_match('/^' . preg_quote(MODULES_PATH, '/') . '\//', $file) ) { | |||||
return preg_match($error_origin_regexp, $file) == 1; | |||||
} | |||||
// Don't allow Vendors. | |||||
if ( preg_match('/^' . preg_quote(FULL_PATH, '/') . '\/vendor\//', $file) ) { | |||||
return false; | |||||
} | |||||
// Allow everything else within main folder. | |||||
return preg_match('/^' . preg_quote(FULL_PATH, '/') . '\//', $file) == 1; | |||||
} | |||||
/** | |||||
* Parses database error message into error number, error message and sql that caused that error | * Parses database error message into error number, error message and sql that caused that error | ||||
* | * | ||||
* @static | * @static | ||||
* @param string $message | * @param string $message | ||||
* @return Array | * @return Array | ||||
* @access public | * @access public | ||||
*/ | */ | ||||
public static function parseDatabaseError($message) | public static function parseDatabaseError($message) | ||||
▲ Show 20 Lines • Show All 228 Lines • ▼ Show 20 Line(s) | |||||
$log = $this->_logger->prepare()->addError($errno, $errstr, $errfile, $errline); | $log = $this->_logger->prepare()->addError($errno, $errstr, $errfile, $errline); | ||||
if ( $this->_handleFatalError($errno) ) { | if ( $this->_handleFatalError($errno) ) { | ||||
$log->write(); | $log->write(); | ||||
return true; | return true; | ||||
} | } | ||||
$log->write(); | $log->write(kLogger::LS_AUTOMATIC, true); | ||||
$res = false; | $res = false; | ||||
foreach ($this->_handlers as $handler) { | foreach ($this->_handlers as $handler) { | ||||
$res = call_user_func($handler, $errno, $errstr, $errfile, $errline, $errcontext); | $res = call_user_func($handler, $errno, $errstr, $errfile, $errline, $errcontext); | ||||
} | } | ||||
return $res; | return $res; | ||||
▲ Show 20 Lines • Show All 93 Lines • Show Last 20 Lines |
We should additionally check that LogSourceFilename key exists in the $this->_logRecord array.