You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							654 lines
						
					
					
						
							26 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							654 lines
						
					
					
						
							26 KiB
						
					
					
				
								<?php
							 | 
						|
								/**
							 | 
						|
								 * log4php is a PHP port of the log4j java logging package.
							 | 
						|
								 * 
							 | 
						|
								 * <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
							 | 
						|
								 * <p>Design, strategies and part of the methods documentation are developed by log4j team 
							 | 
						|
								 * (Ceki Gülcü as log4j project founder and 
							 | 
						|
								 * {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
							 | 
						|
								 *
							 | 
						|
								 * <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
							 | 
						|
								 * For more information, please see {@link http://www.vxr.it/log4php/}.</p>
							 | 
						|
								 *
							 | 
						|
								 * <p>This software is published under the terms of the LGPL License
							 | 
						|
								 * a copy of which has been included with this distribution in the LICENSE file.</p>
							 | 
						|
								 * 
							 | 
						|
								 * @package log4php
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * @ignore
							 | 
						|
								 */
							 | 
						|
								if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__));
							 | 
						|
								
							 | 
						|
								require_once(LOG4PHP_DIR . '/config/LoggerPropertySetter.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/helpers/LoggerOptionConverter.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/or/LoggerObjectRenderer.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/or/LoggerRendererMap.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/spi/LoggerConfigurator.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/spi/LoggerFilter.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/LoggerAppender.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/LoggerDefaultCategoryFactory.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/LoggerLayout.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/LoggerLevel.php');
							 | 
						|
								require_once(LOG4PHP_DIR . '/LoggerManager.php');
							 | 
						|
								
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_CATEGORY_PREFIX',      "log4php.category.");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_PREFIX',        "log4php.logger.");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_FACTORY_PREFIX',       "log4php.factory");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ADDITIVITY_PREFIX',    "log4php.additivity.");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_CATEGORY_PREFIX', "log4php.rootCategory");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_LOGGER_PREFIX',   "log4php.rootLogger");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_APPENDER_PREFIX',      "log4php.appender.");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_RENDERER_PREFIX',      "log4php.renderer.");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_THRESHOLD_PREFIX',     "log4php.threshold");
							 | 
						|
								
							 | 
						|
								/** 
							 | 
						|
								 * Key for specifying the {@link LoggerFactory}.  
							 | 
						|
								 */
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_FACTORY_KEY',   "log4php.loggerFactory");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_DEBUG_KEY',     "log4php.debug");
							 | 
						|
								define('LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_INTERNAL_ROOT_NAME',   "root");
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Allows the configuration of log4php from an external file.
							 | 
						|
								 * 
							 | 
						|
								 * See {@link doConfigure()} for the expected format.
							 | 
						|
								 * 
							 | 
						|
								 * <p>It is sometimes useful to see how log4php is reading configuration
							 | 
						|
								 * files. You can enable log4php internal logging by defining the
							 | 
						|
								 * <b>log4php.debug</b> variable.</p>
							 | 
						|
								 *
							 | 
						|
								 * <p>The <i>LoggerPropertyConfigurator</i> does not handle the
							 | 
						|
								 * advanced configuration features supported by the {@link LoggerDOMConfigurator} 
							 | 
						|
								 * such as support for {@link LoggerFilter}, 
							 | 
						|
								   custom {@link LoggerErrorHandlers}, nested appenders such as the 
							 | 
						|
								   {@link Logger AsyncAppender}, 
							 | 
						|
								 * etc.
							 | 
						|
								 * 
							 | 
						|
								 * <p>All option <i>values</i> admit variable substitution. The
							 | 
						|
								 * syntax of variable substitution is similar to that of Unix
							 | 
						|
								 * shells. The string between an opening <b>"${"</b> and
							 | 
						|
								 * closing <b>"}"</b> is interpreted as a key. The value of
							 | 
						|
								 * the substituted variable can be defined as a system property or in
							 | 
						|
								 * the configuration file itself. The value of the key is first
							 | 
						|
								 * searched in the defined constants, in the enviroments variables
							 | 
						|
								 * and if not found there, it is
							 | 
						|
								 * then searched in the configuration file being parsed.  The
							 | 
						|
								 * corresponding value replaces the ${variableName} sequence.</p>
							 | 
						|
								 * <p>For example, if <b>$_ENV['home']</b> env var is set to
							 | 
						|
								 * <b>/home/xyz</b>, then every occurrence of the sequence
							 | 
						|
								 * <b>${home}</b> will be interpreted as
							 | 
						|
								 * <b>/home/xyz</b>. See {@link LoggerOptionConverter::getSystemProperty()}
							 | 
						|
								 * for details.</p>
							 | 
						|
								 *
							 | 
						|
								 * @author VxR <vxr@vxr.it>
							 | 
						|
								 * @version $Revision: 1.1 $
							 | 
						|
								 * @package log4php
							 | 
						|
								 * @since 0.5 
							 | 
						|
								 */
							 | 
						|
								class LoggerPropertyConfigurator extends LoggerConfigurator {
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @var LoggerFactory
							 | 
						|
								     */
							 | 
						|
								    var $loggerFactory = null;
							 | 
						|
								    
							 | 
						|
								    /**
							 | 
						|
								     * Constructor
							 | 
						|
								     */
							 | 
						|
								    function LoggerPropertyConfigurator()
							 | 
						|
								    {
							 | 
						|
								        $this->loggerFactory = new LoggerDefaultCategoryFactory();
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /**
							 | 
						|
								     * Configure the default repository 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
							 | 
						|
								     * @return boolean configuration result
							 | 
						|
								     * @static
							 | 
						|
								     */
							 | 
						|
								    function configure($url = '')
							 | 
						|
								    {
							 | 
						|
								        $configurator = new LoggerPropertyConfigurator();
							 | 
						|
								        $repository =& LoggerManager::getLoggerRepository();
							 | 
						|
								        return $configurator->doConfigure($url, $repository);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Read configuration from a file.
							 | 
						|
								     *
							 | 
						|
								     * <p>The function {@link PHP_MANUAL#parse_ini_file} is used to read the
							 | 
						|
								     * file.</p>
							 | 
						|
								     *
							 | 
						|
								     * <b>The existing configuration is not cleared nor reset.</b> 
							 | 
						|
								     * If you require a different behavior, then call 
							 | 
						|
								     * {@link  LoggerManager::resetConfiguration()} 
							 | 
						|
								     * method before calling {@link doConfigure()}.
							 | 
						|
								     * 
							 | 
						|
								     * <p>The configuration file consists of statements in the format
							 | 
						|
								     * <b>key=value</b>. The syntax of different configuration
							 | 
						|
								     * elements are discussed below.
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>Repository-wide threshold</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>The repository-wide threshold filters logging requests by level
							 | 
						|
								     * regardless of logger. The syntax is:
							 | 
						|
								     * 
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.threshold=[level]
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p>The level value can consist of the string values OFF, FATAL,
							 | 
						|
								     * ERROR, WARN, INFO, DEBUG, ALL or a <i>custom level</i> value. A
							 | 
						|
								     * custom level value can be specified in the form
							 | 
						|
								     * <samp>level#classname</samp>. By default the repository-wide threshold is set
							 | 
						|
								     * to the lowest possible value, namely the level <b>ALL</b>.
							 | 
						|
								     * </p>
							 | 
						|
								     * 
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>Appender configuration</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>Appender configuration syntax is:</p>
							 | 
						|
								     * <pre>
							 | 
						|
								     * ; For appender named <i>appenderName</i>, set its class.
							 | 
						|
								     * ; Note: The appender name can contain dots.
							 | 
						|
								     * log4php.appender.appenderName=name_of_appender_class
							 | 
						|
								     * 
							 | 
						|
								     * ; Set appender specific options.
							 | 
						|
								     * 
							 | 
						|
								     * log4php.appender.appenderName.option1=value1
							 | 
						|
								     * log4php.appender.appenderName.optionN=valueN
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * For each named appender you can configure its {@link LoggerLayout}. The
							 | 
						|
								     * syntax for configuring an appender's layout is:
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.appender.appenderName.layout=name_of_layout_class
							 | 
						|
								     * log4php.appender.appenderName.layout.option1=value1
							 | 
						|
								     *  ....
							 | 
						|
								     * log4php.appender.appenderName.layout.optionN=valueN
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>Configuring loggers</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>The syntax for configuring the root logger is:
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.rootLogger=[level], appenderName, appenderName, ...
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p>This syntax means that an optional <i>level</i> can be
							 | 
						|
								     * supplied followed by appender names separated by commas.
							 | 
						|
								     * 
							 | 
						|
								     * <p>The level value can consist of the string values OFF, FATAL,
							 | 
						|
								     * ERROR, WARN, INFO, DEBUG, ALL or a <i>custom level</i> value. A
							 | 
						|
								     * custom level value can be specified in the form</p>
							 | 
						|
								     *
							 | 
						|
								     * <pre>level#classname</pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p>If a level value is specified, then the root level is set
							 | 
						|
								     * to the corresponding level.  If no level value is specified,
							 | 
						|
								     * then the root level remains untouched.
							 | 
						|
								     * 
							 | 
						|
								     * <p>The root logger can be assigned multiple appenders.
							 | 
						|
								     * 
							 | 
						|
								     * <p>Each <i>appenderName</i> (separated by commas) will be added to
							 | 
						|
								     * the root logger. The named appender is defined using the
							 | 
						|
								     * appender syntax defined above.
							 | 
						|
								     * 
							 | 
						|
								     * <p>For non-root categories the syntax is almost the same:
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.logger.logger_name=[level|INHERITED|NULL], appenderName, appenderName, ...
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p>The meaning of the optional level value is discussed above
							 | 
						|
								     * in relation to the root logger. In addition however, the value
							 | 
						|
								     * INHERITED can be specified meaning that the named logger should
							 | 
						|
								     * inherit its level from the logger hierarchy.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>If no level value is supplied, then the level of the
							 | 
						|
								     * named logger remains untouched.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>By default categories inherit their level from the
							 | 
						|
								     * hierarchy. However, if you set the level of a logger and later
							 | 
						|
								     * decide that that logger should inherit its level, then you should
							 | 
						|
								     * specify INHERITED as the value for the level value. NULL is a
							 | 
						|
								     * synonym for INHERITED.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>Similar to the root logger syntax, each <i>appenderName</i>
							 | 
						|
								     * (separated by commas) will be attached to the named logger.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>See the <i>appender additivity rule</i> in the user manual for 
							 | 
						|
								     * the meaning of the <b>additivity</b> flag.
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>ObjectRenderers</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>You can customize the way message objects of a given type are
							 | 
						|
								     * converted to String before being logged. This is done by
							 | 
						|
								     * specifying a {@link LoggerObjectRenderer}
							 | 
						|
								     * for the object type would like to customize.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>The syntax is:
							 | 
						|
								     * 
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.renderer.name_of_rendered_class=name_of_rendering.class
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * As in,
							 | 
						|
								     * <pre>
							 | 
						|
								     * log4php.renderer.myFruit=myFruitRenderer
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>Logger Factories</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * The usage of custom logger factories is discouraged and no longer
							 | 
						|
								     * documented.
							 | 
						|
								     * 
							 | 
						|
								     * <p><b>Example</b></p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>An example configuration is given below. Other configuration
							 | 
						|
								     * file examples are given in the <b>tests</b> folder.
							 | 
						|
								     * 
							 | 
						|
								     * <pre>
							 | 
						|
								     * ; Set options for appender named "A1".
							 | 
						|
								     * ; Appender "A1" will be a SyslogAppender
							 | 
						|
								     * log4php.appender.A1=SyslogAppender
							 | 
						|
								     * 
							 | 
						|
								     * ; The syslog daemon resides on www.abc.net
							 | 
						|
								     * log4php.appender.A1.SyslogHost=www.abc.net
							 | 
						|
								     * 
							 | 
						|
								     * ; A1's layout is a LoggerPatternLayout, using the conversion pattern
							 | 
						|
								     * ; <b>%r %-5p %c{2} %M.%L %x - %m%n</b>. Thus, the log output will
							 | 
						|
								     * ; include the relative time since the start of the application in
							 | 
						|
								     * ; milliseconds, followed by the level of the log request,
							 | 
						|
								     * ; followed by the two rightmost components of the logger name,
							 | 
						|
								     * ; followed by the callers method name, followed by the line number,
							 | 
						|
								     * ; the nested disgnostic context and finally the message itself.
							 | 
						|
								     * ; Refer to the documentation of LoggerPatternLayout} for further information
							 | 
						|
								     * ; on the syntax of the ConversionPattern key.
							 | 
						|
								     * log4php.appender.A1.layout=LoggerPatternLayout
							 | 
						|
								     * log4php.appender.A1.layout.ConversionPattern="%-4r %-5p %c{2} %M.%L %x - %m%n"
							 | 
						|
								     * 
							 | 
						|
								     * ; Set options for appender named "A2"
							 | 
						|
								     * ; A2 should be a LoggerAppenderRollingFile, with maximum file size of 10 MB
							 | 
						|
								     * ; using at most one backup file. A2's layout is TTCC, using the
							 | 
						|
								     * ; ISO8061 date format with context printing enabled.
							 | 
						|
								     * log4php.appender.A2=LoggerAppenderRollingFile
							 | 
						|
								     * log4php.appender.A2.MaxFileSize=10MB
							 | 
						|
								     * log4php.appender.A2.MaxBackupIndex=1
							 | 
						|
								     * log4php.appender.A2.layout=LoggerLayoutTTCC
							 | 
						|
								     * log4php.appender.A2.layout.ContextPrinting="true"
							 | 
						|
								     * log4php.appender.A2.layout.DateFormat="%c"
							 | 
						|
								     * 
							 | 
						|
								     * ; Root logger set to DEBUG using the A2 appender defined above.
							 | 
						|
								     * log4php.rootLogger=DEBUG, A2
							 | 
						|
								     * 
							 | 
						|
								     * ; Logger definitions:
							 | 
						|
								     * ; The SECURITY logger inherits is level from root. However, it's output
							 | 
						|
								     * ; will go to A1 appender defined above. It's additivity is non-cumulative.
							 | 
						|
								     * log4php.logger.SECURITY=INHERIT, A1
							 | 
						|
								     * log4php.additivity.SECURITY=false
							 | 
						|
								     * 
							 | 
						|
								     * ; Only warnings or above will be logged for the logger "SECURITY.access".
							 | 
						|
								     * ; Output will go to A1.
							 | 
						|
								     * log4php.logger.SECURITY.access=WARN
							 | 
						|
								     * 
							 | 
						|
								     * 
							 | 
						|
								     * ; The logger "class.of.the.day" inherits its level from the
							 | 
						|
								     * ; logger hierarchy.  Output will go to the appender's of the root
							 | 
						|
								     * ; logger, A2 in this case.
							 | 
						|
								     * log4php.logger.class.of.the.day=INHERIT
							 | 
						|
								     * </pre>
							 | 
						|
								     * 
							 | 
						|
								     * <p>Refer to the <b>setOption</b> method in each Appender and
							 | 
						|
								     * Layout for class specific options.</p>
							 | 
						|
								     * 
							 | 
						|
								     * <p>Use the <b>";"</b> character at the
							 | 
						|
								     * beginning of a line for comments.</p>
							 | 
						|
								     * 
							 | 
						|
								     * @param string $url The name of the configuration file where the
							 | 
						|
								     *                    configuration information is stored.
							 | 
						|
								     * @param LoggerHierarchy &$repository the repository to apply the configuration
							 | 
						|
								     */
							 | 
						|
								    function doConfigure($url, &$repository)
							 | 
						|
								    {
							 | 
						|
								        $properties = @parse_ini_file($url);
							 | 
						|
								        if ($properties === false) {
							 | 
						|
								            LoggerLog::warn("LoggerPropertyConfigurator::doConfigure() cannot load '$url' configuration.");
							 | 
						|
								            return false; 
							 | 
						|
								        }
							 | 
						|
								        return $this->doConfigureProperties($properties, $repository);
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Read configuration options from <b>properties</b>.
							 | 
						|
								     *
							 | 
						|
								     * @see doConfigure().
							 | 
						|
								     * @param array $properties
							 | 
						|
								     * @param LoggerHierarchy &$hierarchy
							 | 
						|
								     */
							 | 
						|
								    function doConfigureProperties($properties, &$hierarchy)
							 | 
						|
								    {
							 | 
						|
										if(array_key_exists(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_DEBUG_KEY, $properties))
							 | 
						|
								    		$value = @$properties[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_DEBUG_KEY];
							 | 
						|
										
							 | 
						|
								        if (!empty($value)) {
							 | 
						|
								            LoggerLog::internalDebugging(LoggerOptionConverter::toBoolean($value, LoggerLog::internalDebugging()));
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        $thresholdStr = null;
							 | 
						|
										if(array_key_exists(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_THRESHOLD_PREFIX, $properties))
							 | 
						|
								        	$thresholdStr = @$properties[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_THRESHOLD_PREFIX];
							 | 
						|
								        $hierarchy->setThreshold(LoggerOptionConverter::toLevel($thresholdStr, LoggerLevel::getLevelAll()));
							 | 
						|
								        
							 | 
						|
								        $this->configureRootCategory($properties, $hierarchy);
							 | 
						|
								        $this->configureLoggerFactory($properties);
							 | 
						|
								        $this->parseCatsAndRenderers($properties, $hierarchy);
							 | 
						|
								
							 | 
						|
								        LoggerLog::debug("LoggerPropertyConfigurator::doConfigureProperties() Finished configuring.");
							 | 
						|
								        
							 | 
						|
								        return true;
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    // --------------------------------------------------------------------------
							 | 
						|
								    // Internal stuff
							 | 
						|
								    // --------------------------------------------------------------------------
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Check the provided <b>Properties</b> object for a
							 | 
						|
								     * {@link LoggerFactory} entry specified by 
							 | 
						|
								     * {@link LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_FACTORY_KEY}.
							 | 
						|
								     *  
							 | 
						|
								     * If such an entry exists, an attempt is made to create an instance using 
							 | 
						|
								     * the default constructor.  
							 | 
						|
								     * This instance is used for subsequent Category creations
							 | 
						|
								     * within this configurator.
							 | 
						|
								     *
							 | 
						|
								     * @see parseCatsAndRenderers()
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     */
							 | 
						|
								    function configureLoggerFactory($props)
							 | 
						|
								    {
							 | 
						|
										if(array_key_exists(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_FACTORY_KEY, $props))
							 | 
						|
								        	$factoryFqcn = @$props[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_FACTORY_KEY];
							 | 
						|
								        if(!empty($factoryFqcn)) {
							 | 
						|
								            $factoryClassName = basename($factoryFqcn);
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::configureLoggerFactory() Trying to load factory [" .
							 | 
						|
								                $factoryClassName . 
							 | 
						|
								                "]."
							 | 
						|
								            );
							 | 
						|
								            
							 | 
						|
								            if (!class_exists($factoryClassName))
							 | 
						|
								                @include_once("{$factoryFqcn}.php");
							 | 
						|
								            if (class_exists($factoryClassName)) {
							 | 
						|
								                $loggerFactory = new $factoryClassName();
							 | 
						|
								            } else {
							 | 
						|
								                LoggerLog::debug(
							 | 
						|
								                    "LoggerPropertyConfigurator::configureLoggerFactory() Unable to load factory [" .
							 | 
						|
								                    $factoryClassName . 
							 | 
						|
								                    "]. Using default."
							 | 
						|
								                );
							 | 
						|
								                $loggerFactory = $this->loggerFactory;
							 | 
						|
								            }
							 | 
						|
								
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::configureLoggerFactory() ".
							 | 
						|
								                "Setting properties for category factory [" . get_class($loggerFactory) . "]."
							 | 
						|
								            );
							 | 
						|
								            
							 | 
						|
								            LoggerPropertySetter::setPropertiesByObject($loggerFactory, $props, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_FACTORY_PREFIX . ".");
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								    
							 | 
						|
								    /**
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     * @param LoggerHierarchy &$hierarchy
							 | 
						|
								     */
							 | 
						|
								    function configureRootCategory($props, &$hierarchy)
							 | 
						|
								    {
							 | 
						|
								        $effectivePrefix = LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_LOGGER_PREFIX;
							 | 
						|
								        $value = @$props[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_LOGGER_PREFIX];
							 | 
						|
								
							 | 
						|
								        if(empty($value)) {
							 | 
						|
								            $value = @$props[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_CATEGORY_PREFIX];
							 | 
						|
								            $effectivePrefix = LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ROOT_CATEGORY_PREFIX;
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        if (empty($value)) {
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::configureRootCategory() ".
							 | 
						|
								                "Could not find root logger information. Is this OK?"
							 | 
						|
								            );
							 | 
						|
								        } else {
							 | 
						|
								            $root =& $hierarchy->getRootLogger();
							 | 
						|
								            // synchronized(root) {
							 | 
						|
								        	$this->parseCategory(
							 | 
						|
								                $props, 
							 | 
						|
								                $root, 
							 | 
						|
								                $effectivePrefix, 
							 | 
						|
								                LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_INTERNAL_ROOT_NAME, 
							 | 
						|
								                $value
							 | 
						|
								            );
							 | 
						|
								            // }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Parse non-root elements, such non-root categories and renderers.
							 | 
						|
								     *
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     * @param LoggerHierarchy &$hierarchy
							 | 
						|
								     */
							 | 
						|
								    function parseCatsAndRenderers($props, &$hierarchy)
							 | 
						|
								    {
							 | 
						|
								        while(list($key,$value) = each($props)) {
							 | 
						|
								            if( strpos($key, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_CATEGORY_PREFIX) === 0 or 
							 | 
						|
								                strpos($key, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_PREFIX) === 0) {
							 | 
						|
									            if(strpos($key, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_CATEGORY_PREFIX) === 0) {
							 | 
						|
								                    $loggerName = substr($key, strlen(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_CATEGORY_PREFIX));
							 | 
						|
									            } elseif (strpos($key, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_PREFIX) === 0) {
							 | 
						|
								                    $loggerName = substr($key, strlen(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_PREFIX));
							 | 
						|
								                }
							 | 
						|
								                $logger =& $hierarchy->getLogger($loggerName, $this->loggerFactory);
							 | 
						|
									            // synchronized(logger) {
							 | 
						|
									            $this->parseCategory($props, $logger, $key, $loggerName, $value);
							 | 
						|
								        	    $this->parseAdditivityForLogger($props, $logger, $loggerName);
							 | 
						|
									            // }
							 | 
						|
								            } elseif (strpos($key, LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_RENDERER_PREFIX) === 0) {
							 | 
						|
								                $renderedClass = substr($key, strlen(LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_RENDERER_PREFIX));
							 | 
						|
									            $renderingClass = $value;
							 | 
						|
								            	if (method_exists($hierarchy, 'addrenderer')) {
							 | 
						|
									                LoggerRendererMap::addRenderer($hierarchy, $renderedClass, $renderingClass);
							 | 
						|
								                }
							 | 
						|
									        }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * Parse the additivity option for a non-root category.
							 | 
						|
								     *
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     * @param Logger &$cat
							 | 
						|
								     * @param string $loggerName
							 | 
						|
								     */
							 | 
						|
								    function parseAdditivityForLogger($props, &$cat, $loggerName)
							 | 
						|
								    {
							 | 
						|
								        $value = LoggerOptionConverter::findAndSubst(
							 | 
						|
								                    LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ADDITIVITY_PREFIX . $loggerName,
							 | 
						|
													$props
							 | 
						|
								                 );
							 | 
						|
								        LoggerLog::debug(
							 | 
						|
								            "LoggerPropertyConfigurator::parseAdditivityForLogger() ".
							 | 
						|
								            "Handling " . LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_ADDITIVITY_PREFIX . $loggerName . "=[{$value}]"
							 | 
						|
								        );
							 | 
						|
								        // touch additivity only if necessary
							 | 
						|
								        if(!empty($value)) {
							 | 
						|
								            $additivity = LoggerOptionConverter::toBoolean($value, true);
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAdditivityForLogger() ".
							 | 
						|
								                "Setting additivity for [{$loggerName}] to [{$additivity}]"
							 | 
						|
								            );
							 | 
						|
								            $cat->setAdditivity($additivity);
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * This method must work for the root category as well.
							 | 
						|
								     *
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     * @param Logger &$logger
							 | 
						|
								     * @param string $optionKey
							 | 
						|
								     * @param string $loggerName
							 | 
						|
								     * @param string $value
							 | 
						|
								     * @return Logger
							 | 
						|
								     */
							 | 
						|
								    function &parseCategory($props, &$logger, $optionKey, $loggerName, $value)
							 | 
						|
								    {
							 | 
						|
								        LoggerLog::debug(
							 | 
						|
								            "LoggerPropertyConfigurator::parseCategory() ".
							 | 
						|
								            "Parsing for [{$loggerName}] with value=[{$value}]."
							 | 
						|
								        );
							 | 
						|
								        
							 | 
						|
								        // We must skip over ',' but not white space
							 | 
						|
								        $st = explode(',', $value);
							 | 
						|
								
							 | 
						|
								        // If value is not in the form ", appender.." or "", then we should set
							 | 
						|
								        // the level of the loggeregory.
							 | 
						|
								
							 | 
						|
								        if(!(@$value{0} == ',' || empty($value))) {
							 | 
						|
								            // just to be on the safe side...
							 | 
						|
								            if(sizeof($st) == 0)
							 | 
						|
									            return;
							 | 
						|
								                
							 | 
						|
								            $levelStr = current($st);
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseCategory() ".
							 | 
						|
								                "Level token is [$levelStr]."
							 | 
						|
								            );
							 | 
						|
								
							 | 
						|
								            // If the level value is inherited, set category level value to
							 | 
						|
								            // null. We also check that the user has not specified inherited for the
							 | 
						|
								            // root category.
							 | 
						|
								            if('INHERITED' == strtoupper($levelStr) || 'NULL' == strtoupper($levelStr)) {
							 | 
						|
								        	    if ($loggerName == LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_INTERNAL_ROOT_NAME) {
							 | 
						|
								                    LoggerLog::warn(
							 | 
						|
								                        "LoggerPropertyConfigurator::parseCategory() ".
							 | 
						|
								                        "The root logger cannot be set to null."
							 | 
						|
								                    );
							 | 
						|
									            } else {
							 | 
						|
									                $logger->setLevel(null);
							 | 
						|
									            }
							 | 
						|
								            } else {
							 | 
						|
									            $logger->setLevel(LoggerOptionConverter::toLevel($levelStr, LoggerLevel::getLevelDebug()));
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								
							 | 
						|
								        // Begin by removing all existing appenders.
							 | 
						|
								        $logger->removeAllAppenders();
							 | 
						|
								        while($appenderName = next($st)) {
							 | 
						|
								            $appenderName = trim($appenderName);
							 | 
						|
								            if(empty($appenderName))
							 | 
						|
								                continue;
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseCategory() ".
							 | 
						|
								                "Parsing appender named [{$appenderName}]."
							 | 
						|
								            );
							 | 
						|
								            $appender =& $this->parseAppender($props, $appenderName);
							 | 
						|
								            if($appender !== null) {
							 | 
						|
									            $logger->addAppender($appender);
							 | 
						|
								            }
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    /**
							 | 
						|
								     * @param array $props array of properties
							 | 
						|
								     * @param string $appenderName
							 | 
						|
								     * @return LoggerAppender
							 | 
						|
								     */
							 | 
						|
								    function &parseAppender($props, $appenderName)
							 | 
						|
								    {
							 | 
						|
								        $appender =& LoggerAppender::singleton($appenderName);
							 | 
						|
								        if($appender !== null) {
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                "Appender [{$appenderName}] was already parsed."
							 | 
						|
								            );
							 | 
						|
								            return $appender;
							 | 
						|
								        }
							 | 
						|
								        // Appender was not previously initialized.
							 | 
						|
								        $prefix = LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_APPENDER_PREFIX . $appenderName;
							 | 
						|
								        $layoutPrefix = $prefix . ".layout";
							 | 
						|
								        $appenderClass = @$props[$prefix];
							 | 
						|
								        if (!empty($appenderClass)) {
							 | 
						|
								            $appender =& LoggerAppender::singleton($appenderName, $appenderClass);
							 | 
						|
								            if($appender === null) {
							 | 
						|
								                LoggerLog::warn(
							 | 
						|
								                    "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                    "Could not instantiate appender named [$appenderName]."
							 | 
						|
								                );
							 | 
						|
								                return null;
							 | 
						|
								            }
							 | 
						|
								        } else {
							 | 
						|
								            LoggerLog::warn(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                "Could not instantiate appender named [$appenderName] with null className."
							 | 
						|
								            );
							 | 
						|
								            return null;
							 | 
						|
								        }
							 | 
						|
								        
							 | 
						|
								        $appender->setName($appenderName);
							 | 
						|
								        if( $appender->requiresLayout() ) {
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                "Parsing layout section for [$appenderName]."
							 | 
						|
								            );
							 | 
						|
								            $layoutClass = @$props[$layoutPrefix];
							 | 
						|
								            $layoutClass = LoggerOptionConverter::substVars($layoutClass, $props);
							 | 
						|
								            if (empty($layoutClass)) {
							 | 
						|
								                LoggerLog::warn(
							 | 
						|
								                    "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                    "layout class is empty in '$layoutPrefix'. Using Simple layout"
							 | 
						|
								                );
							 | 
						|
								                $layout = LoggerLayout::factory('LoggerLayoutSimple');
							 | 
						|
								            } else {
							 | 
						|
								        	    $layout = LoggerLayout::factory($layoutClass);
							 | 
						|
								                
							 | 
						|
									            if($layout === null) {
							 | 
						|
									                LoggerLog::warn(
							 | 
						|
								                        "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                        "cannot create layout '$layoutClass'. Using Simple layout"
							 | 
						|
								                    );
							 | 
						|
								                    $layout = LoggerLayout::factory('LoggerLayoutSimple');
							 | 
						|
								                }
							 | 
						|
								            }
							 | 
						|
								            
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                "Parsing layout options for [$appenderName]."
							 | 
						|
								            );
							 | 
						|
								            LoggerPropertySetter::setPropertiesByObject($layout, $props, $layoutPrefix . ".");                
							 | 
						|
								            LoggerLog::debug(
							 | 
						|
								                "LoggerPropertyConfigurator::parseAppender() ".
							 | 
						|
								                "End Parsing layout options for [$appenderName]."
							 | 
						|
								            );
							 | 
						|
								            $appender->setLayout($layout);
							 | 
						|
								            
							 | 
						|
								        }
							 | 
						|
								        LoggerPropertySetter::setPropertiesByObject($appender, $props, $prefix . ".");
							 | 
						|
								        LoggerLog::debug(
							 | 
						|
								            "LoggerPropertyConfigurator::parseAppender() ".        
							 | 
						|
								            "Parsed [{$appenderName}] options."
							 | 
						|
								        );
							 | 
						|
								        return $appender;        
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								}
							 | 
						|
								?>
							 |