loggeroptionconverter.php.svn-base
来自「PHP 知识管理系统(基于树结构的知识管理系统), 英文原版的PHP源码。」· SVN-BASE 代码 · 共 345 行
SVN-BASE
345 行
<?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 helpers *//** * @ignore */if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__) . '/..');require_once(LOG4PHP_DIR . '/LoggerLevel.php');define('LOG4PHP_OPTION_CONVERTER_DELIM_START', '${');define('LOG4PHP_OPTION_CONVERTER_DELIM_STOP', '}');define('LOG4PHP_OPTION_CONVERTER_DELIM_START_LEN', 2);define('LOG4PHP_OPTION_CONVERTER_DELIM_STOP_LEN', 1);/** * A convenience class to convert property values to specific types. * * @author Marco Vassura * @version $Revision: 635069 $ * @package log4php * @subpackage helpers * @static * @since 0.5 */class LoggerOptionConverter { /** * @param array $l * @param array $r * @return array * * @static */ public static function concatanateArrays($l, $r) { return array_merge($l, $r); } /** * Read a predefined var. * * It returns a value referenced by <var>$key</var> using this search criteria: * - if <var>$key</var> is a constant then return it. Else * - if <var>$key</var> is set in <var>$_ENV</var> then return it. Else * - return <var>$def</var>. * * @param string $key The key to search for. * @param string $def The default value to return. * @return string the string value of the system property, or the default * value if there is no property with that key. * * @static */ public static function getSystemProperty($key, $def) { LoggerLog::debug("LoggerOptionConverter::getSystemProperty():key=[{$key}]:def=[{$def}]."); if (defined($key)) { return (string)constant($key); } elseif (isset($_ENV[$key])) { return (string)$_ENV[$key]; } else { return $def; } } /** * If <var>$value</var> is <i>true</i>, then <i>true</i> is * returned. If <var>$value</var> is <i>false</i>, then * <i>true</i> is returned. Otherwise, <var>$default</var> is * returned. * * <p>Case of value is unimportant.</p> * * @param string $value * @param boolean $default * @return boolean * * @static */ public static function toBoolean($value, $default) { if($value === null) return $default; if ($value == 1) return true; $trimmedVal = strtolower(trim($value)); if ("true" == $trimmedVal or "yes" == $trimmedVal) return true; if ("false" == $trimmedVal) return false; return $default; } /** * @param string $value * @param integer $default * @return integer * @static */ public static function toInt($value, $default) { $value = trim($value); if (is_numeric($value)) { return (int)$value; } else { return $default; } } /** * Converts a standard or custom priority level to a Level * object. * * <p> If <var>$value</var> is of form "<b>level#full_file_classname</b>", * where <i>full_file_classname</i> means the class filename with path * but without php extension, then the specified class' <i>toLevel()</i> method * is called to process the specified level string; if no '#' * character is present, then the default {@link LoggerLevel} * class is used to process the level value.</p> * * <p>As a special case, if the <var>$value</var> parameter is * equal to the string "NULL", then the value <i>null</i> will * be returned.</p> * * <p>If any error occurs while converting the value to a level, * the <var>$defaultValue</var> parameter, which may be * <i>null</i>, is returned.</p> * * <p>Case of <var>$value</var> is insignificant for the level level, but is * significant for the class name part, if present.</p> * * @param string $value * @param LoggerLevel $defaultValue * @return LoggerLevel a {@link LoggerLevel} or null * @static */ public static function toLevel($value, $defaultValue) { if($value === null) return $defaultValue; $hashIndex = strpos($value, '#'); if ($hashIndex === false) { if("NULL" == strtoupper($value)) { return null; } else { // no class name specified : use standard Level class return LoggerLevel::toLevel($value, $defaultValue); } } $result = $defaultValue; $clazz = substr($value, ($hashIndex + 1)); $levelName = substr($value, 0, $hashIndex); // This is degenerate case but you never know. if("NULL" == strtoupper($levelName)) { return null; } LoggerLog::debug("LoggerOptionConverter::toLevel():class=[{$clazz}]:pri=[{$levelName}]"); if (!class_exists($clazz)) @include_once("{$clazz}.php"); $clazz = basename($clazz); if (class_exists($clazz)) { $result = @call_user_func(array($clazz, 'toLevel'), $levelName, $defaultValue); if (!is_a($result, 'loggerlevel')) { LoggerLog::debug("LoggerOptionConverter::toLevel():class=[{$clazz}] cannot call toLevel(). Returning default."); $result = $defaultValue; } } else { LoggerLog::warn("LoggerOptionConverter::toLevel() class '{$clazz}' doesnt exists."); } return $result; } /** * @param string $value * @param float $default * @return float * * @static */ public static function toFileSize($value, $default) { if ($value === null) return $default; $s = strtoupper(trim($value)); $multiplier = (float)1; if(($index = strpos($s, 'KB')) !== false) { $multiplier = 1024; $s = substr($s, 0, $index); } elseif(($index = strpos($s, 'MB')) !== false) { $multiplier = 1024 * 1024; $s = substr($s, 0, $index); } elseif(($index = strpos($s, 'GB')) !== false) { $multiplier = 1024 * 1024 * 1024; $s = substr($s, 0, $index); } if(is_numeric($s)) { return (float)$s * $multiplier; } else { LoggerLog::warn("LoggerOptionConverter::toFileSize() [{$s}] is not in proper form."); } return $default; } /** * Find the value corresponding to <var>$key</var> in * <var>$props</var>. Then perform variable substitution on the * found value. * * @param string $key * @param array $props * @return string * * @static */ public static function findAndSubst($key, $props) { $value = @$props[$key]; if(empty($value)) { return null; } return LoggerOptionConverter::substVars($value, $props); } /** * Perform variable substitution in string <var>$val</var> from the * values of keys found with the {@link getSystemProperty()} method. * * <p>The variable substitution delimeters are <b>${</b> and <b>}</b>. * * <p>For example, if the "MY_CONSTANT" contains "value", then * the call * <code> * $s = LoggerOptionConverter::substituteVars("Value of key is ${MY_CONSTANT}."); * </code> * will set the variable <i>$s</i> to "Value of key is value.".</p> * * <p>If no value could be found for the specified key, then the * <var>$props</var> parameter is searched, if the value could not * be found there, then substitution defaults to the empty string.</p> * * <p>For example, if {@link getSystemProperty()} cannot find any value for the key * "inexistentKey", then the call * <code> * $s = LoggerOptionConverter::substVars("Value of inexistentKey is [${inexistentKey}]"); * </code> * will set <var>$s</var> to "Value of inexistentKey is []".</p> * * <p>A warn is thrown if <var>$val</var> contains a start delimeter "${" * which is not balanced by a stop delimeter "}" and an empty string is returned.</p> * * @log4j-author Avy Sharell * * @param string $val The string on which variable substitution is performed. * @param array $props * @return string * * @static */ public static function substVars($val, $props = null) { LoggerLog::debug("LoggerOptionConverter::substVars():val=[{$val}]"); $sbuf = ''; $i = 0; while(true) { $j = strpos($val, LOG4PHP_OPTION_CONVERTER_DELIM_START, $i); if ($j === false) { LoggerLog::debug("LoggerOptionConverter::substVars() no more variables"); // no more variables if ($i == 0) { // this is a simple string LoggerLog::debug("LoggerOptionConverter::substVars() simple string"); return $val; } else { // add the tail string which contails no variables and return the result. $sbuf .= substr($val, $i); LoggerLog::debug("LoggerOptionConverter::substVars():sbuf=[{$sbuf}]. Returning sbuf"); return $sbuf; } } else { $sbuf .= substr($val, $i, $j-$i); LoggerLog::debug("LoggerOptionConverter::substVars():sbuf=[{$sbuf}]:i={$i}:j={$j}."); $k = strpos($val, LOG4PHP_OPTION_CONVERTER_DELIM_STOP, $j); if ($k === false) { LoggerLog::warn( "LoggerOptionConverter::substVars() " . "'{$val}' has no closing brace. Opening brace at position {$j}." ); return ''; } else { $j += LOG4PHP_OPTION_CONVERTER_DELIM_START_LEN; $key = substr($val, $j, $k - $j); // first try in System properties $replacement = LoggerOptionConverter::getSystemProperty($key, null); // then try props parameter if($replacement == null and $props !== null) { $replacement = @$props[$key]; } if(!empty($replacement)) { // Do variable substitution on the replacement string // such that we can solve "Hello ${x2}" as "Hello p1" // the where the properties are // x1=p1 // x2=${x1} $recursiveReplacement = LoggerOptionConverter::substVars($replacement, $props); $sbuf .= $recursiveReplacement; } $i = $k + LOG4PHP_OPTION_CONVERTER_DELIM_STOP_LEN; } } } }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?