log_directory = self::pathWithSlash($directory);
}
function setDumpFormat($format) {
if (!in_array($format, self::$allowed_dump_formats))
throw new \InvalidArgumentException(sprintf('', $format));
$this->dump_format = $format;
}
function setFormat($format) {
$this->format = (string)$format;
}
function getFormat() {
return $this->format;
}
function getLevel() {
return $this->level;
}
function getLevelName() {
return self::$level_names[$this->level];
}
function setLevel($level) {
if (is_string($level)) {
$level = strtoupper($level);
if (!defined('self::'.$level))
throw new \InvalidArgumentException(sprintf('Invalid debug level %s.', $level));
$level = constant('self::'.$level);
}
if ($level < self::CRITICAL || $level > self::DEBUG)
throw new \InvalidArgumentException(sprintf('Invalid debug level %d.', $level));
$this->level = $level;
}
function setProperty($name, $value) {
$this->properties[$name] = (string)$value;
}
function critical($message) {
$this->process($message, self::CRITICAL);
}
function error($message) {
$this->process($message, self::ERROR);
}
function warning($message) {
$this->process($message, self::WARNING);
}
function info($message) {
$this->process($message, self::INFO);
}
function debug($message) {
$this->process($message, self::DEBUG);
}
/**
* Alias for 'debug', used by PHPActiveRecord.
* @codeCoverageIgnore
*/
function log($message) {
$this->debug($message);
}
private function process($message, $level) {
if ($level <= $this->level)
$this->output[] = array($message, $level);
}
function dumps() {
$logger = $this;
$output = '';
foreach ($this->output as $i => $tuple) {
list($message, $level) = $tuple;
$i && $output .= "\n";
$output .= preg_replace_callback(
'/%\(([a-z-_ ]*)\)/i',
function($matches) use ($logger, $message, $level) {
$name = $matches[1];
if ($name == 'message')
return $message;
if ($name == 'level')
return Logger::$level_names[$level];
return $logger->getFormattedProperty($matches[1]);
},
$this->format
);
}
return $output;
}
function dump($file_prefix='log') {
switch ($this->dump_format) {
case 'none':
return;
case 'plain':
echo $this->dumps();
break;
case 'html':
echo 'Log:
';
echo '
' . $this->dumps() . ''; break; case 'file': $this->save(sprintf('%s_%s.log', $file_prefix, strftime('%d-%m-%Y_%H-%M-%S'))); } } function clear() { $this->output = array(); } function save($path) { if ($this->log_directory && !is_dir($this->log_directory)) mkdir($this->log_directory, 0777, true); file_put_contents($this->log_directory . $path, $this->dumps()); } function handleException(\Exception $e) { if( $e === null ) return; $message = sprintf("Uncaught %s in file %s, line %d: %s\n\n%s", get_class($e), $e->getFile(), $e->getLine(), $e->getMessage(), $e->getTraceAsString()); $this->critical($message); $this->dump('error'); } function setAsExceptionHandler() { set_exception_handler(array($this, 'handleException')); } function getFormattedProperty($property) { if (isset($this->properties[$property])) return $this->properties[$property]; switch( $property ) { case 'loglevel': return $this->getLevelName(); case 'date': return strftime('%d-%m-%Y'); case 'time': return strftime('%H:%M:%S'); case 'datetime': return strftime('%d-%m-%Y %H:%M:%S'); } throw new \InvalidArgumentException(sprintf('Invalid logging property "%s".', $property)); } } ?>