123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419 |
- <?php
- if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
- if (!defined('LOG4PHP_LINE_SEP')) {
- if (substr(php_uname(), 0, 7) == "Windows") {
-
- define('LOG4PHP_LINE_SEP', "\r\n");
- } else {
-
- define('LOG4PHP_LINE_SEP', "\n");
- }
- }
-
- require_once(LOG4PHP_DIR . '/helpers/LoggerFormattingInfo.php');
- require_once(LOG4PHP_DIR . '/helpers/LoggerPatternConverter.php');
- require_once(LOG4PHP_DIR . '/LoggerLog.php');
- define('LOG4PHP_LOGGER_PATTERN_PARSER_ESCAPE_CHAR', '%');
- define('LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE', 0);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_CONVERTER_STATE', 1);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_MINUS_STATE', 2);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_DOT_STATE', 3);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_MIN_STATE', 4);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_MAX_STATE', 5);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_FULL_LOCATION_CONVERTER', 1000);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_METHOD_LOCATION_CONVERTER', 1001);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_CLASS_LOCATION_CONVERTER', 1002);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_FILE_LOCATION_CONVERTER', 1003);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_LINE_LOCATION_CONVERTER', 1004);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_RELATIVE_TIME_CONVERTER', 2000);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_THREAD_CONVERTER', 2001);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_LEVEL_CONVERTER', 2002);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_NDC_CONVERTER', 2003);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_MESSAGE_CONVERTER', 2004);
- define('LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ISO8601', 'Y-m-d H:i:s,u');
- define('LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ABSOLUTE', 'H:i:s');
- define('LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_DATE', 'd M Y H:i:s,u');
- class LoggerPatternParser {
- var $state;
- var $currentLiteral;
- var $patternLength;
- var $i;
-
-
- var $head = null;
-
-
- var $tail = null;
-
-
- var $formattingInfo;
-
-
- var $pattern;
-
- function LoggerPatternParser($pattern)
- {
- LoggerLog::debug("LoggerPatternParser::LoggerPatternParser() pattern='$pattern'");
-
- $this->pattern = $pattern;
- $this->patternLength = strlen($pattern);
- $this->formattingInfo = new LoggerFormattingInfo();
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE;
- }
-
- function addToList($pc)
- {
-
-
- if($this->head == null) {
- $this->head = $pc;
- $this->tail =& $this->head;
- } else {
- $this->tail->next = $pc;
- $this->tail =& $this->tail->next;
- }
- }
-
- function extractOption()
- {
- if(($this->i < $this->patternLength) and ($this->pattern{$this->i} == '{')) {
- $end = strpos($this->pattern, '}' , $this->i);
- if ($end !== false) {
- $r = substr($this->pattern, ($this->i + 1), ($end - $this->i - 1));
- $this->i= $end + 1;
- return $r;
- }
- }
- return null;
- }
-
- function extractPrecisionOption()
- {
- $opt = $this->extractOption();
- $r = 0;
- if ($opt !== null) {
- if (is_numeric($opt)) {
- $r = (int)$opt;
- if($r <= 0) {
- LoggerLog::warn("Precision option ({$opt}) isn't a positive integer.");
- $r = 0;
- }
- } else {
- LoggerLog::warn("Category option \"{$opt}\" not a decimal integer.");
- }
- }
- return $r;
- }
- function parse()
- {
- LoggerLog::debug("LoggerPatternParser::parse()");
-
- $c = '';
- $this->i = 0;
- $this->currentLiteral = '';
- while ($this->i < $this->patternLength) {
- $c = $this->pattern{$this->i++};
- switch($this->state) {
- case LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE:
-
-
- if($this->i == $this->patternLength) {
- $this->currentLiteral .= $c;
- continue;
- }
- if($c == LOG4PHP_LOGGER_PATTERN_PARSER_ESCAPE_CHAR) {
-
-
- switch($this->pattern{$this->i}) {
- case LOG4PHP_LOGGER_PATTERN_PARSER_ESCAPE_CHAR:
-
- $this->currentLiteral .= $c;
- $this->i++;
- break;
- case 'n':
-
- $this->currentLiteral .= LOG4PHP_LINE_SEP;
- $this->i++;
- break;
- default:
- if(strlen($this->currentLiteral) != 0) {
- $this->addToList(new LoggerLiteralPatternConverter($this->currentLiteral));
- LoggerLog::debug("LoggerPatternParser::parse() Parsed LITERAL converter: \"{$this->currentLiteral}\".");
- }
- $this->currentLiteral = $c;
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_CONVERTER_STATE;
- $this->formattingInfo->reset();
- }
- } else {
- $this->currentLiteral .= $c;
- }
- break;
- case LOG4PHP_LOGGER_PATTERN_PARSER_CONVERTER_STATE:
-
- $this->currentLiteral .= $c;
- switch($c) {
- case '-':
- $this->formattingInfo->leftAlign = true;
- break;
- case '.':
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_DOT_STATE;
- break;
- default:
- if(ord($c) >= ord('0') and ord($c) <= ord('9')) {
- $this->formattingInfo->min = ord($c) - ord('0');
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_MIN_STATE;
- } else {
- $this->finalizeConverter($c);
- }
- }
- break;
- case LOG4PHP_LOGGER_PATTERN_PARSER_MIN_STATE:
-
- $this->currentLiteral .= $c;
- if(ord($c) >= ord('0') and ord($c) <= ord('9')) {
- $this->formattingInfo->min = ($this->formattingInfo->min * 10) + (ord(c) - ord('0'));
- } elseif ($c == '.') {
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_DOT_STATE;
- } else {
- $this->finalizeConverter($c);
- }
- break;
- case LOG4PHP_LOGGER_PATTERN_PARSER_DOT_STATE:
-
- $this->currentLiteral .= $c;
- if(ord($c) >= ord('0') and ord($c) <= ord('9')) {
- $this->formattingInfo->max = ord($c) - ord('0');
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_MAX_STATE;
- } else {
- LoggerLog::warn("LoggerPatternParser::parse() Error occured in position {$this->i}. Was expecting digit, instead got char \"{$c}\".");
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE;
- }
- break;
- case LOG4PHP_LOGGER_PATTERN_PARSER_MAX_STATE:
-
- $this->currentLiteral .= $c;
- if(ord($c) >= ord('0') and ord($c) <= ord('9')) {
- $this->formattingInfo->max = ($this->formattingInfo->max * 10) + (ord($c) - ord('0'));
- } else {
- $this->finalizeConverter($c);
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE;
- }
- break;
- }
- }
- if(strlen($this->currentLiteral) != 0) {
- $this->addToList(new LoggerLiteralPatternConverter($this->currentLiteral));
-
- }
- return $this->head;
- }
- function finalizeConverter($c)
- {
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() with char '$c'");
- $pc = null;
- switch($c) {
- case 'c':
- $pc = new LoggerCategoryPatternConverter($this->formattingInfo, $this->extractPrecisionOption());
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() CATEGORY converter.");
-
- $this->currentLiteral = '';
- break;
- case 'C':
- $pc = new LoggerClassNamePatternConverter($this->formattingInfo, $this->extractPrecisionOption());
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() CLASSNAME converter.");
-
- $this->currentLiteral = '';
- break;
- case 'd':
- $dateFormatStr = LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ISO8601;
- $dOpt = $this->extractOption();
- if($dOpt !== null)
- $dateFormatStr = $dOpt;
-
- if ($dateFormatStr == 'ISO8601') {
- $df = LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ISO8601;
- } elseif($dateFormatStr == 'ABSOLUTE') {
- $df = LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ABSOLUTE;
- } elseif($dateFormatStr == 'DATE') {
- $df = LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_DATE;
- } else {
- $df = $dateFormatStr;
- if ($df == null) {
- $df = LOG4PHP_LOGGER_PATTERN_PARSER_DATE_FORMAT_ISO8601;
- }
- }
- $pc = new LoggerDatePatternConverter($this->formattingInfo, $df);
- $this->currentLiteral = '';
- break;
- case 'F':
- $pc = new LoggerLocationPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_FILE_LOCATION_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() File name converter.");
-
- $this->currentLiteral = '';
- break;
- case 'l':
- $pc = new LoggerLocationPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_FULL_LOCATION_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() Location converter.");
-
- $this->currentLiteral = '';
- break;
- case 'L':
- $pc = new LoggerLocationPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_LINE_LOCATION_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() LINE NUMBER converter.");
-
- $this->currentLiteral = '';
- break;
- case 'm':
- $pc = new LoggerBasicPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_MESSAGE_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() MESSAGE converter.");
-
- $this->currentLiteral = '';
- break;
- case 'M':
- $pc = new LoggerLocationPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_METHOD_LOCATION_CONVERTER);
-
-
- $this->currentLiteral = '';
- break;
- case 'p':
- $pc = new LoggerBasicPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_LEVEL_CONVERTER);
-
-
- $this->currentLiteral = '';
- break;
- case 'r':
- $pc = new LoggerBasicPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_RELATIVE_TIME_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() RELATIVE TIME converter.");
-
- $this->currentLiteral = '';
- break;
- case 't':
- $pc = new LoggerBasicPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_THREAD_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() THREAD converter.");
-
- $this->currentLiteral = '';
- break;
- case 'u':
- if($this->i < $this->patternLength) {
- $cNext = $this->pattern{$this->i};
- if(ord($cNext) >= ord('0') and ord($cNext) <= ord('9')) {
- $pc = new LoggerUserFieldPatternConverter($this->formattingInfo, (string)(ord($cNext) - ord('0')));
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() USER converter [{$cNext}].");
-
- $this->currentLiteral = '';
- $this->i++;
- } else {
- LoggerLog::warn("LoggerPatternParser::finalizeConverter() Unexpected char '{$cNext}' at position {$this->i}.");
- }
- }
- break;
- case 'x':
- $pc = new LoggerBasicPatternConverter($this->formattingInfo, LOG4PHP_LOGGER_PATTERN_PARSER_NDC_CONVERTER);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() NDC converter.");
- $this->currentLiteral = '';
- break;
- case 'X':
- $xOpt = $this->extractOption();
- $pc = new LoggerMDCPatternConverter($this->formattingInfo, $xOpt);
- LoggerLog::debug("LoggerPatternParser::finalizeConverter() MDC converter.");
- $this->currentLiteral = '';
- break;
- default:
- LoggerLog::warn("LoggerPatternParser::finalizeConverter() Unexpected char [$c] at position {$this->i} in conversion pattern.");
- $pc = new LoggerLiteralPatternConverter($this->currentLiteral);
- $this->currentLiteral = '';
- }
- $this->addConverter($pc);
- }
- function addConverter($pc)
- {
- $this->currentLiteral = '';
-
- $this->addToList($pc);
-
- $this->state = LOG4PHP_LOGGER_PATTERN_PARSER_LITERAL_STATE;
-
- $this->formattingInfo->reset();
- }
- }
- ?>
|