LoggerDOMConfigurator.php 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  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 xml
  18. */
  19. /**
  20. * @ignore
  21. */
  22. if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');
  23. require_once(LOG4PHP_DIR . '/helpers/LoggerOptionConverter.php');
  24. require_once(LOG4PHP_DIR . '/or/LoggerObjectRenderer.php');
  25. require_once(LOG4PHP_DIR . '/spi/LoggerConfigurator.php');
  26. require_once(LOG4PHP_DIR . '/LoggerAppender.php');
  27. require_once(LOG4PHP_DIR . '/LoggerLayout.php');
  28. require_once(LOG4PHP_DIR . '/LoggerLog.php');
  29. require_once(LOG4PHP_DIR . '/LoggerManager.php');
  30. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_APPENDER_STATE', 1000);
  31. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_LAYOUT_STATE', 1010);
  32. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE', 1020);
  33. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE', 1030);
  34. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_FILTER_STATE', 1040);
  35. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_FILENAME', './log4php.xml');
  36. /**
  37. * @var string the default configuration document
  38. */
  39. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_CONFIGURATION',
  40. '<?xml version="1.0" ?>
  41. <log4php:configuration threshold="all">
  42. <appender name="A1" class="LoggerAppenderEcho">
  43. <layout class="LoggerLayoutSimple" />
  44. </appender>
  45. <root>
  46. <level value="debug" />
  47. <appender_ref ref="A1" />
  48. </root>
  49. </log4php:configuration>');
  50. /**
  51. * @var string the elements namespace
  52. */
  53. define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS', 'HTTP://WWW.VXR.IT/LOG4PHP/');
  54. /**
  55. * Use this class to initialize the log4php environment using expat parser.
  56. *
  57. * <p>Read the log4php.dtd included in the documentation directory. Note that
  58. * php parser does not validate the document.</p>
  59. *
  60. * <p>Sometimes it is useful to see how log4php is reading configuration
  61. * files. You can enable log4php internal logging by setting the <var>debug</var>
  62. * attribute in the <var>log4php:configuration</var> element. As in
  63. * <pre>
  64. * &lt;log4php:configuration <b>debug="true"</b> xmlns:log4php="http://www.vxr.it/log4php/">
  65. * ...
  66. * &lt;/log4php:configuration>
  67. * </pre>
  68. *
  69. * <p>There are sample XML files included in the package under <b>tests/</b>
  70. * subdirectories.</p>
  71. *
  72. * @author VxR <vxr@vxr.it>
  73. * @version $Revision: 1.1 $
  74. * @package log4php
  75. * @subpackage xml
  76. * @since 0.4
  77. */
  78. class LoggerDOMConfigurator extends LoggerConfigurator {
  79. /**
  80. * @var LoggerHierarchy
  81. */
  82. var $repository;
  83. /**
  84. * @var array state stack
  85. */
  86. var $state;
  87. /**
  88. * @var Logger parsed Logger
  89. */
  90. var $logger;
  91. /**
  92. * @var LoggerAppender parsed LoggerAppender
  93. */
  94. var $appender;
  95. /**
  96. * @var LoggerFilter parsed LoggerFilter
  97. */
  98. var $filter;
  99. /**
  100. * @var LoggerLayout parsed LoggerLayout
  101. */
  102. var $layout;
  103. /**
  104. * Constructor
  105. */
  106. function LoggerDOMConfigurator()
  107. {
  108. $this->state = array();
  109. $this->logger = null;
  110. $this->appender = null;
  111. $this->filter = null;
  112. $this->layout = null;
  113. }
  114. /**
  115. * Configure the default repository using the resource pointed by <b>url</b>.
  116. * <b>Url</b> is any valid resurce as defined in {@link PHP_MANUAL#file} function.
  117. * Note that the resource will be search with <i>use_include_path</i> parameter
  118. * set to "1".
  119. *
  120. * @param string $url
  121. * @static
  122. */
  123. function configure($url = '')
  124. {
  125. $configurator = new LoggerDOMConfigurator();
  126. $repository =& LoggerManager::getLoggerRepository();
  127. return $configurator->doConfigure($url, $repository);
  128. }
  129. /**
  130. * Configure the given <b>repository</b> using the resource pointed by <b>url</b>.
  131. * <b>Url</b> is any valid resurce as defined in {@link PHP_MANUAL#file} function.
  132. * Note that the resource will be search with <i>use_include_path</i> parameter
  133. * set to "1".
  134. *
  135. * @param string $url
  136. * @param LoggerHierarchy &$repository
  137. */
  138. function doConfigure($url = '', &$repository)
  139. {
  140. $xmlData = '';
  141. if (!empty($url))
  142. $xmlData = implode('', file($url, 1));
  143. return $this->doConfigureByString($xmlData, $repository);
  144. }
  145. /**
  146. * Configure the given <b>repository</b> using the configuration written in <b>xmlData</b>.
  147. * Do not call this method directly. Use {@link doConfigure()} instead.
  148. * @param string $xmlData
  149. * @param LoggerHierarchy &$repository
  150. */
  151. function doConfigureByString($xmlData, &$repository)
  152. {
  153. return $this->parse($xmlData, $repository);
  154. }
  155. /**
  156. * @param LoggerHierarchy &$repository
  157. */
  158. function doConfigureDefault(&$repository)
  159. {
  160. return $this->doConfigureByString(LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_CONFIGURATION, $repository);
  161. }
  162. /**
  163. * @param string $xmlData
  164. */
  165. function parse($xmlData, &$repository)
  166. {
  167. // LoggerManager::resetConfiguration();
  168. $this->repository =& $repository;
  169. $parser = xml_parser_create_ns();
  170. xml_set_object($parser, &$this);
  171. xml_set_element_handler($parser, "tagOpen", "tagClose");
  172. $result = xml_parse($parser, $xmlData, true);
  173. if (!$result) {
  174. $errorCode = xml_get_error_code($parser);
  175. $errorStr = xml_error_string($errorCode);
  176. $errorLine = xml_get_current_line_number($parser);
  177. LoggerLog::warn(
  178. "LoggerDOMConfigurator::parse() ".
  179. "Parsing error [{$errorCode}] {$errorStr}, line {$errorLine}"
  180. );
  181. $this->repository->resetConfiguration();
  182. } else {
  183. xml_parser_free($parser);
  184. }
  185. return $result;
  186. }
  187. /**
  188. * @param mixed $parser
  189. * @param string $tag
  190. * @param array $attribs
  191. *
  192. * @todo In 'LOGGER' case find a better way to detect 'getLogger()' method
  193. */
  194. function tagOpen($parser, $tag, $attribs)
  195. {
  196. switch ($tag) {
  197. case 'CONFIGURATION' :
  198. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':CONFIGURATION':
  199. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() CONFIGURATION");
  200. if (isset($attribs['THRESHOLD'])) {
  201. $this->repository->setThreshold(
  202. LoggerOptionConverter::toLevel(
  203. $this->subst($attribs['THRESHOLD']),
  204. $this->repository->getThreshold()
  205. )
  206. );
  207. }
  208. if (isset($attribs['DEBUG'])) {
  209. $debug = LoggerOptionConverter::toBoolean($this->subst($attribs['DEBUG']), LoggerLog::internalDebugging());
  210. $this->repository->debug = $debug;
  211. LoggerLog::internalDebugging($debug);
  212. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LOG4PHP:CONFIGURATION. Internal Debug turned ".($debug ? 'on':'off'));
  213. }
  214. break;
  215. case 'APPENDER' :
  216. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER':
  217. unset($this->appender);
  218. $this->appender = null;
  219. $name = $this->subst(@$attribs['NAME']);
  220. $class = $this->subst(@$attribs['CLASS']);
  221. LoggerLog::debug("LoggerDOMConfigurator::tagOpen():tag=[$tag]:name=[$name]:class=[$class]");
  222. $this->appender =& LoggerAppender::singleton($name, $class);
  223. if ($this->appender === null) {
  224. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER cannot instantiate appender '$name'");
  225. }
  226. $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_APPENDER_STATE;
  227. break;
  228. case 'APPENDER_REF' :
  229. case 'APPENDER-REF' :
  230. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER_REF':
  231. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER-REF':
  232. if (isset($attribs['REF']) and !empty($attribs['REF'])) {
  233. $appenderName = $this->subst($attribs['REF']);
  234. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref='$appenderName'");
  235. $appender =& LoggerAppender::singleton($appenderName);
  236. if ($appender !== null) {
  237. switch (end($this->state)) {
  238. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE:
  239. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE:
  240. $this->logger->addAppender($appender);
  241. break;
  242. }
  243. } else {
  244. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref '$appenderName' points to a null appender");
  245. }
  246. } else {
  247. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref not set or empty");
  248. }
  249. break;
  250. case 'FILTER' :
  251. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':FILTER':
  252. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() FILTER");
  253. unset($this->filter);
  254. $this->filter = null;
  255. $filterName = basename($this->subst(@$attribs['CLASS']));
  256. if (!empty($filterName)) {
  257. if (!class_exists($filterName)) {
  258. @include_once(LOG4PHP_DIR . "/varia/{$filterName}.php");
  259. }
  260. if (class_exists($filterName)) {
  261. $this->filter = new $filterName();
  262. } else {
  263. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() FILTER. class '$filterName' doesnt exist");
  264. }
  265. $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_FILTER_STATE;
  266. } else {
  267. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() FILTER filter name cannot be empty");
  268. }
  269. break;
  270. case 'LAYOUT':
  271. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':LAYOUT':
  272. $class = @$attribs['CLASS'];
  273. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LAYOUT class='{$class}'");
  274. $this->layout = LoggerLayout::factory($this->subst($class));
  275. if ($this->layout === null)
  276. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() LAYOUT unable to instanciate class='{$class}'");
  277. $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_LAYOUT_STATE;
  278. break;
  279. case 'LOGGER':
  280. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':LOGGER':
  281. // $this->logger is assigned by reference.
  282. // Only '$this->logger=null;' destroys referenced object
  283. unset($this->logger);
  284. $this->logger = null;
  285. $loggerName = $this->subst(@$attribs['NAME']);
  286. if (!empty($loggerName)) {
  287. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LOGGER. name='$loggerName'");
  288. $class = $this->subst(@$attribs['CLASS']);
  289. if (empty($class)) {
  290. $this->logger =& $this->repository->getLogger($loggerName);
  291. } else {
  292. $className = basename($class);
  293. if (!class_exists($className))
  294. @include_once("{$class}.php");
  295. if (!class_exists($className)) {
  296. LoggerLog::warn(
  297. "LoggerDOMConfigurator::tagOpen() LOGGER. ".
  298. "cannot find '$className'."
  299. );
  300. } else {
  301. if (in_array('getlogger', get_class_methods($className))) {
  302. $this->logger =& call_user_func(array($className, 'getlogger'), $loggerName);
  303. } else {
  304. LoggerLog::warn(
  305. "LoggerDOMConfigurator::tagOpen() LOGGER. ".
  306. "class '$className' doesnt implement 'getLogger()' method."
  307. );
  308. }
  309. }
  310. }
  311. if ($this->logger !== null and isset($attribs['ADDITIVITY'])) {
  312. $additivity = LoggerOptionConverter::toBoolean($this->subst($attribs['ADDITIVITY']), true);
  313. $this->logger->setAdditivity($additivity);
  314. }
  315. } else {
  316. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() LOGGER. Attribute 'name' is not set or is empty.");
  317. }
  318. $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE;;
  319. break;
  320. case 'LEVEL':
  321. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':LEVEL':
  322. case 'PRIORITY':
  323. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':PRIORITY':
  324. if (!isset($attribs['VALUE'])) {
  325. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LEVEL value not set");
  326. break;
  327. }
  328. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LEVEL value={$attribs['VALUE']}");
  329. if ($this->logger === null) {
  330. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() LEVEL. parent logger is null");
  331. break;
  332. }
  333. switch (end($this->state)) {
  334. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE:
  335. $this->logger->setLevel(
  336. LoggerOptionConverter::toLevel(
  337. $this->subst($attribs['VALUE']),
  338. $this->logger->getLevel()
  339. )
  340. );
  341. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LEVEL root level is now '{$attribs['VALUE']}' ");
  342. break;
  343. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE:
  344. $this->logger->setLevel(
  345. LoggerOptionConverter::toLevel(
  346. $this->subst($attribs['VALUE']),
  347. $this->logger->getLevel()
  348. )
  349. );
  350. break;
  351. default:
  352. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() LEVEL state '{$this->state}' not allowed here");
  353. }
  354. break;
  355. case 'PARAM':
  356. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':PARAM':
  357. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() PARAM");
  358. if (!isset($attribs['NAME'])) {
  359. LoggerLog::warn(
  360. "LoggerDOMConfigurator::tagOpen() PARAM. ".
  361. "attribute 'name' not defined."
  362. );
  363. break;
  364. }
  365. if (!isset($attribs['VALUE'])) {
  366. LoggerLog::warn(
  367. "LoggerDOMConfigurator::tagOpen() PARAM. ".
  368. "attribute 'value' not defined."
  369. );
  370. break;
  371. }
  372. switch (end($this->state)) {
  373. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_APPENDER_STATE:
  374. if ($this->appender !== null) {
  375. $this->setter($this->appender, $this->subst($attribs['NAME']), $this->subst($attribs['VALUE']));
  376. } else {
  377. LoggerLog::warn(
  378. "LoggerDOMConfigurator::tagOpen() PARAM. ".
  379. " trying to set property to a null appender."
  380. );
  381. }
  382. break;
  383. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_LAYOUT_STATE:
  384. if ($this->layout !== null) {
  385. $this->setter($this->layout, $this->subst($attribs['NAME']), $this->subst($attribs['VALUE']));
  386. } else {
  387. LoggerLog::warn(
  388. "LoggerDOMConfigurator::tagOpen() PARAM. ".
  389. " trying to set property to a null layout."
  390. );
  391. }
  392. break;
  393. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_FILTER_STATE:
  394. if ($this->filter !== null) {
  395. $this->setter($this->filter, $this->subst($attribs['NAME']), $this->subst($attribs['VALUE']));
  396. } else {
  397. LoggerLog::warn(
  398. "LoggerDOMConfigurator::tagOpen() PARAM. ".
  399. " trying to set property to a null filter."
  400. );
  401. }
  402. break;
  403. default:
  404. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() PARAM state '{$this->state}' not allowed here");
  405. }
  406. break;
  407. case 'RENDERER':
  408. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':RENDERER':
  409. $renderedClass = $this->subst(@$attribs['RENDEREDCLASS']);
  410. $renderingClass = $this->subst(@$attribs['RENDERINGCLASS']);
  411. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() RENDERER renderedClass='$renderedClass' renderingClass='$renderingClass'");
  412. if (!empty($renderedClass) and !empty($renderingClass)) {
  413. $renderer = LoggerObjectRenderer::factory($renderingClass);
  414. if ($renderer === null) {
  415. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() RENDERER cannot instantiate '$renderingClass'");
  416. } else {
  417. $this->repository->setRenderer($renderedClass, $renderer);
  418. }
  419. } else {
  420. LoggerLog::warn("LoggerDOMConfigurator::tagOpen() RENDERER renderedClass or renderingClass is empty");
  421. }
  422. break;
  423. case 'ROOT':
  424. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':ROOT':
  425. LoggerLog::debug("LoggerDOMConfigurator::tagOpen() ROOT");
  426. $this->logger =& LoggerManager::getRootLogger();
  427. $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE;
  428. break;
  429. }
  430. }
  431. /**
  432. * @param mixed $parser
  433. * @param string $tag
  434. */
  435. function tagClose($parser, $tag)
  436. {
  437. switch ($tag) {
  438. case 'CONFIGURATION' :
  439. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':CONFIGURATION':
  440. LoggerLog::debug("LoggerDOMConfigurator::tagClose() CONFIGURATION");
  441. break;
  442. case 'APPENDER' :
  443. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER':
  444. LoggerLog::debug("LoggerDOMConfigurator::tagClose() APPENDER");
  445. if ($this->appender !== null) {
  446. if ($this->appender->requiresLayout() and $this->appender->layout === null) {
  447. $appenderName = $this->appender->getName();
  448. LoggerLog::warn(
  449. "LoggerDOMConfigurator::tagClose() APPENDER. ".
  450. "'$appenderName' requires a layout that is not defined. ".
  451. "Using a simple layout"
  452. );
  453. $this->appender->setLayout(LoggerLayout::factory('LoggerLayoutSimple'));
  454. }
  455. $this->appender->activateOptions();
  456. }
  457. array_pop($this->state);
  458. break;
  459. case 'FILTER' :
  460. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':FILTER':
  461. LoggerLog::debug("LoggerDOMConfigurator::tagClose() FILTER");
  462. if ($this->filter !== null) {
  463. $this->filter->activateOptions();
  464. $this->appender->addFilter($this->filter);
  465. $this->filter = null;
  466. }
  467. array_pop($this->state);
  468. break;
  469. case 'LAYOUT':
  470. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':LAYOUT':
  471. LoggerLog::debug("LoggerDOMConfigurator::tagClose() LAYOUT");
  472. if ($this->appender !== null and $this->layout !== null and $this->appender->requiresLayout()) {
  473. $this->layout->activateOptions();
  474. $this->appender->setLayout($this->layout);
  475. $this->layout = null;
  476. }
  477. array_pop($this->state);
  478. break;
  479. case 'LOGGER':
  480. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':LOGGER':
  481. LoggerLog::debug("LoggerDOMConfigurator::tagClose() LOGGER");
  482. array_pop($this->state);
  483. break;
  484. case 'ROOT':
  485. case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':ROOT':
  486. LoggerLog::debug("LoggerDOMConfigurator::tagClose() ROOT");
  487. array_pop($this->state);
  488. break;
  489. }
  490. }
  491. /**
  492. * @param object $object
  493. * @param string $name
  494. * @param mixed $value
  495. */
  496. function setter(&$object, $name, $value)
  497. {
  498. if (empty($name)) {
  499. LoggerLog::debug("LoggerDOMConfigurator::setter() 'name' param cannot be empty");
  500. return false;
  501. }
  502. $methodName = 'set'.ucfirst($name);
  503. if (method_exists($object, $methodName)) {
  504. LoggerLog::debug("LoggerDOMConfigurator::setter() Calling ".get_class($object)."::{$methodName}({$value})");
  505. return call_user_func(array(&$object, $methodName), $value);
  506. } else {
  507. LoggerLog::warn("LoggerDOMConfigurator::setter() ".get_class($object)."::{$methodName}() does not exists");
  508. return false;
  509. }
  510. }
  511. function subst($value)
  512. {
  513. return LoggerOptionConverter::substVars($value);
  514. }
  515. }
  516. ?>