3 * log4php is a PHP port of the log4j java logging package.
5 * <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
6 * <p>Design, strategies and part of the methods documentation are developed by log4j team
7 * (Ceki Gülcü as log4j project founder and
8 * {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
10 * <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
11 * For more information, please see {@link http://www.vxr.it/log4php/}.</p>
13 * <p>This software is published under the terms of the LGPL License
14 * a copy of which has been included with this distribution in the LICENSE file.</p>
23 if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
27 require_once(LOG4PHP_DIR . '/LoggerLog.php');
30 * Array for fast space padding
31 * Used by {@link LoggerPatternConverter::spacePad()}.
33 $GLOBALS['log4php.LoggerPatternConverter.spaces'] = array(" ", " ", " ", " ", //1,2,4,8 spaces
38 * LoggerPatternConverter is an abstract class that provides the formatting
39 * functionality that derived classes need.
41 * <p>Conversion specifiers in a conversion patterns are parsed to
42 * individual PatternConverters. Each of which is responsible for
43 * converting a logging event in a converter specific manner.</p>
45 * @author VxR <vxr@vxr.it>
46 * @version $Revision: 2 $
52 class LoggerPatternConverter {
55 * @var LoggerPatternConverter next converter in converter chain
60 var $max = 0x7FFFFFFF;
61 var $leftAlign = false;
66 * @param LoggerFormattingInfo $fi
68 function LoggerPatternConverter($fi = null)
71 $this->min = $fi->min;
72 $this->max = $fi->max;
73 $this->leftAlign = $fi->leftAlign;
78 * Derived pattern converters must override this method in order to
79 * convert conversion specifiers in the correct way.
81 * @param LoggerLoggingEvent $event
83 function convert($event) {}
86 * A template method for formatting in a converter specific way.
88 * @param string &$sbuf string buffer
89 * @param LoggerLoggingEvent $e
91 function format(&$sbuf, $e)
93 LoggerLog::debug("LoggerPatternConverter::format() sbuf='$sbuf'");
95 $s = $this->convert($e);
97 LoggerLog::debug("LoggerPatternConverter::format() converted event is '$s'");
100 if($s == null or empty($s)) {
102 $this->spacePad($sbuf, $this->min);
108 if($len > $this->max) {
109 $sbuf .= substr($s , 0, ($len - $this->max));
110 } elseif($len < $this->min) {
111 if($this->leftAlign) {
113 $this->spacePad($sbuf, ($this->min - $len));
115 $this->spacePad($sbuf, ($this->min - $len));
125 * Fast space padding method.
127 * @param string &$sbuf string buffer
128 * @param integer $length pad length
130 * @todo reimplement using PHP string functions
132 function spacePad(&$sbuf, $length)
134 LoggerLog::debug("LoggerPatternConverter::spacePad() sbuf='$sbuf' len='$length'");
136 while($length >= 32) {
137 $sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][5];
141 for($i = 4; $i >= 0; $i--) {
142 if(($length & (1<<$i)) != 0) {
143 $sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][$i];
147 // $sbuf = str_pad($sbuf, $length);
151 // ---------------------------------------------------------------------
153 // ---------------------------------------------------------------------
156 * @author VxR <vxr@vxr.it>
158 * @subpackage helpers
160 class LoggerBasicPatternConverter extends LoggerPatternConverter {
170 * @param string $formattingInfo
171 * @param integer $type
173 function LoggerBasicPatternConverter($formattingInfo, $type)
175 LoggerLog::debug("LoggerBasicPatternConverter::LoggerBasicPatternConverter() type='$type'");
177 $this->LoggerPatternConverter($formattingInfo);
182 * @param LoggerLoggingEvent $event
185 function convert($event)
187 switch($this->type) {
188 case LOG4PHP_LOGGER_PATTERN_PARSER_RELATIVE_TIME_CONVERTER:
189 $timeStamp = $event->getTimeStamp();
190 $startTime = LoggerLoggingEvent::getStartTime();
191 return (string)(int)($timeStamp * 1000 - $startTime * 1000);
193 case LOG4PHP_LOGGER_PATTERN_PARSER_THREAD_CONVERTER:
194 return $event->getThreadName();
196 case LOG4PHP_LOGGER_PATTERN_PARSER_LEVEL_CONVERTER:
197 $level = $event->getLevel();
198 return $level->toString();
200 case LOG4PHP_LOGGER_PATTERN_PARSER_NDC_CONVERTER:
201 return $event->getNDC();
203 case LOG4PHP_LOGGER_PATTERN_PARSER_MESSAGE_CONVERTER:
204 return $event->getRenderedMessage();
213 * @author VxR <vxr@vxr.it>
215 * @subpackage helpers
217 class LoggerLiteralPatternConverter extends LoggerPatternConverter {
227 * @param string $value
229 function LoggerLiteralPatternConverter($value)
231 LoggerLog::debug("LoggerLiteralPatternConverter::LoggerLiteralPatternConverter() value='$value'");
233 $this->literal = $value;
237 * @param string &$sbuf
238 * @param LoggerLoggingEvent $event
240 function format(&$sbuf, $event)
242 $sbuf .= $this->literal;
246 * @param LoggerLoggingEvent $event
249 function convert($event)
251 return $this->literal;
256 * @author VxR <vxr@vxr.it>
258 * @subpackage helpers
260 class LoggerDatePatternConverter extends LoggerPatternConverter {
270 * @param string $formattingInfo
273 function LoggerDatePatternConverter($formattingInfo, $df)
275 LoggerLog::debug("LoggerDatePatternConverter::LoggerDatePatternConverter() dateFormat='$df'");
277 $this->LoggerPatternConverter($formattingInfo);
282 * @param LoggerLoggingEvent $event
285 function convert($event)
287 $timeStamp = $event->getTimeStamp();
288 $usecs = round(($timeStamp - (int)$timeStamp) * 1000);
289 $this->df = str_replace("\u", "u", ereg_replace("[^\\]u", sprintf(',%03d', $usecs), $this->df));
290 // $this->df = str_replace("\u", "u", ereg_replace(",u", sprintf(',%03d', $usecs), $this->df)); // bug fixed(2006/7/14)
291 return date($this->df, $event->getTimeStamp());
297 * @author VxR <vxr@vxr.it>
299 * @subpackage helpers
301 class LoggerMDCPatternConverter extends LoggerPatternConverter {
311 * @param string $formattingInfo
314 function LoggerMDCPatternConverter($formattingInfo, $key)
316 LoggerLog::debug("LoggerMDCPatternConverter::LoggerMDCPatternConverter() key='$key'");
318 $this->LoggerPatternConverter($formattingInfo);
323 * @param LoggerLoggingEvent $event
326 function convert($event)
328 return $event->getMDC($this->key);
333 * @author VxR <vxr@vxr.it>
335 * @subpackage helpers
337 class LoggerLocationPatternConverter extends LoggerPatternConverter {
347 * @param string $formattingInfo
348 * @param integer $type
350 function LoggerLocationPatternConverter($formattingInfo, $type)
352 LoggerLog::debug("LoggerLocationPatternConverter::LoggerLocationPatternConverter() type='$type'");
354 $this->LoggerPatternConverter($formattingInfo);
359 * @param LoggerLoggingEvent $event
362 function convert($event)
364 $locationInfo = $event->getLocationInformation();
365 switch($this->type) {
366 case LOG4PHP_LOGGER_PATTERN_PARSER_FULL_LOCATION_CONVERTER:
367 return $locationInfo->fullInfo;
368 case LOG4PHP_LOGGER_PATTERN_PARSER_METHOD_LOCATION_CONVERTER:
369 return $locationInfo->getMethodName();
370 case LOG4PHP_LOGGER_PATTERN_PARSER_LINE_LOCATION_CONVERTER:
371 return $locationInfo->getLineNumber();
372 case LOG4PHP_LOGGER_PATTERN_PARSER_FILE_LOCATION_CONVERTER:
373 return $locationInfo->getFileName();
381 * @author VxR <vxr@vxr.it>
383 * @subpackage helpers
386 class LoggerNamedPatternConverter extends LoggerPatternConverter {
396 * @param string $formattingInfo
397 * @param integer $precision
399 function LoggerNamedPatternConverter($formattingInfo, $precision)
401 LoggerLog::debug("LoggerNamedPatternConverter::LoggerNamedPatternConverter() precision='$precision'");
403 $this->LoggerPatternConverter($formattingInfo);
404 $this->precision = $precision;
408 * @param LoggerLoggingEvent $event
412 function getFullyQualifiedName($event)
419 * @param LoggerLoggingEvent $event
422 function convert($event)
424 $n = $this->getFullyQualifiedName($event);
425 if ($this->precision <= 0) {
430 // We substract 1 from 'len' when assigning to 'end' to avoid out of
431 // bounds exception in return r.substring(end+1, len). This can happen if
432 // precision is 1 and the category name ends with a dot.
434 for($i = $this->precision; $i > 0; $i--) {
435 $end = strrpos(substr($n, 0, ($end - 1)), '.');
439 return substr($n, ($end + 1), $len);
445 * @author VxR <vxr@vxr.it>
447 * @subpackage helpers
449 class LoggerClassNamePatternConverter extends LoggerNamedPatternConverter {
454 * @param string $formattingInfo
455 * @param integer $precision
457 function LoggerClassNamePatternConverter($formattingInfo, $precision)
459 LoggerLog::debug("LoggerClassNamePatternConverter::LoggerClassNamePatternConverter() precision='$precision'");
461 $this->LoggerNamedPatternConverter($formattingInfo, $precision);
465 * @param LoggerLoggingEvent $event
468 function getFullyQualifiedName($event)
475 * @author VxR <vxr@vxr.it>
477 * @subpackage helpers
479 class LoggerCategoryPatternConverter extends LoggerNamedPatternConverter {
484 * @param string $formattingInfo
485 * @param integer $precision
487 function LoggerCategoryPatternConverter($formattingInfo, $precision)
489 LoggerLog::debug("LoggerCategoryPatternConverter::LoggerCategoryPatternConverter() precision='$precision'");
491 $this->LoggerNamedPatternConverter($formattingInfo, $precision);
495 * @param LoggerLoggingEvent $event
498 function getFullyQualifiedName($event)
500 return $event->getLoggerName();