loggerpropertyconfigurator.php

来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· PHP 代码 · 共 674 行 · 第 1/2 页

PHP
674
字号
        return $this->doConfigureProperties($properties, $repository);
    }


    /**
     * Read configuration options from <b>properties</b>.
     *
     * @see doConfigure().
     * @param array $properties
     * @param LoggerHierarchy &$hierarchy
     */
    function doConfigureProperties($properties, &$hierarchy)
    {
        $value = null;

        if (isset($properties[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_DEBUG_KEY]))
        {
            $value = @$properties[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_DEBUG_KEY];
        }

        if (!empty($value)) {
            LoggerLog::internalDebugging(LoggerOptionConverter::toBoolean($value, LoggerLog::internalDebugging()));
        }

        $thresholdStr = '';
        if (isset($properties[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_THRESHOLD_PREFIX]))
        {
            $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)
    {
        $factoryFqcn = null;
        if (isset($props[LOG4PHP_LOGGER_PROPERTY_CONFIGURATOR_LOGGER_FACTORY_KEY]))
        {
            $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
     */
    public 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(!(empty($value) || @$value[0] == ',')) {
            // 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;
    }

}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?