loggerdomconfigurator.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 612 行 · 第 1/2 页
SVN-BASE
612 行
<?php/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * * @package log4php * @subpackage xml *//** * @ignore */if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..'); require_once(LOG4PHP_DIR . '/helpers/LoggerOptionConverter.php');require_once(LOG4PHP_DIR . '/or/LoggerObjectRenderer.php');require_once(LOG4PHP_DIR . '/spi/LoggerConfigurator.php');require_once(LOG4PHP_DIR . '/LoggerAppender.php');require_once(LOG4PHP_DIR . '/LoggerLayout.php');require_once(LOG4PHP_DIR . '/LoggerLog.php');require_once(LOG4PHP_DIR . '/LoggerManager.php');define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_APPENDER_STATE', 1000);define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_LAYOUT_STATE', 1010);define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE', 1020);define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE', 1030);define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_FILTER_STATE', 1040);define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_FILENAME', './log4php.xml');/** * @var string the default configuration document */define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_CONFIGURATION', '<?xml version="1.0" ?><log4php:configuration threshold="all"> <appender name="A1" class="LoggerAppenderEcho"> <layout class="LoggerLayoutSimple" /> </appender> <root> <level value="debug" /> <appender_ref ref="A1" /> </root></log4php:configuration>');/** * @var string the elements namespace */define('LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS', 'HTTP://LOGGING.APACHE.ORG/LOG4PHP/'); /** * Use this class to initialize the log4php environment using expat parser. * * <p>Read the log4php.dtd included in the documentation directory. Note that * php parser does not validate the document.</p> * * <p>Sometimes it is useful to see how log4php is reading configuration * files. You can enable log4php internal logging by setting the <var>debug</var> * attribute in the <var>log4php:configuration</var> element. As in * <pre> * <log4php:configuration <b>debug="true"</b> xmlns:log4php="http://logging.apache.org/log4php/"> * ... * </log4php:configuration> * </pre> * * <p>There are sample XML files included in the package under <b>tests/</b> * subdirectories.</p> * * @author Marco Vassura * @author Knut Urdalen <knut.urdalen@gmail.com> * @version $Revision: 635069 $ * @package log4php * @subpackage xml * @since 0.4 */class LoggerDOMConfigurator implements LoggerConfigurator { /** * @var LoggerHierarchy */ var $repository; /** * @var array state stack */ var $state; /** * @var Logger parsed Logger */ var $logger; /** * @var LoggerAppender parsed LoggerAppender */ var $appender; /** * @var LoggerFilter parsed LoggerFilter */ var $filter; /** * @var LoggerLayout parsed LoggerLayout */ var $layout; /** * Constructor */ function LoggerDOMConfigurator() { $this->state = array(); $this->logger = null; $this->appender = null; $this->filter = null; $this->layout = null; } /** * Configure the default repository using the resource pointed by <b>url</b>. * <b>Url</b> is any valid resource as defined in {@link PHP_MANUAL#file} function. * Note that the resource will be search with <i>use_include_path</i> parameter * set to "1". * * @param string $url * @static */ public static function configure($url = '') { $configurator = new LoggerDOMConfigurator(); $repository =& LoggerManager::getLoggerRepository(); return $configurator->doConfigure($url, $repository); } /** * Configure the given <b>repository</b> using the resource pointed by <b>url</b>. * <b>Url</b> is any valid resurce as defined in {@link PHP_MANUAL#file} function. * Note that the resource will be search with <i>use_include_path</i> parameter * set to "1". * * @param string $url * @param LoggerHierarchy &$repository */ function doConfigure($url = '', &$repository) { $xmlData = ''; if (!empty($url)) $xmlData = implode('', file($url, 1)); return $this->doConfigureByString($xmlData, $repository); } /** * Configure the given <b>repository</b> using the configuration written in <b>xmlData</b>. * Do not call this method directly. Use {@link doConfigure()} instead. * @param string $xmlData * @param LoggerHierarchy &$repository */ function doConfigureByString($xmlData, &$repository) { return $this->parse($xmlData, $repository); } /** * @param LoggerHierarchy &$repository */ function doConfigureDefault(&$repository) { return $this->doConfigureByString(LOG4PHP_LOGGER_DOM_CONFIGURATOR_DEFAULT_CONFIGURATION, $repository); } /** * @param string $xmlData */ function parse($xmlData, &$repository) { // LoggerManager::resetConfiguration(); $this->repository =& $repository; $parser = xml_parser_create_ns(); xml_set_object($parser, $this); xml_set_element_handler($parser, "tagOpen", "tagClose"); $result = xml_parse($parser, $xmlData, true); if (!$result) { $errorCode = xml_get_error_code($parser); $errorStr = xml_error_string($errorCode); $errorLine = xml_get_current_line_number($parser); LoggerLog::warn( "LoggerDOMConfigurator::parse() ". "Parsing error [{$errorCode}] {$errorStr}, line {$errorLine}" ); $this->repository->resetConfiguration(); } else { xml_parser_free($parser); } return $result; } /** * @param mixed $parser * @param string $tag * @param array $attribs * * @todo In 'LOGGER' case find a better way to detect 'getLogger()' method */ function tagOpen($parser, $tag, $attribs) { switch ($tag) { case 'CONFIGURATION' : case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':CONFIGURATION': LoggerLog::debug("LoggerDOMConfigurator::tagOpen() CONFIGURATION"); if (isset($attribs['THRESHOLD'])) { $this->repository->setThreshold( LoggerOptionConverter::toLevel( $this->subst($attribs['THRESHOLD']), $this->repository->getThreshold() ) ); } if (isset($attribs['DEBUG'])) { $debug = LoggerOptionConverter::toBoolean($this->subst($attribs['DEBUG']), LoggerLog::internalDebugging()); $this->repository->debug = $debug; LoggerLog::internalDebugging($debug); LoggerLog::debug("LoggerDOMConfigurator::tagOpen() LOG4PHP:CONFIGURATION. Internal Debug turned ".($debug ? 'on':'off')); } break; case 'APPENDER' : case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER': unset($this->appender); $this->appender = null; $name = $this->subst(@$attribs['NAME']); $class = $this->subst(@$attribs['CLASS']); LoggerLog::debug("LoggerDOMConfigurator::tagOpen():tag=[$tag]:name=[$name]:class=[$class]"); $this->appender =& LoggerAppender::singleton($name, $class); if ($this->appender === null) { LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER cannot instantiate appender '$name'"); } $this->state[] = LOG4PHP_LOGGER_DOM_CONFIGURATOR_APPENDER_STATE; break; case 'APPENDER_REF' : case 'APPENDER-REF' : case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER_REF': case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':APPENDER-REF': if (isset($attribs['REF']) and !empty($attribs['REF'])) { $appenderName = $this->subst($attribs['REF']); LoggerLog::debug("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref='$appenderName'"); $appender =& LoggerAppender::singleton($appenderName); if ($appender !== null) { switch (end($this->state)) { case LOG4PHP_LOGGER_DOM_CONFIGURATOR_LOGGER_STATE: case LOG4PHP_LOGGER_DOM_CONFIGURATOR_ROOT_STATE: $this->logger->addAppender($appender); break; } } else { LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref '$appenderName' points to a null appender"); } } else { LoggerLog::warn("LoggerDOMConfigurator::tagOpen() APPENDER-REF ref not set or empty"); } break; case 'FILTER' : case LOG4PHP_LOGGER_DOM_CONFIGURATOR_XMLNS.':FILTER': LoggerLog::debug("LoggerDOMConfigurator::tagOpen() FILTER"); unset($this->filter); $this->filter = null; $filterName = basename($this->subst(@$attribs['CLASS'])); if (!empty($filterName)) { if (!class_exists($filterName)) { @include_once(LOG4PHP_DIR . "/varia/{$filterName}.php"); } if (class_exists($filterName)) { $this->filter = new $filterName();
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?