LoggerPatternConverter.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504
  1. <?php
  2. /**
  3. * log4php is a PHP port of the log4j java logging package.
  4. *
  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>
  9. *
  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>
  12. *
  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>
  15. *
  16. * @package log4php
  17. * @subpackage helpers
  18. */
  19. /**
  20. * @ignore
  21. */
  22. if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
  23. /**
  24. */
  25. require_once(LOG4PHP_DIR . '/LoggerLog.php');
  26. /**
  27. * Array for fast space padding
  28. * Used by {@link LoggerPatternConverter::spacePad()}.
  29. */
  30. $GLOBALS['log4php.LoggerPatternConverter.spaces'] = array(" ", " ", " ", " ", //1,2,4,8 spaces
  31. " ", // 16 spaces
  32. " " ); // 32 spaces
  33. /**
  34. * LoggerPatternConverter is an abstract class that provides the formatting
  35. * functionality that derived classes need.
  36. *
  37. * <p>Conversion specifiers in a conversion patterns are parsed to
  38. * individual PatternConverters. Each of which is responsible for
  39. * converting a logging event in a converter specific manner.</p>
  40. *
  41. * @author VxR <vxr@vxr.it>
  42. * @version $Revision: 1.1 $
  43. * @package log4php
  44. * @subpackage helpers
  45. * @abstract
  46. * @since 0.3
  47. */
  48. class LoggerPatternConverter {
  49. /**
  50. * @var LoggerPatternConverter next converter in converter chain
  51. */
  52. var $next = null;
  53. var $min = -1;
  54. var $max = 0x7FFFFFFF;
  55. var $leftAlign = false;
  56. /**
  57. * Constructor
  58. *
  59. * @param LoggerFormattingInfo $fi
  60. */
  61. function LoggerPatternConverter($fi = null)
  62. {
  63. if ($fi !== null) {
  64. $this->min = $fi->min;
  65. $this->max = $fi->max;
  66. $this->leftAlign = $fi->leftAlign;
  67. }
  68. }
  69. /**
  70. * Derived pattern converters must override this method in order to
  71. * convert conversion specifiers in the correct way.
  72. *
  73. * @param LoggerLoggingEvent $event
  74. */
  75. function convert($event) {}
  76. /**
  77. * A template method for formatting in a converter specific way.
  78. *
  79. * @param string &$sbuf string buffer
  80. * @param LoggerLoggingEvent $e
  81. */
  82. function format(&$sbuf, $e)
  83. {
  84. LoggerLog::debug("LoggerPatternConverter::format() sbuf='$sbuf'");
  85. $s = $this->convert($e);
  86. LoggerLog::debug("LoggerPatternConverter::format() converted event is '$s'");
  87. if($s == null or empty($s)) {
  88. if(0 < $this->min)
  89. $this->spacePad($sbuf, $this->min);
  90. return;
  91. }
  92. $len = strlen($s);
  93. if($len > $this->max) {
  94. $sbuf .= substr($s , 0, ($len - $this->max));
  95. } elseif($len < $this->min) {
  96. if($this->leftAlign) {
  97. $sbuf .= $s;
  98. $this->spacePad($sbuf, ($this->min - $len));
  99. } else {
  100. $this->spacePad($sbuf, ($this->min - $len));
  101. $sbuf .= $s;
  102. }
  103. } else {
  104. $sbuf .= $s;
  105. }
  106. }
  107. /**
  108. * Fast space padding method.
  109. *
  110. * @param string &$sbuf string buffer
  111. * @param integer $length pad length
  112. *
  113. * @todo reimplement using PHP string functions
  114. */
  115. function spacePad(&$sbuf, $length)
  116. {
  117. LoggerLog::debug("LoggerPatternConverter::spacePad() sbuf='$sbuf' len='$length'");
  118. while($length >= 32) {
  119. $sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][5];
  120. $length -= 32;
  121. }
  122. for($i = 4; $i >= 0; $i--) {
  123. if(($length & (1<<$i)) != 0) {
  124. $sbuf .= $GLOBALS['log4php.LoggerPatternConverter.spaces'][$i];
  125. }
  126. }
  127. // $sbuf = str_pad($sbuf, $length);
  128. }
  129. }
  130. // ---------------------------------------------------------------------
  131. // PatternConverters
  132. // ---------------------------------------------------------------------
  133. /**
  134. * @author VxR <vxr@vxr.it>
  135. * @package log4php
  136. * @subpackage helpers
  137. */
  138. class LoggerBasicPatternConverter extends LoggerPatternConverter {
  139. /**
  140. * @var integer
  141. */
  142. var $type;
  143. /**
  144. * Constructor
  145. *
  146. * @param string $formattingInfo
  147. * @param integer $type
  148. */
  149. function LoggerBasicPatternConverter($formattingInfo, $type)
  150. {
  151. LoggerLog::debug("LoggerBasicPatternConverter::LoggerBasicPatternConverter() type='$type'");
  152. $this->LoggerPatternConverter($formattingInfo);
  153. $this->type = $type;
  154. }
  155. /**
  156. * @param LoggerLoggingEvent $event
  157. * @return string
  158. */
  159. function convert($event)
  160. {
  161. switch($this->type) {
  162. case LOG4PHP_LOGGER_PATTERN_PARSER_RELATIVE_TIME_CONVERTER:
  163. $timeStamp = $event->getTimeStamp();
  164. $startTime = LoggerLoggingEvent::getStartTime();
  165. return (string)(int)($timeStamp * 1000 - $startTime * 1000);
  166. case LOG4PHP_LOGGER_PATTERN_PARSER_THREAD_CONVERTER:
  167. return $event->getThreadName();
  168. case LOG4PHP_LOGGER_PATTERN_PARSER_LEVEL_CONVERTER:
  169. $level = $event->getLevel();
  170. return $level->toString();
  171. case LOG4PHP_LOGGER_PATTERN_PARSER_NDC_CONVERTER:
  172. return $event->getNDC();
  173. case LOG4PHP_LOGGER_PATTERN_PARSER_MESSAGE_CONVERTER:
  174. return $event->getRenderedMessage();
  175. default:
  176. return '';
  177. }
  178. }
  179. }
  180. /**
  181. * @author VxR <vxr@vxr.it>
  182. * @package log4php
  183. * @subpackage helpers
  184. */
  185. class LoggerLiteralPatternConverter extends LoggerPatternConverter {
  186. /**
  187. * @var string
  188. */
  189. var $literal;
  190. /**
  191. * Constructor
  192. *
  193. * @param string $value
  194. */
  195. function LoggerLiteralPatternConverter($value)
  196. {
  197. LoggerLog::debug("LoggerLiteralPatternConverter::LoggerLiteralPatternConverter() value='$value'");
  198. $this->literal = $value;
  199. }
  200. /**
  201. * @param string &$sbuf
  202. * @param LoggerLoggingEvent $event
  203. */
  204. function format(&$sbuf, $event)
  205. {
  206. $sbuf .= $this->literal;
  207. }
  208. /**
  209. * @param LoggerLoggingEvent $event
  210. * @return string
  211. */
  212. function convert($event)
  213. {
  214. return $this->literal;
  215. }
  216. }
  217. /**
  218. * @author VxR <vxr@vxr.it>
  219. * @package log4php
  220. * @subpackage helpers
  221. */
  222. class LoggerDatePatternConverter extends LoggerPatternConverter {
  223. /**
  224. * @var string
  225. */
  226. var $df;
  227. /**
  228. * Constructor
  229. *
  230. * @param string $formattingInfo
  231. * @param string $df
  232. */
  233. function LoggerDatePatternConverter($formattingInfo, $df)
  234. {
  235. LoggerLog::debug("LoggerDatePatternConverter::LoggerDatePatternConverter() dateFormat='$df'");
  236. $this->LoggerPatternConverter($formattingInfo);
  237. $this->df = $df;
  238. }
  239. /**
  240. * @param LoggerLoggingEvent $event
  241. * @return string
  242. */
  243. function convert($event)
  244. {
  245. $timeStamp = $event->getTimeStamp();
  246. $usecs = round(($timeStamp - (int)$timeStamp) * 1000);
  247. $this->df = str_replace("\u", "u", ereg_replace("[^\\]u", sprintf(',%03d', $usecs), $this->df));
  248. return date($this->df, $event->getTimeStamp());
  249. }
  250. }
  251. /**
  252. * @author VxR <vxr@vxr.it>
  253. * @package log4php
  254. * @subpackage helpers
  255. */
  256. class LoggerMDCPatternConverter extends LoggerPatternConverter {
  257. /**
  258. * @var string
  259. */
  260. var $key;
  261. /**
  262. * Constructor
  263. *
  264. * @param string $formattingInfo
  265. * @param string $key
  266. */
  267. function LoggerMDCPatternConverter($formattingInfo, $key)
  268. {
  269. LoggerLog::debug("LoggerMDCPatternConverter::LoggerMDCPatternConverter() key='$key'");
  270. $this->LoggerPatternConverter($formattingInfo);
  271. $this->key = $key;
  272. }
  273. /**
  274. * @param LoggerLoggingEvent $event
  275. * @return string
  276. */
  277. function convert($event)
  278. {
  279. return $event->getMDC($this->key);
  280. }
  281. }
  282. /**
  283. * @author VxR <vxr@vxr.it>
  284. * @package log4php
  285. * @subpackage helpers
  286. */
  287. class LoggerLocationPatternConverter extends LoggerPatternConverter {
  288. /**
  289. * @var integer
  290. */
  291. var $type;
  292. /**
  293. * Constructor
  294. *
  295. * @param string $formattingInfo
  296. * @param integer $type
  297. */
  298. function LoggerLocationPatternConverter($formattingInfo, $type)
  299. {
  300. LoggerLog::debug("LoggerLocationPatternConverter::LoggerLocationPatternConverter() type='$type'");
  301. $this->LoggerPatternConverter($formattingInfo);
  302. $this->type = $type;
  303. }
  304. /**
  305. * @param LoggerLoggingEvent $event
  306. * @return string
  307. */
  308. function convert($event)
  309. {
  310. $locationInfo = $event->getLocationInformation();
  311. switch($this->type) {
  312. case LOG4PHP_LOGGER_PATTERN_PARSER_FULL_LOCATION_CONVERTER:
  313. return $locationInfo->fullInfo;
  314. case LOG4PHP_LOGGER_PATTERN_PARSER_METHOD_LOCATION_CONVERTER:
  315. return $locationInfo->getMethodName();
  316. case LOG4PHP_LOGGER_PATTERN_PARSER_LINE_LOCATION_CONVERTER:
  317. return $locationInfo->getLineNumber();
  318. case LOG4PHP_LOGGER_PATTERN_PARSER_FILE_LOCATION_CONVERTER:
  319. return $locationInfo->getFileName();
  320. default:
  321. return '';
  322. }
  323. }
  324. }
  325. /**
  326. * @author VxR <vxr@vxr.it>
  327. * @package log4php
  328. * @subpackage helpers
  329. * @abstract
  330. */
  331. class LoggerNamedPatternConverter extends LoggerPatternConverter {
  332. /**
  333. * @var integer
  334. */
  335. var $precision;
  336. /**
  337. * Constructor
  338. *
  339. * @param string $formattingInfo
  340. * @param integer $precision
  341. */
  342. function LoggerNamedPatternConverter($formattingInfo, $precision)
  343. {
  344. LoggerLog::debug("LoggerNamedPatternConverter::LoggerNamedPatternConverter() precision='$precision'");
  345. $this->LoggerPatternConverter($formattingInfo);
  346. $this->precision = $precision;
  347. }
  348. /**
  349. * @param LoggerLoggingEvent $event
  350. * @return string
  351. * @abstract
  352. */
  353. function getFullyQualifiedName($event)
  354. {
  355. // abstract
  356. return;
  357. }
  358. /**
  359. * @param LoggerLoggingEvent $event
  360. * @return string
  361. */
  362. function convert($event)
  363. {
  364. $n = $this->getFullyQualifiedName($event);
  365. if ($this->precision <= 0) {
  366. return $n;
  367. } else {
  368. $len = strlen($n);
  369. // We substract 1 from 'len' when assigning to 'end' to avoid out of
  370. // bounds exception in return r.substring(end+1, len). This can happen if
  371. // precision is 1 and the category name ends with a dot.
  372. $end = $len -1 ;
  373. for($i = $this->precision; $i > 0; $i--) {
  374. $end = strrpos(substr($n, 0, ($end - 1)), '.');
  375. if ($end == false)
  376. return $n;
  377. }
  378. return substr($n, ($end + 1), $len);
  379. }
  380. }
  381. }
  382. /**
  383. * @author VxR <vxr@vxr.it>
  384. * @package log4php
  385. * @subpackage helpers
  386. */
  387. class LoggerClassNamePatternConverter extends LoggerNamedPatternConverter {
  388. /**
  389. * Constructor
  390. *
  391. * @param string $formattingInfo
  392. * @param integer $precision
  393. */
  394. function LoggerClassNamePatternConverter($formattingInfo, $precision)
  395. {
  396. LoggerLog::debug("LoggerClassNamePatternConverter::LoggerClassNamePatternConverter() precision='$precision'");
  397. $this->LoggerNamedPatternConverter($formattingInfo, $precision);
  398. }
  399. /**
  400. * @param LoggerLoggingEvent $event
  401. * @return string
  402. */
  403. function getFullyQualifiedName($event)
  404. {
  405. return $event->fqcn;
  406. }
  407. }
  408. /**
  409. * @author VxR <vxr@vxr.it>
  410. * @package log4php
  411. * @subpackage helpers
  412. */
  413. class LoggerCategoryPatternConverter extends LoggerNamedPatternConverter {
  414. /**
  415. * Constructor
  416. *
  417. * @param string $formattingInfo
  418. * @param integer $precision
  419. */
  420. function LoggerCategoryPatternConverter($formattingInfo, $precision)
  421. {
  422. LoggerLog::debug("LoggerCategoryPatternConverter::LoggerCategoryPatternConverter() precision='$precision'");
  423. $this->LoggerNamedPatternConverter($formattingInfo, $precision);
  424. }
  425. /**
  426. * @param LoggerLoggingEvent $event
  427. * @return string
  428. */
  429. function getFullyQualifiedName($event)
  430. {
  431. return $event->getLoggerName();
  432. }
  433. }
  434. ?>