You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

504 lines
13 KiB

<?php
/**
* log4php is a PHP port of the log4j java logging package.
*
* <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
* <p>Design, strategies and part of the methods documentation are developed by log4j team
* (Ceki G�lc� as log4j project founder and
* {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
*
* <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
* For more information, please see {@link http://www.vxr.it/log4php/}.</p>
*
* <p>This software is published under the terms of the LGPL License
* a copy of which has been included with this distribution in the LICENSE file.</p>
*
* @package log4php
* @subpackage helpers
*/
/**
* @ignore
*/
if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
/**
*/
require_once(LOG4PHP_DIR . '/LoggerLog.php');
/**
* Array for fast space padding
* Used by {@link LoggerPatternConverter::spacePad()}.
*/
$GLOBALS['log4php.LoggerPatternConverter.spaces'] = array(" ", " ", " ", " ", //1,2,4,8 spaces
" ", // 16 spaces
" " ); // 32 spaces
/**
* LoggerPatternConverter is an abstract class that provides the formatting
* functionality that derived classes need.
*
* <p>Conversion specifiers in a conversion patterns are parsed to
* individual PatternConverters. Each of which is responsible for
* converting a logging event in a converter specific manner.</p>
*
* @author VxR <vxr@vxr.it>
* @version $Revision: 1.1 $
* @package log4php
* @subpackage helpers
* @abstract
* @since 0.3
*/
class LoggerPatternConverter {
/**
* @var LoggerPatternConverter next converter in converter chain
*/
var $next = null;
var $min = -1;
var $max = 0x7FFFFFFF;
var $leftAlign = false;
/**
* Constructor
*
* @param LoggerFormattingInfo $fi
*/
function LoggerPatternConverter($fi = null)
{
if ($fi !== null) {
$this->min = $fi->min;
$this->max = $fi->max;
$this->leftAlign = $fi->leftAlign;
}
}
/**
* Derived pattern converters must override this method in order to
* convert conversion specifiers in the correct way.
*
* @param LoggerLoggingEvent $event
*/
function convert($event) {}
/**
* A template method for formatting in a converter specific way.
*
* @param string &$sbuf string buffer
* @param LoggerLoggingEvent $e
*/
function format(&$sbuf, $e)
{
LoggerLog::debug("LoggerPatternConverter::format() sbuf='$sbuf'");
$s = $this->convert($e);
LoggerLog::debug("LoggerPatternConverter::format() converted event is '$s'");
if($s == null or empty($s)) {
if(0 < $this->min)
$this->spacePad($sbuf, $this->min);
return;
}
$len = strlen($s);
if($len > $this->max) {
$sbuf .= substr($s , 0, ($len - $this->max));
} elseif($len < $this->min) {
if($this->leftAlign) {
$sbuf .= $s;
$this->spacePad($sbuf, ($this->min - $len));
} else {
$this->spacePad($sbuf, ($this->min - $len));
$sbuf .= $s;
}
} else {
$sbuf .= $s;
}
}
/**
* Fast space padding method.
*
* @param string &$sbuf string buffer
* @param integer $length pad length
*
* @todo reimplement using PHP string functions
*/
function spacePad(&$sbuf, $length)
{
LoggerLog::debug("LoggerPatternConverter::spacePad() sbuf='$sbuf' len='$length'");
while($length >= 32) {
$sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][5];
$length -= 32;
}
for($i = 4; $i >= 0; $i--) {
if(($length & (1<<$i)) != 0) {
$sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][$i];
}
}
// $sbuf = str_pad($sbuf, $length);
}
}
// ---------------------------------------------------------------------
// PatternConverters
// ---------------------------------------------------------------------
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerBasicPatternConverter extends LoggerPatternConverter {
/**
* @var integer
*/
var $type;
/**
* Constructor
*
* @param string $formattingInfo
* @param integer $type
*/
function LoggerBasicPatternConverter($formattingInfo, $type)
{
LoggerLog::debug("LoggerBasicPatternConverter::LoggerBasicPatternConverter() type='$type'");
$this->LoggerPatternConverter($formattingInfo);
$this->type = $type;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
switch($this->type) {
case LOG4PHP_LOGGER_PATTERN_PARSER_RELATIVE_TIME_CONVERTER:
$timeStamp = $event->getTimeStamp();
$startTime = LoggerLoggingEvent::getStartTime();
return (string)(int)($timeStamp * 1000 - $startTime * 1000);
case LOG4PHP_LOGGER_PATTERN_PARSER_THREAD_CONVERTER:
return $event->getThreadName();
case LOG4PHP_LOGGER_PATTERN_PARSER_LEVEL_CONVERTER:
$level = $event->getLevel();
return $level->toString();
case LOG4PHP_LOGGER_PATTERN_PARSER_NDC_CONVERTER:
return $event->getNDC();
case LOG4PHP_LOGGER_PATTERN_PARSER_MESSAGE_CONVERTER:
return $event->getRenderedMessage();
default:
return '';
}
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerLiteralPatternConverter extends LoggerPatternConverter {
/**
* @var string
*/
var $literal;
/**
* Constructor
*
* @param string $value
*/
function LoggerLiteralPatternConverter($value)
{
LoggerLog::debug("LoggerLiteralPatternConverter::LoggerLiteralPatternConverter() value='$value'");
$this->literal = $value;
}
/**
* @param string &$sbuf
* @param LoggerLoggingEvent $event
*/
function format(&$sbuf, $event)
{
$sbuf .= $this->literal;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
return $this->literal;
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerDatePatternConverter extends LoggerPatternConverter {
/**
* @var string
*/
var $df;
/**
* Constructor
*
* @param string $formattingInfo
* @param string $df
*/
function LoggerDatePatternConverter($formattingInfo, $df)
{
LoggerLog::debug("LoggerDatePatternConverter::LoggerDatePatternConverter() dateFormat='$df'");
$this->LoggerPatternConverter($formattingInfo);
$this->df = $df;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
$timeStamp = $event->getTimeStamp();
$usecs = round(($timeStamp - (int)$timeStamp) * 1000);
$this->df = str_replace("\u", "u", ereg_replace("[^\\]u", sprintf(',%03d', $usecs), $this->df));
return date($this->df, $event->getTimeStamp());
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerMDCPatternConverter extends LoggerPatternConverter {
/**
* @var string
*/
var $key;
/**
* Constructor
*
* @param string $formattingInfo
* @param string $key
*/
function LoggerMDCPatternConverter($formattingInfo, $key)
{
LoggerLog::debug("LoggerMDCPatternConverter::LoggerMDCPatternConverter() key='$key'");
$this->LoggerPatternConverter($formattingInfo);
$this->key = $key;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
return $event->getMDC($this->key);
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerLocationPatternConverter extends LoggerPatternConverter {
/**
* @var integer
*/
var $type;
/**
* Constructor
*
* @param string $formattingInfo
* @param integer $type
*/
function LoggerLocationPatternConverter($formattingInfo, $type)
{
LoggerLog::debug("LoggerLocationPatternConverter::LoggerLocationPatternConverter() type='$type'");
$this->LoggerPatternConverter($formattingInfo);
$this->type = $type;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
$locationInfo = $event->getLocationInformation();
switch($this->type) {
case LOG4PHP_LOGGER_PATTERN_PARSER_FULL_LOCATION_CONVERTER:
return $locationInfo->fullInfo;
case LOG4PHP_LOGGER_PATTERN_PARSER_METHOD_LOCATION_CONVERTER:
return $locationInfo->getMethodName();
case LOG4PHP_LOGGER_PATTERN_PARSER_LINE_LOCATION_CONVERTER:
return $locationInfo->getLineNumber();
case LOG4PHP_LOGGER_PATTERN_PARSER_FILE_LOCATION_CONVERTER:
return $locationInfo->getFileName();
default:
return '';
}
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
* @abstract
*/
class LoggerNamedPatternConverter extends LoggerPatternConverter {
/**
* @var integer
*/
var $precision;
/**
* Constructor
*
* @param string $formattingInfo
* @param integer $precision
*/
function LoggerNamedPatternConverter($formattingInfo, $precision)
{
LoggerLog::debug("LoggerNamedPatternConverter::LoggerNamedPatternConverter() precision='$precision'");
$this->LoggerPatternConverter($formattingInfo);
$this->precision = $precision;
}
/**
* @param LoggerLoggingEvent $event
* @return string
* @abstract
*/
function getFullyQualifiedName($event)
{
// abstract
return;
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function convert($event)
{
$n = $this->getFullyQualifiedName($event);
if ($this->precision <= 0) {
return $n;
} else {
$len = strlen($n);
// We substract 1 from 'len' when assigning to 'end' to avoid out of
// bounds exception in return r.substring(end+1, len). This can happen if
// precision is 1 and the category name ends with a dot.
$end = $len -1 ;
for($i = $this->precision; $i > 0; $i--) {
$end = strrpos(substr($n, 0, ($end - 1)), '.');
if ($end == false)
return $n;
}
return substr($n, ($end + 1), $len);
}
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerClassNamePatternConverter extends LoggerNamedPatternConverter {
/**
* Constructor
*
* @param string $formattingInfo
* @param integer $precision
*/
function LoggerClassNamePatternConverter($formattingInfo, $precision)
{
LoggerLog::debug("LoggerClassNamePatternConverter::LoggerClassNamePatternConverter() precision='$precision'");
$this->LoggerNamedPatternConverter($formattingInfo, $precision);
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function getFullyQualifiedName($event)
{
return $event->fqcn;
}
}
/**
* @author VxR <vxr@vxr.it>
* @package log4php
* @subpackage helpers
*/
class LoggerCategoryPatternConverter extends LoggerNamedPatternConverter {
/**
* Constructor
*
* @param string $formattingInfo
* @param integer $precision
*/
function LoggerCategoryPatternConverter($formattingInfo, $precision)
{
LoggerLog::debug("LoggerCategoryPatternConverter::LoggerCategoryPatternConverter() precision='$precision'");
$this->LoggerNamedPatternConverter($formattingInfo, $precision);
}
/**
* @param LoggerLoggingEvent $event
* @return string
*/
function getFullyQualifiedName($event)
{
return $event->getLoggerName();
}
}
?>