mirror of
https://github.com/ZeJMaN/LBCAlerte_ynh.git
synced 2025-07-06 11:50:48 +02:00
Initial commit
Functional, without SSO
This commit is contained in:
@ -0,0 +1,39 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
/**
|
||||
* The interface for configurator adapters.
|
||||
*
|
||||
* Adapters convert configuration in several formats such as XML, ini and PHP
|
||||
* file to a PHP array.
|
||||
*
|
||||
* @package log4php
|
||||
* @subpackage configurators
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @version $Revision: 1343601 $
|
||||
* @since 2.2
|
||||
*/
|
||||
interface LoggerConfigurationAdapter
|
||||
{
|
||||
/** Converts the configuration file to PHP format usable by the configurator. */
|
||||
public function convert($input);
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,299 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
/**
|
||||
* Converts ini configuration files to a PHP array.
|
||||
*
|
||||
* These used to be called "properties" files (inherited from log4j), and that
|
||||
* file extension is still supported.
|
||||
*
|
||||
* @package log4php
|
||||
* @subpackage configurators
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @version $Revision: 1343601 $
|
||||
* @since 2.2
|
||||
*/
|
||||
class LoggerConfigurationAdapterINI implements LoggerConfigurationAdapter {
|
||||
|
||||
/** Name to assign to the root logger. */
|
||||
const ROOT_LOGGER_NAME = "root";
|
||||
|
||||
/** Prefix used for defining logger additivity. */
|
||||
const ADDITIVITY_PREFIX = "log4php.additivity.";
|
||||
|
||||
/** Prefix used for defining logger threshold. */
|
||||
const THRESHOLD_PREFIX = "log4php.threshold";
|
||||
|
||||
/** Prefix used for defining the root logger. */
|
||||
const ROOT_LOGGER_PREFIX = "log4php.rootLogger";
|
||||
|
||||
/** Prefix used for defining a logger. */
|
||||
const LOGGER_PREFIX = "log4php.logger.";
|
||||
|
||||
/** Prefix used for defining an appender. */
|
||||
const APPENDER_PREFIX = "log4php.appender.";
|
||||
|
||||
/** Prefix used for defining a renderer. */
|
||||
const RENDERER_PREFIX = "log4php.renderer.";
|
||||
|
||||
/** Holds the configuration. */
|
||||
private $config = array();
|
||||
|
||||
/**
|
||||
* Loads and parses the INI configuration file.
|
||||
*
|
||||
* @param string $url Path to the config file.
|
||||
* @throws LoggerException
|
||||
*/
|
||||
private function load($url) {
|
||||
if (!file_exists($url)) {
|
||||
throw new LoggerException("File [$url] does not exist.");
|
||||
}
|
||||
|
||||
$properties = @parse_ini_file($url, true);
|
||||
if ($properties === false) {
|
||||
$error = error_get_last();
|
||||
throw new LoggerException("Error parsing configuration file: {$error['message']}");
|
||||
}
|
||||
|
||||
return $properties;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts the provided INI configuration file to a PHP array config.
|
||||
*
|
||||
* @param string $path Path to the config file.
|
||||
* @throws LoggerException If the file cannot be loaded or parsed.
|
||||
*/
|
||||
public function convert($path) {
|
||||
// Load the configuration
|
||||
$properties = $this->load($path);
|
||||
|
||||
// Parse threshold
|
||||
if (isset($properties[self::THRESHOLD_PREFIX])) {
|
||||
$this->config['threshold'] = $properties[self::THRESHOLD_PREFIX];
|
||||
}
|
||||
|
||||
// Parse root logger
|
||||
if (isset($properties[self::ROOT_LOGGER_PREFIX])) {
|
||||
$this->parseLogger($properties[self::ROOT_LOGGER_PREFIX], self::ROOT_LOGGER_NAME);
|
||||
}
|
||||
|
||||
$appenders = array();
|
||||
|
||||
foreach($properties as $key => $value) {
|
||||
// Parse loggers
|
||||
if ($this->beginsWith($key, self::LOGGER_PREFIX)) {
|
||||
$name = substr($key, strlen(self::LOGGER_PREFIX));
|
||||
$this->parseLogger($value, $name);
|
||||
}
|
||||
|
||||
// Parse additivity
|
||||
if ($this->beginsWith($key, self::ADDITIVITY_PREFIX)) {
|
||||
$name = substr($key, strlen(self::ADDITIVITY_PREFIX));
|
||||
$this->config['loggers'][$name]['additivity'] = $value;
|
||||
}
|
||||
|
||||
// Parse appenders
|
||||
else if ($this->beginsWith($key, self::APPENDER_PREFIX)) {
|
||||
$this->parseAppender($key, $value);
|
||||
}
|
||||
|
||||
// Parse renderers
|
||||
else if ($this->beginsWith($key, self::RENDERER_PREFIX)) {
|
||||
$this->parseRenderer($key, $value);
|
||||
}
|
||||
}
|
||||
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parses a logger definition.
|
||||
*
|
||||
* Loggers are defined in the following manner:
|
||||
* <pre>
|
||||
* log4php.logger.<name> = [<level>], [<appender-ref>, <appender-ref>, ...]
|
||||
* </pre>
|
||||
*
|
||||
* @param string $value The configuration value (level and appender-refs).
|
||||
* @param string $name Logger name.
|
||||
*/
|
||||
private function parseLogger($value, $name) {
|
||||
// Value is divided by commas
|
||||
$parts = explode(',', $value);
|
||||
if (empty($value) || empty($parts)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// The first value is the logger level
|
||||
$level = array_shift($parts);
|
||||
|
||||
// The remaining values are appender references
|
||||
$appenders = array();
|
||||
while($appender = array_shift($parts)) {
|
||||
$appender = trim($appender);
|
||||
if (!empty($appender)) {
|
||||
$appenders[] = trim($appender);
|
||||
}
|
||||
}
|
||||
|
||||
// Find the target configuration
|
||||
if ($name == self::ROOT_LOGGER_NAME) {
|
||||
$this->config['rootLogger']['level'] = trim($level);
|
||||
$this->config['rootLogger']['appenders'] = $appenders;
|
||||
} else {
|
||||
$this->config['loggers'][$name]['level'] = trim($level);
|
||||
$this->config['loggers'][$name]['appenders'] = $appenders;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses an configuration line pertaining to an appender.
|
||||
*
|
||||
* Parses the following patterns:
|
||||
*
|
||||
* Appender class:
|
||||
* <pre>
|
||||
* log4php.appender.<name> = <class>
|
||||
* </pre>
|
||||
*
|
||||
* Appender parameter:
|
||||
* <pre>
|
||||
* log4php.appender.<name>.<param> = <value>
|
||||
* </pre>
|
||||
*
|
||||
* Appender threshold:
|
||||
* <pre>
|
||||
* log4php.appender.<name>.threshold = <level>
|
||||
* </pre>
|
||||
*
|
||||
* Appender layout:
|
||||
* <pre>
|
||||
* log4php.appender.<name>.layout = <layoutClass>
|
||||
* </pre>
|
||||
*
|
||||
* Layout parameter:
|
||||
* <pre>
|
||||
* log4php.appender.<name>.layout.<param> = <value>
|
||||
* </pre>
|
||||
*
|
||||
* For example, a full appender config might look like:
|
||||
* <pre>
|
||||
* log4php.appender.myAppender = LoggerAppenderConsole
|
||||
* log4php.appender.myAppender.threshold = info
|
||||
* log4php.appender.myAppender.target = stdout
|
||||
* log4php.appender.myAppender.layout = LoggerLayoutPattern
|
||||
* log4php.appender.myAppender.layout.conversionPattern = "%d %c: %m%n"
|
||||
* </pre>
|
||||
*
|
||||
* After parsing all these options, the following configuration can be
|
||||
* found under $this->config['appenders']['myAppender']:
|
||||
* <pre>
|
||||
* array(
|
||||
* 'class' => LoggerAppenderConsole,
|
||||
* 'threshold' => info,
|
||||
* 'params' => array(
|
||||
* 'target' => 'stdout'
|
||||
* ),
|
||||
* 'layout' => array(
|
||||
* 'class' => 'LoggerAppenderConsole',
|
||||
* 'params' => array(
|
||||
* 'conversionPattern' => '%d %c: %m%n'
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key
|
||||
* @param string $value
|
||||
*/
|
||||
private function parseAppender($key, $value) {
|
||||
|
||||
// Remove the appender prefix from key
|
||||
$subKey = substr($key, strlen(self::APPENDER_PREFIX));
|
||||
|
||||
// Divide the string by dots
|
||||
$parts = explode('.', $subKey);
|
||||
$count = count($parts);
|
||||
|
||||
// The first part is always the appender name
|
||||
$name = trim($parts[0]);
|
||||
|
||||
// Only one part - this line defines the appender class
|
||||
if ($count == 1) {
|
||||
$this->config['appenders'][$name]['class'] = $value;
|
||||
return;
|
||||
}
|
||||
|
||||
// Two parts - either a parameter, a threshold or layout class
|
||||
else if ($count == 2) {
|
||||
|
||||
if ($parts[1] == 'layout') {
|
||||
$this->config['appenders'][$name]['layout']['class'] = $value;
|
||||
return;
|
||||
} else if ($parts[1] == 'threshold') {
|
||||
$this->config['appenders'][$name]['threshold'] = $value;
|
||||
return;
|
||||
} else {
|
||||
$this->config['appenders'][$name]['params'][$parts[1]] = $value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Three parts - this can only be a layout parameter
|
||||
else if ($count == 3) {
|
||||
if ($parts[1] == 'layout') {
|
||||
$this->config['appenders'][$name]['layout']['params'][$parts[2]] = $value;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
trigger_error("log4php: Don't know how to parse the following line: \"$key = $value\". Skipping.");
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a renderer definition.
|
||||
*
|
||||
* Renderers are defined as:
|
||||
* <pre>
|
||||
* log4php.renderer.<renderedClass> = <renderingClass>
|
||||
* </pre>
|
||||
*
|
||||
* @param string $key log4php.renderer.<renderedClass>
|
||||
* @param string $value <renderingClass>
|
||||
*/
|
||||
private function parseRenderer($key, $value) {
|
||||
// Remove the appender prefix from key
|
||||
$renderedClass = substr($key, strlen(self::APPENDER_PREFIX));
|
||||
$renderingClass = $value;
|
||||
|
||||
$this->config['renderers'][] = compact('renderedClass', 'renderingClass');
|
||||
}
|
||||
|
||||
/** Helper method. Returns true if $str begins with $sub. */
|
||||
private function beginsWith($str, $sub) {
|
||||
return (strncmp($str, $sub, strlen($sub)) == 0);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -0,0 +1,84 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
/**
|
||||
* Converts PHP configuration files to a PHP array.
|
||||
*
|
||||
* The file should only hold the PHP config array preceded by "return".
|
||||
*
|
||||
* Example PHP config file:
|
||||
* <code>
|
||||
* <?php
|
||||
* return array(
|
||||
* 'rootLogger' => array(
|
||||
* 'level' => 'info',
|
||||
* 'appenders' => array('default')
|
||||
* ),
|
||||
* 'appenders' => array(
|
||||
* 'default' => array(
|
||||
* 'class' => 'LoggerAppenderEcho',
|
||||
* 'layout' => array(
|
||||
* 'class' => 'LoggerLayoutSimple'
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
* )
|
||||
* ?>
|
||||
* </code>
|
||||
*
|
||||
* @package log4php
|
||||
* @subpackage configurators
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @version $Revision: 1343601 $
|
||||
* @since 2.2
|
||||
*/
|
||||
class LoggerConfigurationAdapterPHP implements LoggerConfigurationAdapter
|
||||
{
|
||||
public function convert($url) {
|
||||
if (!file_exists($url)) {
|
||||
throw new LoggerException("File [$url] does not exist.");
|
||||
}
|
||||
|
||||
// Load the config file
|
||||
$data = @file_get_contents($url);
|
||||
if ($data === false) {
|
||||
$error = error_get_last();
|
||||
throw new LoggerException("Error loading config file: {$error['message']}");
|
||||
}
|
||||
|
||||
$config = @eval('?>' . $data);
|
||||
|
||||
if ($config === false) {
|
||||
$error = error_get_last();
|
||||
throw new LoggerException("Error parsing configuration: " . $error['message']);
|
||||
}
|
||||
|
||||
if (empty($config)) {
|
||||
throw new LoggerException("Invalid configuration: empty configuration array.");
|
||||
}
|
||||
|
||||
if (!is_array($config)) {
|
||||
throw new LoggerException("Invalid configuration: not an array.");
|
||||
}
|
||||
|
||||
return $config;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,278 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
/**
|
||||
* Converts XML configuration files to a PHP array.
|
||||
*
|
||||
* @package log4php
|
||||
* @subpackage configurators
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @version $Revision: 1394956 $
|
||||
* @since 2.2
|
||||
*/
|
||||
class LoggerConfigurationAdapterXML implements LoggerConfigurationAdapter
|
||||
{
|
||||
/** Path to the XML schema used for validation. */
|
||||
const SCHEMA_PATH = '/../xml/log4php.xsd';
|
||||
|
||||
private $config = array(
|
||||
'appenders' => array(),
|
||||
'loggers' => array(),
|
||||
'renderers' => array(),
|
||||
);
|
||||
|
||||
public function convert($url) {
|
||||
$xml = $this->loadXML($url);
|
||||
|
||||
$this->parseConfiguration($xml);
|
||||
|
||||
// Parse the <root> node
|
||||
if (isset($xml->root)) {
|
||||
$this->parseRootLogger($xml->root);
|
||||
}
|
||||
|
||||
// Process <logger> nodes
|
||||
foreach($xml->logger as $logger) {
|
||||
$this->parseLogger($logger);
|
||||
}
|
||||
|
||||
// Process <appender> nodes
|
||||
foreach($xml->appender as $appender) {
|
||||
$this->parseAppender($appender);
|
||||
}
|
||||
|
||||
// Process <renderer> nodes
|
||||
foreach($xml->renderer as $rendererNode) {
|
||||
$this->parseRenderer($rendererNode);
|
||||
}
|
||||
|
||||
// Process <defaultRenderer> node
|
||||
foreach($xml->defaultRenderer as $rendererNode) {
|
||||
$this->parseDefaultRenderer($rendererNode);
|
||||
}
|
||||
|
||||
return $this->config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads and validates the XML.
|
||||
* @param string $url Input XML.
|
||||
*/
|
||||
private function loadXML($url) {
|
||||
if (!file_exists($url)) {
|
||||
throw new LoggerException("File [$url] does not exist.");
|
||||
}
|
||||
|
||||
libxml_clear_errors();
|
||||
$oldValue = libxml_use_internal_errors(true);
|
||||
|
||||
// Load XML
|
||||
$xml = @simplexml_load_file($url);
|
||||
if ($xml === false) {
|
||||
|
||||
$errorStr = "";
|
||||
foreach(libxml_get_errors() as $error) {
|
||||
$errorStr .= $error->message;
|
||||
}
|
||||
|
||||
throw new LoggerException("Error loading configuration file: " . trim($errorStr));
|
||||
}
|
||||
|
||||
libxml_clear_errors();
|
||||
libxml_use_internal_errors($oldValue);
|
||||
|
||||
return $xml;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the <configuration> node.
|
||||
*/
|
||||
private function parseConfiguration(SimpleXMLElement $xml) {
|
||||
$attributes = $xml->attributes();
|
||||
if (isset($attributes['threshold'])) {
|
||||
$this->config['threshold'] = (string) $attributes['threshold'];
|
||||
}
|
||||
}
|
||||
|
||||
/** Parses an <appender> node. */
|
||||
private function parseAppender(SimpleXMLElement $node) {
|
||||
$name = $this->getAttributeValue($node, 'name');
|
||||
if (empty($name)) {
|
||||
$this->warn("An <appender> node is missing the required 'name' attribute. Skipping appender definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
$appender = array();
|
||||
$appender['class'] = $this->getAttributeValue($node, 'class');
|
||||
|
||||
if (isset($node['threshold'])) {
|
||||
$appender['threshold'] = $this->getAttributeValue($node, 'threshold');
|
||||
}
|
||||
|
||||
if (isset($node->layout)) {
|
||||
$appender['layout']= $this->parseLayout($node->layout, $name);
|
||||
}
|
||||
|
||||
if (count($node->param) > 0) {
|
||||
$appender['params'] = $this->parseParameters($node);
|
||||
}
|
||||
|
||||
foreach($node->filter as $filterNode) {
|
||||
$appender['filters'][] = $this->parseFilter($filterNode);
|
||||
}
|
||||
|
||||
$this->config['appenders'][$name] = $appender;
|
||||
}
|
||||
|
||||
/** Parses a <layout> node. */
|
||||
private function parseLayout(SimpleXMLElement $node, $appenderName) {
|
||||
$layout = array();
|
||||
$layout['class'] = $this->getAttributeValue($node, 'class');
|
||||
|
||||
if (count($node->param) > 0) {
|
||||
$layout['params'] = $this->parseParameters($node);
|
||||
}
|
||||
|
||||
return $layout;
|
||||
}
|
||||
|
||||
/** Parses any <param> child nodes returning them in an array. */
|
||||
private function parseParameters($paramsNode) {
|
||||
$params = array();
|
||||
|
||||
foreach($paramsNode->param as $paramNode) {
|
||||
if (empty($paramNode['name'])) {
|
||||
$this->warn("A <param> node is missing the required 'name' attribute. Skipping parameter.");
|
||||
continue;
|
||||
}
|
||||
|
||||
$name = $this->getAttributeValue($paramNode, 'name');
|
||||
$value = $this->getAttributeValue($paramNode, 'value');
|
||||
|
||||
$params[$name] = $value;
|
||||
}
|
||||
|
||||
return $params;
|
||||
}
|
||||
|
||||
/** Parses a <root> node. */
|
||||
private function parseRootLogger(SimpleXMLElement $node) {
|
||||
$logger = array();
|
||||
|
||||
if (isset($node->level)) {
|
||||
$logger['level'] = $this->getAttributeValue($node->level, 'value');
|
||||
}
|
||||
|
||||
$logger['appenders'] = $this->parseAppenderReferences($node);
|
||||
|
||||
$this->config['rootLogger'] = $logger;
|
||||
}
|
||||
|
||||
/** Parses a <logger> node. */
|
||||
private function parseLogger(SimpleXMLElement $node) {
|
||||
$logger = array();
|
||||
|
||||
$name = $this->getAttributeValue($node, 'name');
|
||||
if (empty($name)) {
|
||||
$this->warn("A <logger> node is missing the required 'name' attribute. Skipping logger definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($node->level)) {
|
||||
$logger['level'] = $this->getAttributeValue($node->level, 'value');
|
||||
}
|
||||
|
||||
if (isset($node['additivity'])) {
|
||||
$logger['additivity'] = $this->getAttributeValue($node, 'additivity');
|
||||
}
|
||||
|
||||
$logger['appenders'] = $this->parseAppenderReferences($node);
|
||||
|
||||
// Check for duplicate loggers
|
||||
if (isset($this->config['loggers'][$name])) {
|
||||
$this->warn("Duplicate logger definition [$name]. Overwriting.");
|
||||
}
|
||||
|
||||
$this->config['loggers'][$name] = $logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a <logger> node for appender references and returns them in an array.
|
||||
*
|
||||
* Previous versions supported appender-ref, as well as appender_ref so both
|
||||
* are parsed for backward compatibility.
|
||||
*/
|
||||
private function parseAppenderReferences(SimpleXMLElement $node) {
|
||||
$refs = array();
|
||||
foreach($node->appender_ref as $ref) {
|
||||
$refs[] = $this->getAttributeValue($ref, 'ref');
|
||||
}
|
||||
|
||||
foreach($node->{'appender-ref'} as $ref) {
|
||||
$refs[] = $this->getAttributeValue($ref, 'ref');
|
||||
}
|
||||
|
||||
return $refs;
|
||||
}
|
||||
|
||||
/** Parses a <filter> node. */
|
||||
private function parseFilter($filterNode) {
|
||||
$filter = array();
|
||||
$filter['class'] = $this->getAttributeValue($filterNode, 'class');
|
||||
|
||||
if (count($filterNode->param) > 0) {
|
||||
$filter['params'] = $this->parseParameters($filterNode);
|
||||
}
|
||||
|
||||
return $filter;
|
||||
}
|
||||
|
||||
/** Parses a <renderer> node. */
|
||||
private function parseRenderer(SimpleXMLElement $node) {
|
||||
$renderedClass = $this->getAttributeValue($node, 'renderedClass');
|
||||
$renderingClass = $this->getAttributeValue($node, 'renderingClass');
|
||||
|
||||
$this->config['renderers'][] = compact('renderedClass', 'renderingClass');
|
||||
}
|
||||
|
||||
/** Parses a <defaultRenderer> node. */
|
||||
private function parseDefaultRenderer(SimpleXMLElement $node) {
|
||||
$renderingClass = $this->getAttributeValue($node, 'renderingClass');
|
||||
|
||||
// Warn on duplicates
|
||||
if(isset($this->config['defaultRenderer'])) {
|
||||
$this->warn("Duplicate <defaultRenderer> node. Overwriting.");
|
||||
}
|
||||
|
||||
$this->config['defaultRenderer'] = $renderingClass;
|
||||
}
|
||||
|
||||
// ******************************************
|
||||
// ** Helper methods **
|
||||
// ******************************************
|
||||
|
||||
private function getAttributeValue(SimpleXMLElement $node, $name) {
|
||||
return isset($node[$name]) ? (string) $node[$name] : null;
|
||||
}
|
||||
|
||||
private function warn($message) {
|
||||
trigger_error("log4php: " . $message, E_USER_WARNING);
|
||||
}
|
||||
}
|
477
sources/lib/Log4php/configurators/LoggerConfiguratorDefault.php
Normal file
477
sources/lib/Log4php/configurators/LoggerConfiguratorDefault.php
Normal file
@ -0,0 +1,477 @@
|
||||
<?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
|
||||
*/
|
||||
|
||||
/**
|
||||
* Default implementation of the logger configurator.
|
||||
*
|
||||
* Configures log4php based on a provided configuration file or array.
|
||||
*
|
||||
* @package log4php
|
||||
* @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
|
||||
* @version $Revision: 1394956 $
|
||||
* @since 2.2
|
||||
*/
|
||||
class LoggerConfiguratorDefault implements LoggerConfigurator
|
||||
{
|
||||
/** XML configuration file format. */
|
||||
const FORMAT_XML = 'xml';
|
||||
|
||||
/** PHP configuration file format. */
|
||||
const FORMAT_PHP = 'php';
|
||||
|
||||
/** INI (properties) configuration file format. */
|
||||
const FORMAT_INI = 'ini';
|
||||
|
||||
/** Defines which adapter should be used for parsing which format. */
|
||||
private $adapters = array(
|
||||
self::FORMAT_XML => 'LoggerConfigurationAdapterXML',
|
||||
self::FORMAT_INI => 'LoggerConfigurationAdapterINI',
|
||||
self::FORMAT_PHP => 'LoggerConfigurationAdapterPHP',
|
||||
);
|
||||
|
||||
/** Default configuration; used if no configuration file is provided. */
|
||||
private static $defaultConfiguration = array(
|
||||
'threshold' => 'ALL',
|
||||
'rootLogger' => array(
|
||||
'level' => 'DEBUG',
|
||||
'appenders' => array('default'),
|
||||
),
|
||||
'appenders' => array(
|
||||
'default' => array(
|
||||
'class' => 'LoggerAppenderEcho'
|
||||
),
|
||||
),
|
||||
);
|
||||
|
||||
/** Holds the appenders before they are linked to loggers. */
|
||||
private $appenders = array();
|
||||
|
||||
/**
|
||||
* Configures log4php based on the given configuration. The input can
|
||||
* either be a path to the config file, or a PHP array holding the
|
||||
* configuration.
|
||||
*
|
||||
* If no configuration is given, or if the given configuration cannot be
|
||||
* parsed for whatever reason, a warning will be issued, and log4php
|
||||
* will use the default configuration contained in
|
||||
* {@link $defaultConfiguration}.
|
||||
*
|
||||
* @param LoggerHierarchy $hierarchy The hierarchy on which to perform
|
||||
* the configuration.
|
||||
* @param string|array $input Either path to the config file or the
|
||||
* configuration as an array. If not set, default configuration
|
||||
* will be used.
|
||||
*/
|
||||
public function configure(LoggerHierarchy $hierarchy, $input = null) {
|
||||
$config = $this->parse($input);
|
||||
$this->doConfigure($hierarchy, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the given configuration and returns the parsed configuration
|
||||
* as a PHP array. Does not perform any configuration.
|
||||
*
|
||||
* If no configuration is given, or if the given configuration cannot be
|
||||
* parsed for whatever reason, a warning will be issued, and the default
|
||||
* configuration will be returned ({@link $defaultConfiguration}).
|
||||
*
|
||||
* @param string|array $input Either path to the config file or the
|
||||
* configuration as an array. If not set, default configuration
|
||||
* will be used.
|
||||
* @return array The parsed configuration.
|
||||
*/
|
||||
public function parse($input) {
|
||||
// No input - use default configuration
|
||||
if (!isset($input)) {
|
||||
$config = self::$defaultConfiguration;
|
||||
}
|
||||
|
||||
// Array input - contains configuration within the array
|
||||
else if (is_array($input)) {
|
||||
$config = $input;
|
||||
}
|
||||
|
||||
// String input - contains path to configuration file
|
||||
else if (is_string($input)) {
|
||||
try {
|
||||
$config = $this->parseFile($input);
|
||||
} catch (LoggerException $e) {
|
||||
$this->warn("Configuration failed. " . $e->getMessage() . " Using default configuration.");
|
||||
$config = self::$defaultConfiguration;
|
||||
}
|
||||
}
|
||||
|
||||
// Anything else is an error
|
||||
else {
|
||||
$this->warn("Invalid configuration param given. Reverting to default configuration.");
|
||||
$config = self::$defaultConfiguration;
|
||||
}
|
||||
|
||||
return $config;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the default log4php configuration.
|
||||
* @return array
|
||||
*/
|
||||
public static function getDefaultConfiguration() {
|
||||
return self::$defaultConfiguration;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the configuration file from the given URL, determines which
|
||||
* adapter to use, converts the configuration to a PHP array and
|
||||
* returns it.
|
||||
*
|
||||
* @param string $url Path to the config file.
|
||||
* @return The configuration from the config file, as a PHP array.
|
||||
* @throws LoggerException If the configuration file cannot be loaded, or
|
||||
* if the parsing fails.
|
||||
*/
|
||||
private function parseFile($url) {
|
||||
|
||||
if (!file_exists($url)) {
|
||||
throw new LoggerException("File not found at [$url].");
|
||||
}
|
||||
|
||||
$type = $this->getConfigType($url);
|
||||
$adapterClass = $this->adapters[$type];
|
||||
|
||||
$adapter = new $adapterClass();
|
||||
return $adapter->convert($url);
|
||||
}
|
||||
|
||||
/** Determines configuration file type based on the file extension. */
|
||||
private function getConfigType($url) {
|
||||
$info = pathinfo($url);
|
||||
$ext = strtolower($info['extension']);
|
||||
|
||||
switch($ext) {
|
||||
case 'xml':
|
||||
return self::FORMAT_XML;
|
||||
|
||||
case 'ini':
|
||||
case 'properties':
|
||||
return self::FORMAT_INI;
|
||||
|
||||
case 'php':
|
||||
return self::FORMAT_PHP;
|
||||
|
||||
default:
|
||||
throw new LoggerException("Unsupported configuration file extension: $ext");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs the logger hierarchy based on configuration.
|
||||
*
|
||||
* @param LoggerHierarchy $hierarchy
|
||||
* @param array $config
|
||||
*/
|
||||
private function doConfigure(LoggerHierarchy $hierarchy, $config) {
|
||||
if (isset($config['threshold'])) {
|
||||
$threshold = LoggerLevel::toLevel($config['threshold']);
|
||||
if (isset($threshold)) {
|
||||
$hierarchy->setThreshold($threshold);
|
||||
} else {
|
||||
$this->warn("Invalid threshold value [{$config['threshold']}] specified. Ignoring threshold definition.");
|
||||
}
|
||||
}
|
||||
|
||||
// Configure appenders and add them to the appender pool
|
||||
if (isset($config['appenders']) && is_array($config['appenders'])) {
|
||||
foreach($config['appenders'] as $name => $appenderConfig) {
|
||||
$this->configureAppender($name, $appenderConfig);
|
||||
}
|
||||
}
|
||||
|
||||
// Configure root logger
|
||||
if (isset($config['rootLogger'])) {
|
||||
$this->configureRootLogger($hierarchy, $config['rootLogger']);
|
||||
}
|
||||
|
||||
// Configure loggers
|
||||
if (isset($config['loggers']) && is_array($config['loggers'])) {
|
||||
foreach($config['loggers'] as $loggerName => $loggerConfig) {
|
||||
$this->configureOtherLogger($hierarchy, $loggerName, $loggerConfig);
|
||||
}
|
||||
}
|
||||
|
||||
// Configure renderers
|
||||
if (isset($config['renderers']) && is_array($config['renderers'])) {
|
||||
foreach($config['renderers'] as $rendererConfig) {
|
||||
$this->configureRenderer($hierarchy, $rendererConfig);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($config['defaultRenderer'])) {
|
||||
$this->configureDefaultRenderer($hierarchy, $config['defaultRenderer']);
|
||||
}
|
||||
}
|
||||
|
||||
private function configureRenderer(LoggerHierarchy $hierarchy, $config) {
|
||||
if (empty($config['renderingClass'])) {
|
||||
$this->warn("Rendering class not specified. Skipping renderer definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (empty($config['renderedClass'])) {
|
||||
$this->warn("Rendered class not specified. Skipping renderer definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Error handling performed by RendererMap
|
||||
$hierarchy->getRendererMap()->addRenderer($config['renderedClass'], $config['renderingClass']);
|
||||
}
|
||||
|
||||
private function configureDefaultRenderer(LoggerHierarchy $hierarchy, $class) {
|
||||
if (empty($class)) {
|
||||
$this->warn("Rendering class not specified. Skipping default renderer definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Error handling performed by RendererMap
|
||||
$hierarchy->getRendererMap()->setDefaultRenderer($class);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures an appender based on given config and saves it to
|
||||
* {@link $appenders} array so it can be later linked to loggers.
|
||||
* @param string $name Appender name.
|
||||
* @param array $config Appender configuration options.
|
||||
*/
|
||||
private function configureAppender($name, $config) {
|
||||
|
||||
// TODO: add this check to other places where it might be useful
|
||||
if (!is_array($config)) {
|
||||
$type = gettype($config);
|
||||
$this->warn("Invalid configuration provided for appender [$name]. Expected an array, found <$type>. Skipping appender definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse appender class
|
||||
$class = $config['class'];
|
||||
if (empty($class)) {
|
||||
$this->warn("No class given for appender [$name]. Skipping appender definition.");
|
||||
return;
|
||||
}
|
||||
if (!class_exists($class)) {
|
||||
$this->warn("Invalid class [$class] given for appender [$name]. Class does not exist. Skipping appender definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Instantiate the appender
|
||||
$appender = new $class($name);
|
||||
if (!($appender instanceof LoggerAppender)) {
|
||||
$this->warn("Invalid class [$class] given for appender [$name]. Not a valid LoggerAppender class. Skipping appender definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
// Parse the appender threshold
|
||||
if (isset($config['threshold'])) {
|
||||
$threshold = LoggerLevel::toLevel($config['threshold']);
|
||||
if ($threshold instanceof LoggerLevel) {
|
||||
$appender->setThreshold($threshold);
|
||||
} else {
|
||||
$this->warn("Invalid threshold value [{$config['threshold']}] specified for appender [$name]. Ignoring threshold definition.");
|
||||
}
|
||||
}
|
||||
|
||||
// Parse the appender layout
|
||||
if ($appender->requiresLayout() && isset($config['layout'])) {
|
||||
$this->createAppenderLayout($appender, $config['layout']);
|
||||
}
|
||||
|
||||
// Parse filters
|
||||
if (isset($config['filters']) && is_array($config['filters'])) {
|
||||
foreach($config['filters'] as $filterConfig) {
|
||||
$this->createAppenderFilter($appender, $filterConfig);
|
||||
}
|
||||
}
|
||||
|
||||
// Set options if any
|
||||
if (isset($config['params'])) {
|
||||
$this->setOptions($appender, $config['params']);
|
||||
}
|
||||
|
||||
// Activate and save for later linking to loggers
|
||||
$appender->activateOptions();
|
||||
$this->appenders[$name] = $appender;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses layout config, creates the layout and links it to the appender.
|
||||
* @param LoggerAppender $appender
|
||||
* @param array $config Layout configuration.
|
||||
*/
|
||||
private function createAppenderLayout(LoggerAppender $appender, $config) {
|
||||
$name = $appender->getName();
|
||||
$class = $config['class'];
|
||||
if (empty($class)) {
|
||||
$this->warn("Layout class not specified for appender [$name]. Reverting to default layout.");
|
||||
return;
|
||||
}
|
||||
if (!class_exists($class)) {
|
||||
$this->warn("Nonexistant layout class [$class] specified for appender [$name]. Reverting to default layout.");
|
||||
return;
|
||||
}
|
||||
|
||||
$layout = new $class();
|
||||
if (!($layout instanceof LoggerLayout)) {
|
||||
$this->warn("Invalid layout class [$class] sepcified for appender [$name]. Reverting to default layout.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($config['params'])) {
|
||||
$this->setOptions($layout, $config['params']);
|
||||
}
|
||||
|
||||
$layout->activateOptions();
|
||||
$appender->setLayout($layout);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses filter config, creates the filter and adds it to the appender's
|
||||
* filter chain.
|
||||
* @param LoggerAppender $appender
|
||||
* @param array $config Filter configuration.
|
||||
*/
|
||||
private function createAppenderFilter(LoggerAppender $appender, $config) {
|
||||
$name = $appender->getName();
|
||||
$class = $config['class'];
|
||||
if (!class_exists($class)) {
|
||||
$this->warn("Nonexistant filter class [$class] specified on appender [$name]. Skipping filter definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
$filter = new $class();
|
||||
if (!($filter instanceof LoggerFilter)) {
|
||||
$this->warn("Invalid filter class [$class] sepcified on appender [$name]. Skipping filter definition.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (isset($config['params'])) {
|
||||
$this->setOptions($filter, $config['params']);
|
||||
}
|
||||
|
||||
$filter->activateOptions();
|
||||
$appender->addFilter($filter);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures the root logger
|
||||
* @see configureLogger()
|
||||
*/
|
||||
private function configureRootLogger(LoggerHierarchy $hierarchy, $config) {
|
||||
$logger = $hierarchy->getRootLogger();
|
||||
$this->configureLogger($logger, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures a logger which is not root.
|
||||
* @see configureLogger()
|
||||
*/
|
||||
private function configureOtherLogger(LoggerHierarchy $hierarchy, $name, $config) {
|
||||
// Get logger from hierarchy (this creates it if it doesn't already exist)
|
||||
$logger = $hierarchy->getLogger($name);
|
||||
$this->configureLogger($logger, $config);
|
||||
}
|
||||
|
||||
/**
|
||||
* Configures a logger.
|
||||
*
|
||||
* @param Logger $logger The logger to configure
|
||||
* @param array $config Logger configuration options.
|
||||
*/
|
||||
private function configureLogger(Logger $logger, $config) {
|
||||
$loggerName = $logger->getName();
|
||||
|
||||
// Set logger level
|
||||
if (isset($config['level'])) {
|
||||
$level = LoggerLevel::toLevel($config['level']);
|
||||
if (isset($level)) {
|
||||
$logger->setLevel($level);
|
||||
} else {
|
||||
$this->warn("Invalid level value [{$config['level']}] specified for logger [$loggerName]. Ignoring level definition.");
|
||||
}
|
||||
}
|
||||
|
||||
// Link appenders to logger
|
||||
if (isset($config['appenders'])) {
|
||||
foreach($config['appenders'] as $appenderName) {
|
||||
if (isset($this->appenders[$appenderName])) {
|
||||
$logger->addAppender($this->appenders[$appenderName]);
|
||||
} else {
|
||||
$this->warn("Nonexistnant appender [$appenderName] linked to logger [$loggerName].");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Set logger additivity
|
||||
if (isset($config['additivity'])) {
|
||||
try {
|
||||
$additivity = LoggerOptionConverter::toBooleanEx($config['additivity'], null);
|
||||
$logger->setAdditivity($additivity);
|
||||
} catch (Exception $ex) {
|
||||
$this->warn("Invalid additivity value [{$config['additivity']}] specified for logger [$loggerName]. Ignoring additivity setting.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method which applies given options to an object which has setters
|
||||
* for these options (such as appenders, layouts, etc.).
|
||||
*
|
||||
* For example, if options are:
|
||||
* <code>
|
||||
* array(
|
||||
* 'file' => '/tmp/myfile.log',
|
||||
* 'append' => true
|
||||
* )
|
||||
* </code>
|
||||
*
|
||||
* This method will call:
|
||||
* <code>
|
||||
* $object->setFile('/tmp/myfile.log')
|
||||
* $object->setAppend(true)
|
||||
* </code>
|
||||
*
|
||||
* If required setters do not exist, it will produce a warning.
|
||||
*
|
||||
* @param mixed $object The object to configure.
|
||||
* @param unknown_type $options
|
||||
*/
|
||||
private function setOptions($object, $options) {
|
||||
foreach($options as $name => $value) {
|
||||
$setter = "set$name";
|
||||
if (method_exists($object, $setter)) {
|
||||
$object->$setter($value);
|
||||
} else {
|
||||
$class = get_class($object);
|
||||
$this->warn("Nonexistant option [$name] specified on [$class]. Skipping.");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Helper method to simplify error reporting. */
|
||||
private function warn($message) {
|
||||
trigger_error("log4php: $message", E_USER_WARNING);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user