You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by ih...@apache.org on 2013/11/28 17:04:08 UTC

[38/43] git commit: Fixed code formatting to conform to PSR-2

Fixed code formatting to conform to PSR-2

Used the PHP Coding Standards Fixer by Sensio Labs
(http://cs.sensiolabs.org/).

Signed-off-by: Ivan Habunek <iv...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/logging-log4php/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4php/commit/35dfd5d3
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4php/tree/35dfd5d3
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4php/diff/35dfd5d3

Branch: refs/heads/v3
Commit: 35dfd5d3a0b292ae3ae0872436a1e3989212cb12
Parents: 79ed2d0
Author: Ivan Habunek <iv...@gmail.com>
Authored: Thu Nov 28 14:23:41 2013 +0100
Committer: Ivan Habunek <iv...@gmail.com>
Committed: Thu Nov 28 14:23:41 2013 +0100

----------------------------------------------------------------------
 src/AppenderPool.php                            |  121 +-
 src/Appenders/AbstractAppender.php              |  536 ++++----
 src/Appenders/ConsoleAppender.php               |  118 +-
 src/Appenders/DailyFileAppender.php             |  181 +--
 src/Appenders/EchoAppender.php                  |   95 +-
 src/Appenders/FileAppender.php                  |  393 +++---
 src/Appenders/MailAppender.php                  |  195 +--
 src/Appenders/MailEventAppender.php             |  289 ++---
 src/Appenders/MongoDBAppender.php               |  656 +++++-----
 src/Appenders/NullAppender.php                  |   27 +-
 src/Appenders/PdoAppender.php                   |  499 ++++----
 src/Appenders/PhpAppender.php                   |   25 +-
 src/Appenders/RollingFileAppender.php           |  538 ++++----
 src/Appenders/SocketAppender.php                |  181 +--
 src/Appenders/SyslogAppender.php                |  480 ++++----
 src/Autoloader.php                              |   44 +-
 src/Configurable.php                            |  166 +--
 src/Configuration/ConfiguratorInterface.php     |   24 +-
 src/Configuration/DefaultConfigurator.php       |  944 +++++++-------
 src/Configuration/adapters/AdapterInterface.php |    4 +-
 src/Configuration/adapters/IniAdapter.php       |  535 ++++----
 src/Configuration/adapters/PhpAdapter.php       |   48 +-
 src/Configuration/adapters/XmlAdapter.php       |  509 ++++----
 src/Filters/AbstractFilter.php                  |  128 +-
 src/Filters/DenyAllFilter.php                   |   25 +-
 src/Filters/LevelMatchFilter.php                |   97 +-
 src/Filters/LevelRangeFilter.php                |  132 +-
 src/Filters/StringMatchFilter.php               |   72 +-
 src/Helpers/FormattingInfo.php                  |   44 +-
 src/Helpers/OptionConverter.php                 |  403 +++---
 src/Helpers/PatternParser.php                   |  430 +++----
 src/Helpers/Utils.php                           |  191 +--
 src/Hierarchy.php                               |  374 +++---
 src/Layouts/AbstractLayout.php                  |   91 +-
 src/Layouts/HtmlLayout.php                      |  340 ++---
 src/Layouts/PatternLayout.php                   |  276 +++--
 src/Layouts/SerializedLayout.php                |   40 +-
 src/Layouts/SimpleLayout.php                    |   33 +-
 src/Layouts/XmlLayout.php                       |  317 ++---
 src/Level.php                                   |  468 +++----
 src/LocationInfo.php                            |  132 +-
 src/Logger.php                                  | 1159 +++++++++---------
 src/LoggerException.php                         |    3 +-
 src/LoggingEvent.php                            |  703 ++++++-----
 src/MDC.php                                     |   99 +-
 src/NDC.php                                     |  206 ++--
 src/Pattern/AbstractConverter.php               |  198 +--
 src/Pattern/ClassConverter.php                  |   54 +-
 src/Pattern/CookieConverter.php                 |    7 +-
 src/Pattern/DateConverter.php                   |   93 +-
 src/Pattern/EnvironmentConverter.php            |    5 +-
 src/Pattern/FileConverter.php                   |   11 +-
 src/Pattern/LevelConverter.php                  |   11 +-
 src/Pattern/LineConverter.php                   |   11 +-
 src/Pattern/LiteralConverter.php                |   20 +-
 src/Pattern/LocationConverter.php               |   19 +-
 src/Pattern/LoggerConverter.php                 |   54 +-
 src/Pattern/MdcConverter.php                    |   41 +-
 src/Pattern/MessageConverter.php                |   11 +-
 src/Pattern/MethodConverter.php                 |   11 +-
 src/Pattern/NdcConverter.php                    |   11 +-
 src/Pattern/NewLineConverter.php                |   11 +-
 src/Pattern/ProcessConverter.php                |   11 +-
 src/Pattern/RelativeConverter.php               |   12 +-
 src/Pattern/RequestConverter.php                |    9 +-
 src/Pattern/ServerConverter.php                 |    7 +-
 src/Pattern/SessionConverter.php                |    7 +-
 src/Pattern/SessionIdConverter.php              |   10 +-
 src/Pattern/SuperglobalConverter.php            |  111 +-
 src/Pattern/ThrowableConverter.php              |   21 +-
 src/ReflectionUtils.php                         |  241 ++--
 src/Renderers/DefaultRenderer.php               |   13 +-
 src/Renderers/ExceptionRenderer.php             |   16 +-
 src/Renderers/RendererInterface.php             |   15 +-
 src/Renderers/RendererMap.php                   |  339 ++---
 src/RootLogger.php                              |   80 +-
 src/ThrowableInformation.php                    |   69 +-
 tests/bootstrap.php                             |    2 +-
 .../configs/adapters/php/config_empty.php       |   50 +-
 .../adapters/php/config_invalid_syntax.php      |   78 +-
 .../adapters/php/config_not_an_array.php        |   52 +-
 .../configs/adapters/php/config_valid.php       |   78 +-
 .../adapters/xml/config_duplicate_logger.xml    |   78 +-
 .../adapters/xml/config_duplicate_renderer.xml  |   60 +-
 .../adapters/xml/config_invalid_syntax.xml      |   78 +-
 .../configs/adapters/xml/config_valid.xml       |  108 +-
 .../adapters/xml/config_valid_underscore.xml    |  114 +-
 .../appenders/config_invalid_appender_class.xml |   50 +-
 .../appenders/config_invalid_filter_class.xml   |   54 +-
 .../config_invalid_filter_parameters.xml        |   58 +-
 .../appenders/config_invalid_layout_class.xml   |   54 +-
 .../configs/appenders/config_no_class.xml       |   52 +-
 .../appenders/config_no_layout_class.xml        |   54 +-
 .../appenders/config_not_existing_class.xml     |   50 +-
 .../config_not_existing_filter_class.xml        |   54 +-
 .../config_not_existing_layout_class.xml        |   54 +-
 tests/resources/configs/config.yml              |   28 +-
 tests/resources/configs/config1.xml             |  108 +-
 .../loggers/config_invalid_additivity.xml       |   60 +-
 .../loggers/config_not_existing_appenders.xml   |   46 +-
 .../renderers/config_default_renderer.xml       |   54 +-
 .../config_invalid_rendering_class.xml          |   58 +-
 .../renderers/config_no_rendered_class.xml      |   58 +-
 .../renderers/config_no_rendering_class.xml     |   58 +-
 .../config_not_existing_rendering_class.xml     |   58 +-
 tests/src/AppenderPoolTest.php                  |  106 +-
 tests/src/AppenderTest.php                      |  245 ++--
 tests/src/Appenders/ConsoleAppenderTest.php     |   96 +-
 tests/src/Appenders/DailyFileAppenderTest.php   |  332 ++---
 tests/src/Appenders/EchoAppenderTest.php        |  264 ++--
 tests/src/Appenders/FileAppenderTest.php        |  220 ++--
 tests/src/Appenders/MailAppenderTest.php        |   50 +-
 tests/src/Appenders/MailEventAppenderTest.php   |   94 +-
 tests/src/Appenders/MongoDBAppenderTest.php     |  362 +++---
 tests/src/Appenders/NullAppenderTest.php        |   31 +-
 tests/src/Appenders/PDOAppenderTest.php         |  275 +++--
 tests/src/Appenders/PhpAppenderTest.php         |  117 +-
 tests/src/Appenders/RollingFileAppenderTest.php |  268 ++--
 tests/src/Appenders/SocketAppenderTest.php      |  248 ++--
 tests/src/Appenders/SyslogAppenderTest.php      |  432 +++----
 tests/src/Appenders/socketServer.php            |   75 +-
 tests/src/ConfiguratorTest.php                  |  799 ++++++------
 tests/src/Configurators/INIAdapterTest.php      |  290 ++---
 tests/src/Configurators/PHPAdapterTest.php      |  129 +-
 tests/src/Configurators/XMLAdapterTest.php      |  295 ++---
 tests/src/ExceptionTest.php                     |   26 +-
 tests/src/FilterTest.php                        |   37 +-
 tests/src/Filters/FilterDenyAllTest.php         |   70 +-
 tests/src/Filters/FilterLevelMatchTest.php      |  308 ++---
 tests/src/Filters/FilterLevelRangeTest.php      |   62 +-
 tests/src/Filters/FilterStringMatchTest.php     |  172 +--
 tests/src/Helpers/OptionConverterTest.php       |   85 +-
 tests/src/Helpers/PatternParserTest.php         |   10 +-
 tests/src/Helpers/UtilsTest.php                 |   86 +-
 tests/src/HierarchyTest.php                     |  149 +--
 tests/src/Layouts/HtmlLayoutTest.php            |   66 +-
 tests/src/Layouts/PatternLayoutTest.php         |   48 +-
 tests/src/Layouts/SerializedLayoutTest.php      |  142 +--
 tests/src/Layouts/SimpleLayoutTest.php          |   19 +-
 tests/src/Layouts/XmlLayoutTest.php             |  175 +--
 tests/src/LevelTest.php                         |   91 +-
 tests/src/LoggerTest.php                        |  400 +++---
 tests/src/LoggingEventTest.php                  |  201 +--
 tests/src/MDCTest.php                           |  156 +--
 tests/src/NDCTest.php                           |  124 +-
 tests/src/Pattern/PatternConverterTest.php      |  738 +++++------
 tests/src/ReflectionUtilsTest.php               |   85 +-
 tests/src/Renderers/RendererMapTest.php         |  406 +++---
 tests/src/RootLoggerTest.php                    |   68 +-
 tests/src/TestHelper.php                        |  265 ++--
 tests/src/ThrowableInformationTest.php          |   55 +-
 151 files changed, 12561 insertions(+), 11817 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/AppenderPool.php
----------------------------------------------------------------------
diff --git a/src/AppenderPool.php b/src/AppenderPool.php
index ca57179..92f9455 100644
--- a/src/AppenderPool.php
+++ b/src/AppenderPool.php
@@ -28,70 +28,77 @@ use Apache\Log4php\Appenders\AbstractAppender;
  * appender can be linked to multiple loggers. This makes sure duplicate
  * appenders are not created.
  */
-class AppenderPool {
+class AppenderPool
+{
+    /** Holds appenders indexed by their name */
+    public static $appenders =  array();
 
-	/** Holds appenders indexed by their name */
-	public static $appenders =  array();
+    /**
+     * Adds an appender to the pool.
+     * The appender must be named for this operation.
+     * @param Appender $appender
+     */
+    public static function add(AbstractAppender $appender)
+    {
+        $name = $appender->getName();
 
-	/**
-	 * Adds an appender to the pool.
-	 * The appender must be named for this operation.
-	 * @param Appender $appender
-	 */
-	public static function add(AbstractAppender $appender) {
-		$name = $appender->getName();
+        if (empty($name)) {
+            trigger_error('log4php: Cannot add unnamed appender to pool.', E_USER_WARNING);
 
-		if(empty($name)) {
-			trigger_error('log4php: Cannot add unnamed appender to pool.', E_USER_WARNING);
-			return;
-		}
+            return;
+        }
 
-		if (isset(self::$appenders[$name])) {
-			trigger_error("log4php: Appender [$name] already exists in pool. Overwriting existing appender.", E_USER_WARNING);
-		}
+        if (isset(self::$appenders[$name])) {
+            trigger_error("log4php: Appender [$name] already exists in pool. Overwriting existing appender.", E_USER_WARNING);
+        }
 
-		self::$appenders[$name] = $appender;
-	}
+        self::$appenders[$name] = $appender;
+    }
 
-	/**
-	 * Retrieves an appender from the pool by name.
-	 * @param string $name Name of the appender to retrieve.
-	 * @return Appender The named appender or NULL if no such appender
-	 *  exists in the pool.
-	 */
-	public static function get($name) {
-		return isset(self::$appenders[$name]) ? self::$appenders[$name] : null;
-	}
+    /**
+     * Retrieves an appender from the pool by name.
+     * @param  string   $name Name of the appender to retrieve.
+     * @return Appender The named appender or NULL if no such appender
+     *  exists in the pool.
+     */
+    public static function get($name)
+    {
+        return isset(self::$appenders[$name]) ? self::$appenders[$name] : null;
+    }
 
-	/**
-	* Removes an appender from the pool by name.
-	* @param string $name Name of the appender to remove.
-	*/
-	public static function delete($name) {
-		unset(self::$appenders[$name]);
-	}
+    /**
+    * Removes an appender from the pool by name.
+    * @param string $name Name of the appender to remove.
+    */
+    public static function delete($name)
+    {
+        unset(self::$appenders[$name]);
+    }
 
-	/**
-	 * Returns all appenders from the pool.
-	 * @return array Array of Appender objects.
-	 */
-	public static function getAppenders() {
-		return self::$appenders;
-	}
+    /**
+     * Returns all appenders from the pool.
+     * @return array Array of Appender objects.
+     */
+    public static function getAppenders()
+    {
+        return self::$appenders;
+    }
 
-	/**
-	 * Checks whether an appender exists in the pool.
-	 * @param string $name Name of the appender to look for.
-	 * @return boolean TRUE if the appender with the given name exists.
-	 */
-	public static function exists($name) {
-		return isset(self::$appenders[$name]);
-	}
+    /**
+     * Checks whether an appender exists in the pool.
+     * @param  string  $name Name of the appender to look for.
+     * @return boolean TRUE if the appender with the given name exists.
+     */
+    public static function exists($name)
+    {
+        return isset(self::$appenders[$name]);
+    }
 
-	/**
-	 * Clears all appenders from the pool.
-	 */
-	public static function clear() {
-		 self::$appenders =  array();
-	}
-}
\ No newline at end of file
+    /**
+     * Clears all appenders from the pool.
+     */
+    public static function clear()
+    {
+         self::$appenders =  array();
+    }
+}

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/AbstractAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/AbstractAppender.php b/src/Appenders/AbstractAppender.php
index 9ac29e1..52ffe07 100644
--- a/src/Appenders/AbstractAppender.php
+++ b/src/Appenders/AbstractAppender.php
@@ -26,263 +26,283 @@ use Apache\Log4php\LoggingEvent;
 /**
  * Abstract class that defines output logs strategies.
  */
-abstract class AbstractAppender extends Configurable {
-
-	/**
-	 * Set to true when the appender is closed. A closed appender will not
-	 * accept any logging requests.
-	 * @var boolean
-	 */
-	protected $closed = false;
-
-	/**
-	 * The first filter in the filter chain.
-	 * @var AbstractFilter
-	 */
-	protected $filter;
-
-	/**
-	 * The appender's layout. Can be null if the appender does not use
-	 * a layout.
-	 * @var Layout
-	 */
-	protected $layout;
-
-	/**
-	 * Appender name. Used by other components to identify this appender.
-	 * @var string
-	 */
-	protected $name;
-
-	/**
-	 * Appender threshold level. Events whose level is below the threshold
-	 * will not be logged.
-	 * @var Level
-	 */
-	protected $threshold;
-
-	/**
-	 * Set to true if the appender requires a layout.
-	 *
-	 * True by default, appenders which do not use a layout should override
-	 * this property to false.
-	 *
-	 * @var boolean
-	 */
-	protected $requiresLayout = true;
-
-	/**
-	 * Default constructor.
-	 * @param string $name Appender name
-	 */
-	public function __construct($name = '') {
-		$this->name = $name;
-
-		if ($this->requiresLayout) {
-			$this->layout = $this->getDefaultLayout();
-		}
-	}
-
-	public function __destruct() {
-		$this->close();
-	}
-
-	/**
-	 * Returns the default layout for this appender. Can be overriden by
-	 * derived appenders.
-	 *
-	 * @return Layout
-	 */
-	public function getDefaultLayout() {
-		return new SimpleLayout();
-	}
-
-	/**
-	 * Adds a filter to the end of the filter chain.
-	 * @param AbstractFilter $filter add a new AbstractFilter
-	 */
-	public function addFilter($filter) {
-		if($this->filter === null) {
-			$this->filter = $filter;
-		} else {
-			$this->filter->addNext($filter);
-		}
-	}
-
-	/**
-	 * Clears the filter chain by removing all the filters in it.
-	 */
-	public function clearFilters() {
-		$this->filter = null;
-	}
-
-	/**
-	 * Returns the first filter in the filter chain.
-	 * The return value may be <i>null</i> if no is filter is set.
-	 * @return AbstractFilter
-	 */
-	public function getFilter() {
-		return $this->filter;
-	}
-
-	/**
-	 * Returns the first filter in the filter chain.
-	 * The return value may be <i>null</i> if no is filter is set.
-	 * @return AbstractFilter
-	 */
-	public function getFirstFilter() {
-		return $this->filter;
-	}
-
-	/**
-	 * Performs threshold checks and invokes filters before delegating logging
-	 * to the subclass' specific <i>append()</i> method.
-	 * @see Appender::append()
-	 * @param LoggingEvent $event
-	 */
-	public function doAppend(LoggingEvent $event) {
-		if($this->closed) {
-			return;
-		}
-
-		if(!$this->isAsSevereAsThreshold($event->getLevel())) {
-			return;
-		}
-
-		$filter = $this->getFirstFilter();
-		while($filter !== null) {
-			switch ($filter->decide($event)) {
-				case AbstractFilter::DENY: return;
-				case AbstractFilter::ACCEPT: return $this->append($event);
-				case AbstractFilter::NEUTRAL: $filter = $filter->getNext();
-			}
-		}
-		$this->append($event);
-	}
-
-	/**
-	 * Sets the appender layout.
-	 * @param Layout $layout
-	 */
-	public function setLayout($layout) {
-		if($this->requiresLayout()) {
-			$this->layout = $layout;
-		}
-	}
-
-	/**
-	 * Returns the appender layout.
-	 * @return Layout
-	 */
-	public function getLayout() {
-		return $this->layout;
-	}
-
-	/**
-	 * Configurators call this method to determine if the appender
-	 * requires a layout.
-	 *
-	 * <p>If this method returns <i>true</i>, meaning that layout is required,
-	 * then the configurator will configure a layout using the configuration
-	 * information at its disposal.	 If this method returns <i>false</i>,
-	 * meaning that a layout is not required, then layout configuration will be
-	 * skipped even if there is available layout configuration
-	 * information at the disposal of the configurator.</p>
-	 *
-	 * <p>In the rather exceptional case, where the appender
-	 * implementation admits a layout but can also work without it, then
-	 * the appender should return <i>true</i>.</p>
-	 *
-	 * @return boolean
-	 */
-	public function requiresLayout() {
-		return $this->requiresLayout;
-	}
-
-	/**
-	 * Retruns the appender name.
-	 * @return string
-	 */
-	public function getName() {
-		return $this->name;
-	}
-
-	/**
-	 * Sets the appender name.
-	 * @param string $name
-	 */
-	public function setName($name) {
-		$this->name = $name;
-	}
-
-	/**
-	 * Returns the appender's threshold level.
-	 * @return Level
-	 */
-	public function getThreshold() {
-		return $this->threshold;
-	}
-
-	/**
-	 * Sets the appender threshold.
-	 *
-	 * @param Level|string $threshold Either a {@link Level}
-	 *   object or a string equivalent.
-	 * @see OptionConverter::toLevel()
-	 */
-	public function setThreshold($threshold) {
-		$this->setLevel('threshold', $threshold);
-	}
-
-	/**
-	 * Checks whether the message level is below the appender's threshold.
-	 *
-	 * If there is no threshold set, then the return value is always <i>true</i>.
-	 *
-	 * @param Level $level
-	 * @return boolean Returns true if level is greater or equal than
-	 *   threshold, or if the threshold is not set. Otherwise returns false.
-	 */
-	public function isAsSevereAsThreshold($level) {
-		if($this->threshold === null) {
-			return true;
-		}
-		return $level->isGreaterOrEqual($this->getThreshold());
-	}
-
-	/**
-	 * Prepares the appender for logging.
-	 *
-	 * Derived appenders should override this method if option structure
-	 * requires it.
-	 */
-	public function activateOptions() {
-		$this->closed = false;
-	}
-
-	/**
-	 * Forwards the logging event to the destination.
-	 *
-	 * Derived appenders should implement this method to perform actual logging.
-	 *
-	 * @param LoggingEvent $event
-	 */
-	abstract protected function append(LoggingEvent $event);
-
-	/**
-	 * Releases any resources allocated by the appender.
-	 *
-	 * Derived appenders should override this method to perform proper closing
-	 * procedures.
-	 */
-	public function close() {
-		$this->closed = true;
-	}
-
-	/** Triggers a warning for this logger with the given message. */
-	protected function warn($message) {
-		$id = get_class($this) . (empty($this->name) ? '' : ":{$this->name}");
-		trigger_error("log4php: [$id]: $message", E_USER_WARNING);
-	}
+abstract class AbstractAppender extends Configurable
+{
+    /**
+     * Set to true when the appender is closed. A closed appender will not
+     * accept any logging requests.
+     * @var boolean
+     */
+    protected $closed = false;
+
+    /**
+     * The first filter in the filter chain.
+     * @var AbstractFilter
+     */
+    protected $filter;
+
+    /**
+     * The appender's layout. Can be null if the appender does not use
+     * a layout.
+     * @var Layout
+     */
+    protected $layout;
+
+    /**
+     * Appender name. Used by other components to identify this appender.
+     * @var string
+     */
+    protected $name;
+
+    /**
+     * Appender threshold level. Events whose level is below the threshold
+     * will not be logged.
+     * @var Level
+     */
+    protected $threshold;
+
+    /**
+     * Set to true if the appender requires a layout.
+     *
+     * True by default, appenders which do not use a layout should override
+     * this property to false.
+     *
+     * @var boolean
+     */
+    protected $requiresLayout = true;
+
+    /**
+     * Default constructor.
+     * @param string $name Appender name
+     */
+    public function __construct($name = '')
+    {
+        $this->name = $name;
+
+        if ($this->requiresLayout) {
+            $this->layout = $this->getDefaultLayout();
+        }
+    }
+
+    public function __destruct()
+    {
+        $this->close();
+    }
+
+    /**
+     * Returns the default layout for this appender. Can be overriden by
+     * derived appenders.
+     *
+     * @return Layout
+     */
+    public function getDefaultLayout()
+    {
+        return new SimpleLayout();
+    }
+
+    /**
+     * Adds a filter to the end of the filter chain.
+     * @param AbstractFilter $filter add a new AbstractFilter
+     */
+    public function addFilter($filter)
+    {
+        if ($this->filter === null) {
+            $this->filter = $filter;
+        } else {
+            $this->filter->addNext($filter);
+        }
+    }
+
+    /**
+     * Clears the filter chain by removing all the filters in it.
+     */
+    public function clearFilters()
+    {
+        $this->filter = null;
+    }
+
+    /**
+     * Returns the first filter in the filter chain.
+     * The return value may be <i>null</i> if no is filter is set.
+     * @return AbstractFilter
+     */
+    public function getFilter()
+    {
+        return $this->filter;
+    }
+
+    /**
+     * Returns the first filter in the filter chain.
+     * The return value may be <i>null</i> if no is filter is set.
+     * @return AbstractFilter
+     */
+    public function getFirstFilter()
+    {
+        return $this->filter;
+    }
+
+    /**
+     * Performs threshold checks and invokes filters before delegating logging
+     * to the subclass' specific <i>append()</i> method.
+     * @see Appender::append()
+     * @param LoggingEvent $event
+     */
+    public function doAppend(LoggingEvent $event)
+    {
+        if ($this->closed) {
+            return;
+        }
+
+        if (!$this->isAsSevereAsThreshold($event->getLevel())) {
+            return;
+        }
+
+        $filter = $this->getFirstFilter();
+        while ($filter !== null) {
+            switch ($filter->decide($event)) {
+                case AbstractFilter::DENY: return;
+                case AbstractFilter::ACCEPT: return $this->append($event);
+                case AbstractFilter::NEUTRAL: $filter = $filter->getNext();
+            }
+        }
+        $this->append($event);
+    }
+
+    /**
+     * Sets the appender layout.
+     * @param Layout $layout
+     */
+    public function setLayout($layout)
+    {
+        if ($this->requiresLayout()) {
+            $this->layout = $layout;
+        }
+    }
+
+    /**
+     * Returns the appender layout.
+     * @return Layout
+     */
+    public function getLayout()
+    {
+        return $this->layout;
+    }
+
+    /**
+     * Configurators call this method to determine if the appender
+     * requires a layout.
+     *
+     * <p>If this method returns <i>true</i>, meaning that layout is required,
+     * then the configurator will configure a layout using the configuration
+     * information at its disposal.	 If this method returns <i>false</i>,
+     * meaning that a layout is not required, then layout configuration will be
+     * skipped even if there is available layout configuration
+     * information at the disposal of the configurator.</p>
+     *
+     * <p>In the rather exceptional case, where the appender
+     * implementation admits a layout but can also work without it, then
+     * the appender should return <i>true</i>.</p>
+     *
+     * @return boolean
+     */
+    public function requiresLayout()
+    {
+        return $this->requiresLayout;
+    }
+
+    /**
+     * Retruns the appender name.
+     * @return string
+     */
+    public function getName()
+    {
+        return $this->name;
+    }
+
+    /**
+     * Sets the appender name.
+     * @param string $name
+     */
+    public function setName($name)
+    {
+        $this->name = $name;
+    }
+
+    /**
+     * Returns the appender's threshold level.
+     * @return Level
+     */
+    public function getThreshold()
+    {
+        return $this->threshold;
+    }
+
+    /**
+     * Sets the appender threshold.
+     *
+     * @param Level|string $threshold Either a {@link Level}
+     *   object or a string equivalent.
+     * @see OptionConverter::toLevel()
+     */
+    public function setThreshold($threshold)
+    {
+        $this->setLevel('threshold', $threshold);
+    }
+
+    /**
+     * Checks whether the message level is below the appender's threshold.
+     *
+     * If there is no threshold set, then the return value is always <i>true</i>.
+     *
+     * @param  Level   $level
+     * @return boolean Returns true if level is greater or equal than
+     *   threshold, or if the threshold is not set. Otherwise returns false.
+     */
+    public function isAsSevereAsThreshold($level)
+    {
+        if ($this->threshold === null) {
+            return true;
+        }
+
+        return $level->isGreaterOrEqual($this->getThreshold());
+    }
+
+    /**
+     * Prepares the appender for logging.
+     *
+     * Derived appenders should override this method if option structure
+     * requires it.
+     */
+    public function activateOptions()
+    {
+        $this->closed = false;
+    }
+
+    /**
+     * Forwards the logging event to the destination.
+     *
+     * Derived appenders should implement this method to perform actual logging.
+     *
+     * @param LoggingEvent $event
+     */
+    abstract protected function append(LoggingEvent $event);
+
+    /**
+     * Releases any resources allocated by the appender.
+     *
+     * Derived appenders should override this method to perform proper closing
+     * procedures.
+     */
+    public function close()
+    {
+        $this->closed = true;
+    }
+
+    /** Triggers a warning for this logger with the given message. */
+    protected function warn($message)
+    {
+        $id = get_class($this) . (empty($this->name) ? '' : ":{$this->name}");
+        trigger_error("log4php: [$id]: $message", E_USER_WARNING);
+    }
 
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/ConsoleAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/ConsoleAppender.php b/src/Appenders/ConsoleAppender.php
index def5230..d32fd9e 100644
--- a/src/Appenders/ConsoleAppender.php
+++ b/src/Appenders/ConsoleAppender.php
@@ -35,69 +35,73 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/console.html Appender documentation
  */
- class ConsoleAppender extends AbstractAppender {
+ class ConsoleAppender extends AbstractAppender
+ {
+    /** The standard otuput stream.  */
+    const STDOUT = 'php://stdout';
 
-	/** The standard otuput stream.  */
-	const STDOUT = 'php://stdout';
+    /** The standard error stream.*/
+    const STDERR = 'php://stderr';
 
-	/** The standard error stream.*/
-	const STDERR = 'php://stderr';
+    /** The 'target' parameter. */
+    protected $target = self::STDOUT;
 
-	/** The 'target' parameter. */
-	protected $target = self::STDOUT;
+    /**
+     * Stream resource for the target stream.
+     * @var resource
+     */
+    protected $fp = null;
 
-	/**
-	 * Stream resource for the target stream.
-	 * @var resource
-	 */
-	protected $fp = null;
+    public function activateOptions()
+    {
+        $this->fp = fopen($this->target, 'w');
+        if (is_resource($this->fp) && $this->layout !== null) {
+            fwrite($this->fp, $this->layout->getHeader());
+        }
+        $this->closed = (bool) is_resource($this->fp) === false;
+    }
 
-	public function activateOptions() {
-		$this->fp = fopen($this->target, 'w');
-		if(is_resource($this->fp) && $this->layout !== null) {
-			fwrite($this->fp, $this->layout->getHeader());
-		}
-		$this->closed = (bool)is_resource($this->fp) === false;
-	}
+    public function close()
+    {
+        if ($this->closed != true) {
+            if (is_resource($this->fp) && $this->layout !== null) {
+                fwrite($this->fp, $this->layout->getFooter());
+                fclose($this->fp);
+            }
+            $this->closed = true;
+        }
+    }
 
+    public function append(LoggingEvent $event)
+    {
+        if (is_resource($this->fp) && $this->layout !== null) {
+            fwrite($this->fp, $this->layout->format($event));
+        }
+    }
 
-	public function close() {
-		if($this->closed != true) {
-			if (is_resource($this->fp) && $this->layout !== null) {
-				fwrite($this->fp, $this->layout->getFooter());
-				fclose($this->fp);
-			}
-			$this->closed = true;
-		}
-	}
+    /**
+     * Sets the 'target' parameter.
+     * @param string $target
+     */
+    public function setTarget($target)
+    {
+        $value = trim($target);
+        if ($value == self::STDOUT || strtoupper($value) == 'STDOUT') {
+            $this->target = self::STDOUT;
+        } elseif ($value == self::STDERR || strtoupper($value) == 'STDERR') {
+            $this->target = self::STDERR;
+        } else {
+            $target = var_export($target);
+            $this->warn("Invalid value given for 'target' property: [$target]. Property not set.");
+        }
+    }
 
-	public function append(LoggingEvent $event) {
-		if (is_resource($this->fp) && $this->layout !== null) {
-			fwrite($this->fp, $this->layout->format($event));
-		}
-	}
-
-	/**
-	 * Sets the 'target' parameter.
-	 * @param string $target
-	 */
-	public function setTarget($target) {
-		$value = trim($target);
-		if ($value == self::STDOUT || strtoupper($value) == 'STDOUT') {
-			$this->target = self::STDOUT;
-		} elseif ($value == self::STDERR || strtoupper($value) == 'STDERR') {
-			$this->target = self::STDERR;
-		} else {
-			$target = var_export($target);
-			$this->warn("Invalid value given for 'target' property: [$target]. Property not set.");
-		}
-	}
-
-	/**
-	 * Returns the value of the 'target' parameter.
-	 * @return string
-	 */
-	public function getTarget() {
-		return $this->target;
-	}
+    /**
+     * Returns the value of the 'target' parameter.
+     * @return string
+     */
+    public function getTarget()
+    {
+        return $this->target;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/DailyFileAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/DailyFileAppender.php b/src/Appenders/DailyFileAppender.php
index 7ca1cc7..3464246 100644
--- a/src/Appenders/DailyFileAppender.php
+++ b/src/Appenders/DailyFileAppender.php
@@ -40,91 +40,98 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/daily-file.html Appender documentation
  */
-class DailyFileAppender extends FileAppender {
-
-	/**
-	 * The 'datePattern' parameter.
-	 * Determines how date will be formatted in file name.
-	 * @var string
-	 */
-	protected $datePattern = "Ymd";
-
-	/**
-	 * Current date which was used when opening a file.
-	 * Used to determine if a rollover is needed when the date changes.
-	 * @var string
-	 */
-	protected $currentDate;
-
-	/** Additional validation for the date pattern. */
-	public function activateOptions() {
-		parent::activateOptions();
-
-		if (empty($this->datePattern)) {
-			$this->warn("Required parameter 'datePattern' not set. Closing appender.");
-			$this->closed = true;
-			return;
-		}
-	}
-
-	/**
-	 * Appends a logging event.
-	 *
-	 * If the target file changes because of passage of time (e.g. at midnight)
-	 * the current file is closed. A new file, with the new date, will be
-	 * opened by the write() method.
-	 */
-	public function append(LoggingEvent $event) {
-		$eventDate = $this->getDate($event->getTimestamp());
-
-		// Initial setting of current date
-		if (!isset($this->currentDate)) {
-			$this->currentDate = $eventDate;
-		}
-
-		// Check if rollover is needed
-		else if ($this->currentDate !== $eventDate) {
-			$this->currentDate = $eventDate;
-
-			// Close the file if it's open.
-			// Note: $this->close() is not called here because it would set
-			//       $this->closed to true and the appender would not recieve
-			//       any more logging requests
-			if (is_resource($this->fp)) {
-				$this->write($this->layout->getFooter());
-				fclose($this->fp);
-			}
-			$this->fp = null;
-		}
-
-		parent::append($event);
-	}
-
-	/** Renders the date using the configured <var>datePattern<var>. */
-	protected function getDate($timestamp = null) {
-		return date($this->datePattern, $timestamp);
-	}
-
-	/**
-	 * Determines target file. Replaces %s in file path with a date.
-	 */
-	protected function getTargetFile() {
-		return str_replace('%s', $this->currentDate, $this->file);
-	}
-
-	/**
-	 * Sets the 'datePattern' parameter.
-	 * @param string $datePattern
-	 */
-	public function setDatePattern($datePattern) {
-		$this->setString('datePattern', $datePattern);
-	}
-
-	/**
-	 * Returns the 'datePattern' parameter.
-	 * @return string
-	 */
-	public function getDatePattern() {
-		return $this->datePattern;
-	}
+class DailyFileAppender extends FileAppender
+{
+    /**
+     * The 'datePattern' parameter.
+     * Determines how date will be formatted in file name.
+     * @var string
+     */
+    protected $datePattern = "Ymd";
+
+    /**
+     * Current date which was used when opening a file.
+     * Used to determine if a rollover is needed when the date changes.
+     * @var string
+     */
+    protected $currentDate;
+
+    /** Additional validation for the date pattern. */
+    public function activateOptions()
+    {
+        parent::activateOptions();
+
+        if (empty($this->datePattern)) {
+            $this->warn("Required parameter 'datePattern' not set. Closing appender.");
+            $this->closed = true;
+
+            return;
+        }
+    }
+
+    /**
+     * Appends a logging event.
+     *
+     * If the target file changes because of passage of time (e.g. at midnight)
+     * the current file is closed. A new file, with the new date, will be
+     * opened by the write() method.
+     */
+    public function append(LoggingEvent $event)
+    {
+        $eventDate = $this->getDate($event->getTimestamp());
+
+        // Initial setting of current date
+        if (!isset($this->currentDate)) {
+            $this->currentDate = $eventDate;
+        }
+
+        // Check if rollover is needed
+        else if ($this->currentDate !== $eventDate) {
+            $this->currentDate = $eventDate;
+
+            // Close the file if it's open.
+            // Note: $this->close() is not called here because it would set
+            //       $this->closed to true and the appender would not recieve
+            //       any more logging requests
+            if (is_resource($this->fp)) {
+                $this->write($this->layout->getFooter());
+                fclose($this->fp);
+            }
+            $this->fp = null;
+        }
+
+        parent::append($event);
+    }
+
+    /** Renders the date using the configured <var>datePattern<var>. */
+    protected function getDate($timestamp = null)
+    {
+        return date($this->datePattern, $timestamp);
+    }
+
+    /**
+     * Determines target file. Replaces %s in file path with a date.
+     */
+    protected function getTargetFile()
+    {
+        return str_replace('%s', $this->currentDate, $this->file);
+    }
+
+    /**
+     * Sets the 'datePattern' parameter.
+     * @param string $datePattern
+     */
+    public function setDatePattern($datePattern)
+    {
+        $this->setString('datePattern', $datePattern);
+    }
+
+    /**
+     * Returns the 'datePattern' parameter.
+     * @return string
+     */
+    public function getDatePattern()
+    {
+        return $this->datePattern;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/EchoAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/EchoAppender.php b/src/Appenders/EchoAppender.php
index 1b47ff9..58d21b4 100644
--- a/src/Appenders/EchoAppender.php
+++ b/src/Appenders/EchoAppender.php
@@ -34,56 +34,59 @@ use Apache\Log4php\LoggingEvent;
  */
 class EchoAppender extends AbstractAppender
 {
-	/**
-	 * Used to mark first append. Set to false after first append.
-	 * @var boolean
-	 */
-	protected $firstAppend = true;
+    /**
+     * Used to mark first append. Set to false after first append.
+     * @var boolean
+     */
+    protected $firstAppend = true;
 
-	/**
-	 * If set to true, a <br /> element will be inserted before each line
-	 * break in the logged message. Default value is false. @var boolean
-	 */
-	protected $htmlLineBreaks = false;
+    /**
+     * If set to true, a <br /> element will be inserted before each line
+     * break in the logged message. Default value is false. @var boolean
+     */
+    protected $htmlLineBreaks = false;
 
-	public function close() {
-		if($this->closed != true) {
-			if(!$this->firstAppend) {
-				echo $this->layout->getFooter();
-			}
-		}
-		$this->closed = true;
-	}
+    public function close()
+    {
+        if ($this->closed != true) {
+            if (!$this->firstAppend) {
+                echo $this->layout->getFooter();
+            }
+        }
+        $this->closed = true;
+    }
 
-	public function append(LoggingEvent $event) {
-		if($this->layout !== null) {
-			if($this->firstAppend) {
-				echo $this->layout->getHeader();
-				$this->firstAppend = false;
-			}
-			$text = $this->layout->format($event);
+    public function append(LoggingEvent $event)
+    {
+        if ($this->layout !== null) {
+            if ($this->firstAppend) {
+                echo $this->layout->getHeader();
+                $this->firstAppend = false;
+            }
+            $text = $this->layout->format($event);
 
-			if ($this->htmlLineBreaks) {
-				$text = nl2br($text);
-			}
-			echo $text;
-		}
-	}
+            if ($this->htmlLineBreaks) {
+                $text = nl2br($text);
+            }
+            echo $text;
+        }
+    }
 
-	/**
-	 * Sets the 'htmlLineBreaks' parameter.
-	 * @param boolean $value
-	 */
-	public function setHtmlLineBreaks($value) {
-		$this->setBoolean('htmlLineBreaks', $value);
-	}
+    /**
+     * Sets the 'htmlLineBreaks' parameter.
+     * @param boolean $value
+     */
+    public function setHtmlLineBreaks($value)
+    {
+        $this->setBoolean('htmlLineBreaks', $value);
+    }
 
-	/**
-	 * Returns the 'htmlLineBreaks' parameter.
-	 * @returns boolean
-	 */
-	public function getHtmlLineBreaks() {
-		return $this->htmlLineBreaks;
-	}
+    /**
+     * Returns the 'htmlLineBreaks' parameter.
+     * @returns boolean
+     */
+    public function getHtmlLineBreaks()
+    {
+        return $this->htmlLineBreaks;
+    }
 }
-

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/FileAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/FileAppender.php b/src/Appenders/FileAppender.php
index 5f0cfd4..4d67f2d 100644
--- a/src/Appenders/FileAppender.php
+++ b/src/Appenders/FileAppender.php
@@ -34,192 +34,209 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/file.html Appender documentation
  */
-class FileAppender extends AbstractAppender {
-
-	/**
-	 * If set to true, the file is locked before appending. This allows
-	 * concurrent access. However, appending without locking is faster so
-	 * it should be used where appropriate.
-	 *
-	 * TODO: make this a configurable parameter
-	 *
-	 * @var boolean
-	 */
-	protected $locking = true;
-
-	/**
-	 * If set to true, appends to file. Otherwise overwrites it.
-	 * @var boolean
-	 */
-	protected $append = true;
-
-	/**
-	 * Path to the target file.
-	 * @var string
-	 */
-	protected $file;
-
-	/**
-	 * The file resource.
-	 * @var resource
-	 */
-	protected $fp;
-
-	/**
-	 * Helper function which can be easily overriden by daily file appender.
-	 */
-	protected function getTargetFile() {
-		return $this->file;
-	}
-
-	/**
-	 * Acquires the target file resource, creates the destination folder if
-	 * necessary. Writes layout header to file.
-	 *
-	 * @return boolean FALSE if opening failed
-	 */
-	protected function openFile() {
-		$file = $this->getTargetFile();
-
-		// Create the target folder if needed
-		if(!is_file($file)) {
-			$dir = dirname($file);
-
-			if(!is_dir($dir)) {
-				$success = mkdir($dir, 0777, true);
-				if ($success === false) {
-					$this->warn("Failed creating target directory [$dir]. Closing appender.");
-					$this->closed = true;
-					return false;
-				}
-			}
-		}
-
-		$mode = $this->append ? 'a' : 'w';
-		$this->fp = fopen($file, $mode);
-		if ($this->fp === false) {
-			$this->warn("Failed opening target file. Closing appender.");
-			$this->fp = null;
-			$this->closed = true;
-			return false;
-		}
-
-		// Required when appending with concurrent access
-		if($this->append) {
-			fseek($this->fp, 0, SEEK_END);
-		}
-
-		// Write the header
-		$this->write($this->layout->getHeader());
-	}
-
-	/**
-	 * Writes a string to the target file. Opens file if not already open.
-	 * @param string $string Data to write.
-	 */
-	protected function write($string) {
-		// Lazy file open
-		if(!isset($this->fp)) {
-			if ($this->openFile() === false) {
-				return; // Do not write if file open failed.
-			}
-		}
-
-		if ($this->locking) {
-			$this->writeWithLocking($string);
-		} else {
-			$this->writeWithoutLocking($string);
-		}
-	}
-
-	protected function writeWithLocking($string) {
-		if(flock($this->fp, LOCK_EX)) {
-			if(fwrite($this->fp, $string) === false) {
-				$this->warn("Failed writing to file. Closing appender.");
-				$this->closed = true;
-			}
-			flock($this->fp, LOCK_UN);
-		} else {
-			$this->warn("Failed locking file for writing. Closing appender.");
-			$this->closed = true;
-		}
-	}
-
-	protected function writeWithoutLocking($string) {
-		if(fwrite($this->fp, $string) === false) {
-			$this->warn("Failed writing to file. Closing appender.");
-			$this->closed = true;
-		}
-	}
-
-	public function activateOptions() {
-		if (empty($this->file)) {
-			$this->warn("Required parameter 'file' not set. Closing appender.");
-			$this->closed = true;
-			return;
-		}
-	}
-
-	public function close() {
-		if (is_resource($this->fp)) {
-			$this->write($this->layout->getFooter());
-			fclose($this->fp);
-		}
-		$this->fp = null;
-		$this->closed = true;
-	}
-
-	public function append(LoggingEvent $event) {
-		$this->write($this->layout->format($event));
-	}
-
-	/**
-	 * Sets the 'file' parameter.
-	 * @param string $file
-	 */
-	public function setFile($file) {
-		$this->setString('file', $file);
-	}
-
-	/**
-	 * Returns the 'file' parameter.
-	 * @return string
-	 */
-	public function getFile() {
-		return $this->file;
-	}
-
-	/**
-	 * Returns the 'append' parameter.
-	 * @return boolean
-	 */
-	public function getAppend() {
-		return $this->append;
-	}
-
-	/**
-	 * Sets the 'append' parameter.
-	 * @param boolean $append
-	 */
-	public function setAppend($append) {
-		$this->setBoolean('append', $append);
-	}
-
-	/**
-	 * Sets the 'file' parmeter. Left for legacy reasons.
-	 * @param string $fileName
-	 * @deprecated Use setFile() instead.
-	 */
-	public function setFileName($fileName) {
-		$this->setFile($fileName);
-	}
-
-	/**
-	 * Returns the 'file' parmeter. Left for legacy reasons.
-	 * @return string
-	 * @deprecated Use getFile() instead.
-	 */
-	public function getFileName() {
-		return $this->getFile();
-	}
+class FileAppender extends AbstractAppender
+{
+    /**
+     * If set to true, the file is locked before appending. This allows
+     * concurrent access. However, appending without locking is faster so
+     * it should be used where appropriate.
+     *
+     * TODO: make this a configurable parameter
+     *
+     * @var boolean
+     */
+    protected $locking = true;
+
+    /**
+     * If set to true, appends to file. Otherwise overwrites it.
+     * @var boolean
+     */
+    protected $append = true;
+
+    /**
+     * Path to the target file.
+     * @var string
+     */
+    protected $file;
+
+    /**
+     * The file resource.
+     * @var resource
+     */
+    protected $fp;
+
+    /**
+     * Helper function which can be easily overriden by daily file appender.
+     */
+    protected function getTargetFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * Acquires the target file resource, creates the destination folder if
+     * necessary. Writes layout header to file.
+     *
+     * @return boolean FALSE if opening failed
+     */
+    protected function openFile()
+    {
+        $file = $this->getTargetFile();
+
+        // Create the target folder if needed
+        if (!is_file($file)) {
+            $dir = dirname($file);
+
+            if (!is_dir($dir)) {
+                $success = mkdir($dir, 0777, true);
+                if ($success === false) {
+                    $this->warn("Failed creating target directory [$dir]. Closing appender.");
+                    $this->closed = true;
+
+                    return false;
+                }
+            }
+        }
+
+        $mode = $this->append ? 'a' : 'w';
+        $this->fp = fopen($file, $mode);
+        if ($this->fp === false) {
+            $this->warn("Failed opening target file. Closing appender.");
+            $this->fp = null;
+            $this->closed = true;
+
+            return false;
+        }
+
+        // Required when appending with concurrent access
+        if ($this->append) {
+            fseek($this->fp, 0, SEEK_END);
+        }
+
+        // Write the header
+        $this->write($this->layout->getHeader());
+    }
+
+    /**
+     * Writes a string to the target file. Opens file if not already open.
+     * @param string $string Data to write.
+     */
+    protected function write($string)
+    {
+        // Lazy file open
+        if (!isset($this->fp)) {
+            if ($this->openFile() === false) {
+                return; // Do not write if file open failed.
+            }
+        }
+
+        if ($this->locking) {
+            $this->writeWithLocking($string);
+        } else {
+            $this->writeWithoutLocking($string);
+        }
+    }
+
+    protected function writeWithLocking($string)
+    {
+        if (flock($this->fp, LOCK_EX)) {
+            if (fwrite($this->fp, $string) === false) {
+                $this->warn("Failed writing to file. Closing appender.");
+                $this->closed = true;
+            }
+            flock($this->fp, LOCK_UN);
+        } else {
+            $this->warn("Failed locking file for writing. Closing appender.");
+            $this->closed = true;
+        }
+    }
+
+    protected function writeWithoutLocking($string)
+    {
+        if (fwrite($this->fp, $string) === false) {
+            $this->warn("Failed writing to file. Closing appender.");
+            $this->closed = true;
+        }
+    }
+
+    public function activateOptions()
+    {
+        if (empty($this->file)) {
+            $this->warn("Required parameter 'file' not set. Closing appender.");
+            $this->closed = true;
+
+            return;
+        }
+    }
+
+    public function close()
+    {
+        if (is_resource($this->fp)) {
+            $this->write($this->layout->getFooter());
+            fclose($this->fp);
+        }
+        $this->fp = null;
+        $this->closed = true;
+    }
+
+    public function append(LoggingEvent $event)
+    {
+        $this->write($this->layout->format($event));
+    }
+
+    /**
+     * Sets the 'file' parameter.
+     * @param string $file
+     */
+    public function setFile($file)
+    {
+        $this->setString('file', $file);
+    }
+
+    /**
+     * Returns the 'file' parameter.
+     * @return string
+     */
+    public function getFile()
+    {
+        return $this->file;
+    }
+
+    /**
+     * Returns the 'append' parameter.
+     * @return boolean
+     */
+    public function getAppend()
+    {
+        return $this->append;
+    }
+
+    /**
+     * Sets the 'append' parameter.
+     * @param boolean $append
+     */
+    public function setAppend($append)
+    {
+        $this->setBoolean('append', $append);
+    }
+
+    /**
+     * Sets the 'file' parmeter. Left for legacy reasons.
+     * @param string $fileName
+     * @deprecated Use setFile() instead.
+     */
+    public function setFileName($fileName)
+    {
+        $this->setFile($fileName);
+    }
+
+    /**
+     * Returns the 'file' parmeter. Left for legacy reasons.
+     * @return string
+     * @deprecated Use getFile() instead.
+     */
+    public function getFileName()
+    {
+        return $this->getFile();
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/MailAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MailAppender.php b/src/Appenders/MailAppender.php
index 796167e..d34dce1 100644
--- a/src/Appenders/MailAppender.php
+++ b/src/Appenders/MailAppender.php
@@ -40,97 +40,106 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/mail.html Appender documentation
  */
-class MailAppender extends AbstractAppender {
-
-	/**
-	 * Email address to put in From field of the email.
-	 * @var string
-	 */
-	protected $from = null;
-
-	/**
-	 * The subject of the email.
-	 * @var string
-	 */
-	protected $subject = 'Log4php Report';
-
-	/**
-	 * One or more comma separated email addresses to which to send the email.
-	 * @var string
-	 */
-	protected $to = null;
-
-	/**
-	 * Indiciates whether this appender should run in dry mode.
-	 * @deprecated
-	 * @var boolean
-	 */
-	protected $dry = false;
-
-	/**
-	 * Buffer which holds the email contents before it is sent.
-	 * @var string
-	 */
-	protected $body = '';
-
-	public function append(LoggingEvent $event) {
-		if($this->layout !== null) {
-			$this->body .= $this->layout->format($event);
-		}
-	}
-
-	public function close() {
-		if($this->closed != true) {
-			$from = $this->from;
-			$to = $this->to;
-
-			if(!empty($this->body) and $from !== null and $to !== null and $this->layout !== null) {
-				$subject = $this->subject;
-				if(!$this->dry) {
-					mail(
-						$to, $subject,
-						$this->layout->getHeader() . $this->body . $this->layout->getFooter(),
-						"From: {$from}\r\n");
-				} else {
-				    echo "DRY MODE OF MAIL APP.: Send mail to: ".$to." with content: ".$this->body;
-				}
-			}
-			$this->closed = true;
-		}
-	}
-
-	/** Sets the 'subject' parameter. */
-	public function setSubject($subject) {
-		$this->setString('subject', $subject);
-	}
-
-	/** Returns the 'subject' parameter. */
-	public function getSubject() {
-		return $this->subject;
-	}
-
-	/** Sets the 'to' parameter. */
-	public function setTo($to) {
-		$this->setString('to', $to);
-	}
-
-	/** Returns the 'to' parameter. */
-	public function getTo() {
-		return $this->to;
-	}
-
-	/** Sets the 'from' parameter. */
-	public function setFrom($from) {
-		$this->setString('from', $from);
-	}
-
-	/** Returns the 'from' parameter. */
-	public function getFrom() {
-		return $this->from;
-	}
-
-	/** Enables or disables dry mode. */
-	public function setDry($dry) {
-		$this->setBoolean('dry', $dry);
-	}
+class MailAppender extends AbstractAppender
+{
+    /**
+     * Email address to put in From field of the email.
+     * @var string
+     */
+    protected $from = null;
+
+    /**
+     * The subject of the email.
+     * @var string
+     */
+    protected $subject = 'Log4php Report';
+
+    /**
+     * One or more comma separated email addresses to which to send the email.
+     * @var string
+     */
+    protected $to = null;
+
+    /**
+     * Indiciates whether this appender should run in dry mode.
+     * @deprecated
+     * @var boolean
+     */
+    protected $dry = false;
+
+    /**
+     * Buffer which holds the email contents before it is sent.
+     * @var string
+     */
+    protected $body = '';
+
+    public function append(LoggingEvent $event)
+    {
+        if ($this->layout !== null) {
+            $this->body .= $this->layout->format($event);
+        }
+    }
+
+    public function close()
+    {
+        if ($this->closed != true) {
+            $from = $this->from;
+            $to = $this->to;
+
+            if (!empty($this->body) and $from !== null and $to !== null and $this->layout !== null) {
+                $subject = $this->subject;
+                if (!$this->dry) {
+                    mail(
+                        $to, $subject,
+                        $this->layout->getHeader() . $this->body . $this->layout->getFooter(),
+                        "From: {$from}\r\n");
+                } else {
+                    echo "DRY MODE OF MAIL APP.: Send mail to: ".$to." with content: ".$this->body;
+                }
+            }
+            $this->closed = true;
+        }
+    }
+
+    /** Sets the 'subject' parameter. */
+    public function setSubject($subject)
+    {
+        $this->setString('subject', $subject);
+    }
+
+    /** Returns the 'subject' parameter. */
+    public function getSubject()
+    {
+        return $this->subject;
+    }
+
+    /** Sets the 'to' parameter. */
+    public function setTo($to)
+    {
+        $this->setString('to', $to);
+    }
+
+    /** Returns the 'to' parameter. */
+    public function getTo()
+    {
+        return $this->to;
+    }
+
+    /** Sets the 'from' parameter. */
+    public function setFrom($from)
+    {
+        $this->setString('from', $from);
+    }
+
+    /** Returns the 'from' parameter. */
+    public function getFrom()
+    {
+        return $this->from;
+    }
+
+    /** Enables or disables dry mode. */
+    public function setDry($dry)
+    {
+        $this->setBoolean('dry', $dry);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/MailEventAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MailEventAppender.php b/src/Appenders/MailEventAppender.php
index c49ba12..6a0ff70 100644
--- a/src/Appenders/MailEventAppender.php
+++ b/src/Appenders/MailEventAppender.php
@@ -40,141 +40,156 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/mail-event.html Appender documentation
  */
-class MailEventAppender extends AbstractAppender {
-
-	/**
-	 * Email address to put in From field of the email.
-	 * @var string
-	 */
-	protected $from;
-
-	/**
-	 * Mail server port (widnows only).
-	 * @var integer
-	 */
-	protected $port = 25;
-
-	/**
-	 * Mail server hostname (windows only).
-	 * @var string
-	 */
-	protected $smtpHost;
-
-	/**
-	 * The subject of the email.
-	 * @var string
-	 */
-	protected $subject = 'Log4php Report';
-
-	/**
-	 * One or more comma separated email addresses to which to send the email.
-	 * @var string
-	 */
-	protected $to = null;
-
-	/**
-	 * Indiciates whether this appender should run in dry mode.
-	 * @deprecated
-	 * @var boolean
-	 */
-	protected $dry = false;
-
-	public function activateOptions() {
-		if (empty($this->to)) {
-			$this->warn("Required parameter 'to' not set. Closing appender.");
-			$this->close = true;
-			return;
-		}
-
-		$sendmail_from = ini_get('sendmail_from');
-		if (empty($this->from) and empty($sendmail_from)) {
-			$this->warn("Required parameter 'from' not set. Closing appender.");
-			$this->close = true;
-			return;
-		}
-
-		$this->closed = false;
-	}
-
-	public function append(LoggingEvent $event) {
-		$smtpHost = $this->smtpHost;
-		$prevSmtpHost = ini_get('SMTP');
-		if(!empty($smtpHost)) {
-			ini_set('SMTP', $smtpHost);
-		}
-
-		$smtpPort = $this->port;
-		$prevSmtpPort= ini_get('smtp_port');
-		if($smtpPort > 0 and $smtpPort < 65535) {
-			ini_set('smtp_port', $smtpPort);
-		}
-
-		// On unix only sendmail_path, which is PHP_INI_SYSTEM i.e. not changeable here, is used.
-
-		$addHeader = empty($this->from) ? '' : "From: {$this->from}\r\n";
-
-		if(!$this->dry) {
-			$result = mail($this->to, $this->subject, $this->layout->getHeader() . $this->layout->format($event) . $this->layout->getFooter($event), $addHeader);
-		} else {
-			echo "DRY MODE OF MAIL APP.: Send mail to: ".$this->to." with additional headers '".trim($addHeader)."' and content: ".$this->layout->format($event);
-		}
-
-		ini_set('SMTP', $prevSmtpHost);
-		ini_set('smtp_port', $prevSmtpPort);
-	}
-
-	/** Sets the 'from' parameter. */
-	public function setFrom($from) {
-		$this->setString('from', $from);
-	}
-
-	/** Returns the 'from' parameter. */
-	public function getFrom() {
-		return $this->from;
-	}
-
-	/** Sets the 'port' parameter. */
-	public function setPort($port) {
-		$this->setPositiveInteger('port', $port);
-	}
-
-	/** Returns the 'port' parameter. */
-	public function getPort() {
-		return $this->port;
-	}
-
-	/** Sets the 'smtpHost' parameter. */
-	public function setSmtpHost($smtpHost) {
-		$this->setString('smtpHost', $smtpHost);
-	}
-
-	/** Returns the 'smtpHost' parameter. */
-	public function getSmtpHost() {
-		return $this->smtpHost;
-	}
-
-	/** Sets the 'subject' parameter. */
-	public function setSubject($subject) {
-		$this->setString('subject',  $subject);
-	}
-
-	/** Returns the 'subject' parameter. */
-	public function getSubject() {
-		return $this->subject;
-	}
-
-	/** Sets the 'to' parameter. */
-	public function setTo($to) {
-		$this->setString('to',  $to);
-	}
-
-	/** Returns the 'to' parameter. */
-	public function getTo() {
-		return $this->to;
-	}
-
-	/** Enables or disables dry mode. */
-	public function setDry($dry) {
-		$this->setBoolean('dry', $dry);
-	}
+class MailEventAppender extends AbstractAppender
+{
+    /**
+     * Email address to put in From field of the email.
+     * @var string
+     */
+    protected $from;
+
+    /**
+     * Mail server port (widnows only).
+     * @var integer
+     */
+    protected $port = 25;
+
+    /**
+     * Mail server hostname (windows only).
+     * @var string
+     */
+    protected $smtpHost;
+
+    /**
+     * The subject of the email.
+     * @var string
+     */
+    protected $subject = 'Log4php Report';
+
+    /**
+     * One or more comma separated email addresses to which to send the email.
+     * @var string
+     */
+    protected $to = null;
+
+    /**
+     * Indiciates whether this appender should run in dry mode.
+     * @deprecated
+     * @var boolean
+     */
+    protected $dry = false;
+
+    public function activateOptions()
+    {
+        if (empty($this->to)) {
+            $this->warn("Required parameter 'to' not set. Closing appender.");
+            $this->close = true;
+
+            return;
+        }
+
+        $sendmail_from = ini_get('sendmail_from');
+        if (empty($this->from) and empty($sendmail_from)) {
+            $this->warn("Required parameter 'from' not set. Closing appender.");
+            $this->close = true;
+
+            return;
+        }
+
+        $this->closed = false;
+    }
+
+    public function append(LoggingEvent $event)
+    {
+        $smtpHost = $this->smtpHost;
+        $prevSmtpHost = ini_get('SMTP');
+        if (!empty($smtpHost)) {
+            ini_set('SMTP', $smtpHost);
+        }
+
+        $smtpPort = $this->port;
+        $prevSmtpPort= ini_get('smtp_port');
+        if ($smtpPort > 0 and $smtpPort < 65535) {
+            ini_set('smtp_port', $smtpPort);
+        }
+
+        // On unix only sendmail_path, which is PHP_INI_SYSTEM i.e. not changeable here, is used.
+
+        $addHeader = empty($this->from) ? '' : "From: {$this->from}\r\n";
+
+        if (!$this->dry) {
+            $result = mail($this->to, $this->subject, $this->layout->getHeader() . $this->layout->format($event) . $this->layout->getFooter($event), $addHeader);
+        } else {
+            echo "DRY MODE OF MAIL APP.: Send mail to: ".$this->to." with additional headers '".trim($addHeader)."' and content: ".$this->layout->format($event);
+        }
+
+        ini_set('SMTP', $prevSmtpHost);
+        ini_set('smtp_port', $prevSmtpPort);
+    }
+
+    /** Sets the 'from' parameter. */
+    public function setFrom($from)
+    {
+        $this->setString('from', $from);
+    }
+
+    /** Returns the 'from' parameter. */
+    public function getFrom()
+    {
+        return $this->from;
+    }
+
+    /** Sets the 'port' parameter. */
+    public function setPort($port)
+    {
+        $this->setPositiveInteger('port', $port);
+    }
+
+    /** Returns the 'port' parameter. */
+    public function getPort()
+    {
+        return $this->port;
+    }
+
+    /** Sets the 'smtpHost' parameter. */
+    public function setSmtpHost($smtpHost)
+    {
+        $this->setString('smtpHost', $smtpHost);
+    }
+
+    /** Returns the 'smtpHost' parameter. */
+    public function getSmtpHost()
+    {
+        return $this->smtpHost;
+    }
+
+    /** Sets the 'subject' parameter. */
+    public function setSubject($subject)
+    {
+        $this->setString('subject',  $subject);
+    }
+
+    /** Returns the 'subject' parameter. */
+    public function getSubject()
+    {
+        return $this->subject;
+    }
+
+    /** Sets the 'to' parameter. */
+    public function setTo($to)
+    {
+        $this->setString('to',  $to);
+    }
+
+    /** Returns the 'to' parameter. */
+    public function getTo()
+    {
+        return $this->to;
+    }
+
+    /** Enables or disables dry mode. */
+    public function setDry($dry)
+    {
+        $this->setBoolean('dry', $dry);
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/MongoDBAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/MongoDBAppender.php b/src/Appenders/MongoDBAppender.php
index 38d7dca..0ff180b 100644
--- a/src/Appenders/MongoDBAppender.php
+++ b/src/Appenders/MongoDBAppender.php
@@ -46,321 +46,343 @@ use MongoDate;
  * @link http://github.com/log4mongo/log4mongo-php Vladimir Gorej's original submission.
  * @link http://www.mongodb.org/ MongoDB website.
  */
-class MongoDBAppender extends AbstractAppender {
-
-	// ******************************************
-	// ** Constants                            **
-	// ******************************************
-
-	/** Default prefix for the {@link $host}. */
-	const DEFAULT_MONGO_URL_PREFIX = 'mongodb://';
-
-	/** Default value for {@link $host}, without a prefix. */
-	const DEFAULT_MONGO_HOST = 'localhost';
-
-	/** Default value for {@link $port} */
-	const DEFAULT_MONGO_PORT = 27017;
-
-	/** Default value for {@link $databaseName} */
-	const DEFAULT_DB_NAME = 'log4php_mongodb';
-
-	/** Default value for {@link $collectionName} */
-	const DEFAULT_COLLECTION_NAME = 'logs';
-
-	/** Default value for {@link $timeout} */
-	const DEFAULT_TIMEOUT_VALUE = 3000;
-
-	// ******************************************
-	// ** Configurable parameters              **
-	// ******************************************
-
-	/** Server on which mongodb instance is located. */
-	protected $host;
-
-	/** Port on which the instance is bound. */
-	protected $port;
-
-	/** Name of the database to which to log. */
-	protected $databaseName;
-
-	/** Name of the collection within the given database. */
-	protected $collectionName;
-
-	/** Username used to connect to the database. */
-	protected $userName;
-
-	/** Password used to connect to the database. */
-	protected $password;
-
-	/** Timeout value used when connecting to the database (in milliseconds). */
-	protected $timeout;
-
-	// ******************************************
-	// ** Member variables                     **
-	// ******************************************
-
-	/**
-	 * Connection to the MongoDB instance.
-	 * @var Mongo
-	 */
-	protected $connection;
-
-	/**
-	 * The collection to which log is written.
-	 * @var MongoCollection
-	 */
-	protected $collection;
-
-	public function __construct($name = '') {
-		parent::__construct($name);
-		$this->host = self::DEFAULT_MONGO_URL_PREFIX . self::DEFAULT_MONGO_HOST;
-		$this->port = self::DEFAULT_MONGO_PORT;
-		$this->databaseName = self::DEFAULT_DB_NAME;
-		$this->collectionName = self::DEFAULT_COLLECTION_NAME;
-		$this->timeout = self::DEFAULT_TIMEOUT_VALUE;
-		$this->requiresLayout = false;
-	}
-
-	/**
-	 * Setup db connection.
-	 * Based on defined options, this method connects to the database and
-	 * creates a {@link $collection}.
-	 */
-	public function activateOptions() {
-		try {
-			$this->connection = new Mongo(sprintf('%s:%d', $this->host, $this->port), array('timeout' => $this->timeout));
-			$db	= $this->connection->selectDB($this->databaseName);
-			if ($this->userName !== null && $this->password !== null) {
-				$authResult = $db->authenticate($this->userName, $this->password);
-				if ($authResult['ok'] == floatval(0)) {
-					throw new Exception($authResult['errmsg'], $authResult['ok']);
-				}
-			}
-			$this->collection = $db->selectCollection($this->collectionName);
-		} catch (\MongoConnectionException $ex) {
-			$this->closed = true;
-			$this->warn(sprintf('Failed to connect to mongo deamon: %s', $ex->getMessage()));
-		} catch (\InvalidArgumentException $ex) {
-			$this->closed = true;
-			$this->warn(sprintf('Error while selecting mongo database: %s', $ex->getMessage()));
-		} catch (\Exception $ex) {
-			$this->closed = true;
-			$this->warn('Invalid credentials for mongo database authentication');
-		}
-	}
-
-	/**
-	 * Appends a new event to the mongo database.
-	 *
-	 * @param LoggingEvent $event
-	 */
-	public function append(LoggingEvent $event) {
-		try {
-			if ($this->collection != null) {
-				$this->collection->insert($this->format($event));
-			}
-		} catch (\MongoCursorException $ex) {
-			$this->warn(sprintf('Error while writing to mongo collection: %s', $ex->getMessage()));
-		}
-	}
-
-	/**
-	 * Converts the logging event into an array which can be logged to mongodb.
-	 *
-	 * @param LoggingEvent $event
-	 * @return array The array representation of the logging event.
-	 */
-	protected function format(LoggingEvent $event) {
-		$timestampSec = (int) $event->getTimestamp();
-		$timestampUsec = (int) (($event->getTimestamp() - $timestampSec) * 1000000);
-
-		$document = array(
-			'timestamp' => new MongoDate($timestampSec, $timestampUsec),
-			'level' => $event->getLevel()->toString(),
-			'thread' => (int) $event->getThreadName(),
-			'message' => $event->getMessage(),
-			'loggerName' => $event->getLoggerName()
-		);
-
-		$locationInfo = $event->getLocationInformation();
-		if ($locationInfo != null) {
-			$document['fileName'] = $locationInfo->getFileName();
-			$document['method'] = $locationInfo->getMethodName();
-			$document['lineNumber'] = ($locationInfo->getLineNumber() == 'NA') ? 'NA' : (int) $locationInfo->getLineNumber();
-			$document['className'] = $locationInfo->getClassName();
-		}
-
-		$throwableInfo = $event->getThrowableInformation();
-		if ($throwableInfo != null) {
-			$document['exception'] = $this->formatThrowable($throwableInfo->getThrowable());
-		}
-
-		return $document;
-	}
-
-	/**
-	 * Converts an Exception into an array which can be logged to mongodb.
-	 *
-	 * Supports innner exceptions (PHP >= 5.3)
-	 *
-	 * @param Exception $ex
-	 * @return array
-	 */
-	protected function formatThrowable(Exception $ex) {
-		$array = array(
-			'message' => $ex->getMessage(),
-			'code' => $ex->getCode(),
-			'stackTrace' => $ex->getTraceAsString(),
-		);
-
-		if (method_exists($ex, 'getPrevious') && $ex->getPrevious() !== null) {
-			$array['innerException'] = $this->formatThrowable($ex->getPrevious());
-		}
-
-		return $array;
-	}
-
-	/**
-	 * Closes the connection to the logging database
-	 */
-	public function close() {
-		if($this->closed != true) {
-			$this->collection = null;
-			if ($this->connection !== null) {
-				$this->connection->close();
-				$this->connection = null;
-			}
-			$this->closed = true;
-		}
-	}
-
-	/**
-	 * Sets the value of {@link $host} parameter.
-	 * @param string $host
-	 */
-	public function setHost($host) {
-		if (!preg_match('/^mongodb\:\/\//', $host)) {
-			$host = self::DEFAULT_MONGO_URL_PREFIX . $host;
-		}
-		$this->host = $host;
-	}
-
-	/**
-	 * Returns the value of {@link $host} parameter.
-	 * @return string
-	 */
-	public function getHost() {
-		return $this->host;
-	}
-
-	/**
-	 * Sets the value of {@link $port} parameter.
-	 * @param int $port
-	 */
-	public function setPort($port) {
-		$this->setPositiveInteger('port', $port);
-	}
-
-	/**
-	 * Returns the value of {@link $port} parameter.
-	 * @return int
-	 */
-	public function getPort() {
-		return $this->port;
-	}
-
-	/**
-	 * Sets the value of {@link $databaseName} parameter.
-	 * @param string $databaseName
-	 */
-	public function setDatabaseName($databaseName) {
-		$this->setString('databaseName', $databaseName);
-	}
-
-	/**
-	 * Returns the value of {@link $databaseName} parameter.
-	 * @return string
-	 */
-	public function getDatabaseName() {
-		return $this->databaseName;
-	}
-
-	/**
-	 * Sets the value of {@link $collectionName} parameter.
-	 * @param string $collectionName
-	 */
-	public function setCollectionName($collectionName) {
-		$this->setString('collectionName', $collectionName);
-	}
-
-	/**
-	 * Returns the value of {@link $collectionName} parameter.
-	 * @return string
-	 */
-	public function getCollectionName() {
-		return $this->collectionName;
-	}
-
-	/**
-	 * Sets the value of {@link $userName} parameter.
-	 * @param string $userName
-	 */
-	public function setUserName($userName) {
-		$this->setString('userName', $userName, true);
-	}
-
-	/**
-	 * Returns the value of {@link $userName} parameter.
-	 * @return string
-	 */
-	public function getUserName() {
-		return $this->userName;
-	}
-
-	/**
-	 * Sets the value of {@link $password} parameter.
-	 * @param string $password
-	 */
-	public function setPassword($password) {
-		$this->setString('password', $password, true);
-	}
-
-	/**
-	 * Returns the value of {@link $password} parameter.
-	 * @return string
-	 */
-	public function getPassword() {
-		return $this->password;
-	}
-
-	/**
-	 * Sets the value of {@link $timeout} parameter.
-	 * @param int $timeout
-	 */
-	public function setTimeout($timeout) {
-		$this->setPositiveInteger('timeout', $timeout);
-	}
-
-	/**
-	 * Returns the value of {@link $timeout} parameter.
-	 * @return int
-	 */
-	public function getTimeout() {
-		return $this->timeout;
-	}
-	/**
-	 * Returns the mongodb connection.
-	 * @return Mongo
-	 */
-	public function getConnection() {
-		return $this->connection;
-	}
-
-	/**
-	 * Returns the active mongodb collection.
-	 * @return MongoCollection
-	 */
-	public function getCollection() {
-		return $this->collection;
-	}
+class MongoDBAppender extends AbstractAppender
+{
+    // ******************************************
+    // ** Constants                            **
+    // ******************************************
+
+    /** Default prefix for the {@link $host}. */
+    const DEFAULT_MONGO_URL_PREFIX = 'mongodb://';
+
+    /** Default value for {@link $host}, without a prefix. */
+    const DEFAULT_MONGO_HOST = 'localhost';
+
+    /** Default value for {@link $port} */
+    const DEFAULT_MONGO_PORT = 27017;
+
+    /** Default value for {@link $databaseName} */
+    const DEFAULT_DB_NAME = 'log4php_mongodb';
+
+    /** Default value for {@link $collectionName} */
+    const DEFAULT_COLLECTION_NAME = 'logs';
+
+    /** Default value for {@link $timeout} */
+    const DEFAULT_TIMEOUT_VALUE = 3000;
+
+    // ******************************************
+    // ** Configurable parameters              **
+    // ******************************************
+
+    /** Server on which mongodb instance is located. */
+    protected $host;
+
+    /** Port on which the instance is bound. */
+    protected $port;
+
+    /** Name of the database to which to log. */
+    protected $databaseName;
+
+    /** Name of the collection within the given database. */
+    protected $collectionName;
+
+    /** Username used to connect to the database. */
+    protected $userName;
+
+    /** Password used to connect to the database. */
+    protected $password;
+
+    /** Timeout value used when connecting to the database (in milliseconds). */
+    protected $timeout;
+
+    // ******************************************
+    // ** Member variables                     **
+    // ******************************************
+
+    /**
+     * Connection to the MongoDB instance.
+     * @var Mongo
+     */
+    protected $connection;
+
+    /**
+     * The collection to which log is written.
+     * @var MongoCollection
+     */
+    protected $collection;
+
+    public function __construct($name = '')
+    {
+        parent::__construct($name);
+        $this->host = self::DEFAULT_MONGO_URL_PREFIX . self::DEFAULT_MONGO_HOST;
+        $this->port = self::DEFAULT_MONGO_PORT;
+        $this->databaseName = self::DEFAULT_DB_NAME;
+        $this->collectionName = self::DEFAULT_COLLECTION_NAME;
+        $this->timeout = self::DEFAULT_TIMEOUT_VALUE;
+        $this->requiresLayout = false;
+    }
+
+    /**
+     * Setup db connection.
+     * Based on defined options, this method connects to the database and
+     * creates a {@link $collection}.
+     */
+    public function activateOptions()
+    {
+        try {
+            $this->connection = new Mongo(sprintf('%s:%d', $this->host, $this->port), array('timeout' => $this->timeout));
+            $db	= $this->connection->selectDB($this->databaseName);
+            if ($this->userName !== null && $this->password !== null) {
+                $authResult = $db->authenticate($this->userName, $this->password);
+                if ($authResult['ok'] == floatval(0)) {
+                    throw new Exception($authResult['errmsg'], $authResult['ok']);
+                }
+            }
+            $this->collection = $db->selectCollection($this->collectionName);
+        } catch (\MongoConnectionException $ex) {
+            $this->closed = true;
+            $this->warn(sprintf('Failed to connect to mongo deamon: %s', $ex->getMessage()));
+        } catch (\InvalidArgumentException $ex) {
+            $this->closed = true;
+            $this->warn(sprintf('Error while selecting mongo database: %s', $ex->getMessage()));
+        } catch (\Exception $ex) {
+            $this->closed = true;
+            $this->warn('Invalid credentials for mongo database authentication');
+        }
+    }
+
+    /**
+     * Appends a new event to the mongo database.
+     *
+     * @param LoggingEvent $event
+     */
+    public function append(LoggingEvent $event)
+    {
+        try {
+            if ($this->collection != null) {
+                $this->collection->insert($this->format($event));
+            }
+        } catch (\MongoCursorException $ex) {
+            $this->warn(sprintf('Error while writing to mongo collection: %s', $ex->getMessage()));
+        }
+    }
+
+    /**
+     * Converts the logging event into an array which can be logged to mongodb.
+     *
+     * @param  LoggingEvent $event
+     * @return array        The array representation of the logging event.
+     */
+    protected function format(LoggingEvent $event)
+    {
+        $timestampSec = (int) $event->getTimestamp();
+        $timestampUsec = (int) (($event->getTimestamp() - $timestampSec) * 1000000);
+
+        $document = array(
+            'timestamp' => new MongoDate($timestampSec, $timestampUsec),
+            'level' => $event->getLevel()->toString(),
+            'thread' => (int) $event->getThreadName(),
+            'message' => $event->getMessage(),
+            'loggerName' => $event->getLoggerName()
+        );
+
+        $locationInfo = $event->getLocationInformation();
+        if ($locationInfo != null) {
+            $document['fileName'] = $locationInfo->getFileName();
+            $document['method'] = $locationInfo->getMethodName();
+            $document['lineNumber'] = ($locationInfo->getLineNumber() == 'NA') ? 'NA' : (int) $locationInfo->getLineNumber();
+            $document['className'] = $locationInfo->getClassName();
+        }
+
+        $throwableInfo = $event->getThrowableInformation();
+        if ($throwableInfo != null) {
+            $document['exception'] = $this->formatThrowable($throwableInfo->getThrowable());
+        }
+
+        return $document;
+    }
+
+    /**
+     * Converts an Exception into an array which can be logged to mongodb.
+     *
+     * Supports innner exceptions (PHP >= 5.3)
+     *
+     * @param  Exception $ex
+     * @return array
+     */
+    protected function formatThrowable(Exception $ex)
+    {
+        $array = array(
+            'message' => $ex->getMessage(),
+            'code' => $ex->getCode(),
+            'stackTrace' => $ex->getTraceAsString(),
+        );
+
+        if (method_exists($ex, 'getPrevious') && $ex->getPrevious() !== null) {
+            $array['innerException'] = $this->formatThrowable($ex->getPrevious());
+        }
+
+        return $array;
+    }
+
+    /**
+     * Closes the connection to the logging database
+     */
+    public function close()
+    {
+        if ($this->closed != true) {
+            $this->collection = null;
+            if ($this->connection !== null) {
+                $this->connection->close();
+                $this->connection = null;
+            }
+            $this->closed = true;
+        }
+    }
+
+    /**
+     * Sets the value of {@link $host} parameter.
+     * @param string $host
+     */
+    public function setHost($host)
+    {
+        if (!preg_match('/^mongodb\:\/\//', $host)) {
+            $host = self::DEFAULT_MONGO_URL_PREFIX . $host;
+        }
+        $this->host = $host;
+    }
+
+    /**
+     * Returns the value of {@link $host} parameter.
+     * @return string
+     */
+    public function getHost()
+    {
+        return $this->host;
+    }
+
+    /**
+     * Sets the value of {@link $port} parameter.
+     * @param int $port
+     */
+    public function setPort($port)
+    {
+        $this->setPositiveInteger('port', $port);
+    }
+
+    /**
+     * Returns the value of {@link $port} parameter.
+     * @return int
+     */
+    public function getPort()
+    {
+        return $this->port;
+    }
+
+    /**
+     * Sets the value of {@link $databaseName} parameter.
+     * @param string $databaseName
+     */
+    public function setDatabaseName($databaseName)
+    {
+        $this->setString('databaseName', $databaseName);
+    }
+
+    /**
+     * Returns the value of {@link $databaseName} parameter.
+     * @return string
+     */
+    public function getDatabaseName()
+    {
+        return $this->databaseName;
+    }
+
+    /**
+     * Sets the value of {@link $collectionName} parameter.
+     * @param string $collectionName
+     */
+    public function setCollectionName($collectionName)
+    {
+        $this->setString('collectionName', $collectionName);
+    }
+
+    /**
+     * Returns the value of {@link $collectionName} parameter.
+     * @return string
+     */
+    public function getCollectionName()
+    {
+        return $this->collectionName;
+    }
+
+    /**
+     * Sets the value of {@link $userName} parameter.
+     * @param string $userName
+     */
+    public function setUserName($userName)
+    {
+        $this->setString('userName', $userName, true);
+    }
+
+    /**
+     * Returns the value of {@link $userName} parameter.
+     * @return string
+     */
+    public function getUserName()
+    {
+        return $this->userName;
+    }
+
+    /**
+     * Sets the value of {@link $password} parameter.
+     * @param string $password
+     */
+    public function setPassword($password)
+    {
+        $this->setString('password', $password, true);
+    }
+
+    /**
+     * Returns the value of {@link $password} parameter.
+     * @return string
+     */
+    public function getPassword()
+    {
+        return $this->password;
+    }
+
+    /**
+     * Sets the value of {@link $timeout} parameter.
+     * @param int $timeout
+     */
+    public function setTimeout($timeout)
+    {
+        $this->setPositiveInteger('timeout', $timeout);
+    }
+
+    /**
+     * Returns the value of {@link $timeout} parameter.
+     * @return int
+     */
+    public function getTimeout()
+    {
+        return $this->timeout;
+    }
+    /**
+     * Returns the mongodb connection.
+     * @return Mongo
+     */
+    public function getConnection()
+    {
+        return $this->connection;
+    }
+
+    /**
+     * Returns the active mongodb collection.
+     * @return MongoCollection
+     */
+    public function getCollection()
+    {
+        return $this->collection;
+    }
 }

http://git-wip-us.apache.org/repos/asf/logging-log4php/blob/35dfd5d3/src/Appenders/NullAppender.php
----------------------------------------------------------------------
diff --git a/src/Appenders/NullAppender.php b/src/Appenders/NullAppender.php
index e599013..dd41040 100644
--- a/src/Appenders/NullAppender.php
+++ b/src/Appenders/NullAppender.php
@@ -27,18 +27,19 @@ use Apache\Log4php\LoggingEvent;
  * @license http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
  * @link http://logging.apache.org/log4php/docs/appenders/null.html Appender documentation
  */
-class NullAppender extends AbstractAppender {
+class NullAppender extends AbstractAppender
+{
+    /**
+     * This appender does not require a layout.
+     */
+    protected $requiresLayout = false;
 
-	/**
-	 * This appender does not require a layout.
-	 */
-	protected $requiresLayout = false;
-
-	/**
-	 * Do nothing.
-	 *
-	 * @param LoggingEvent $event
-	 */
-	public function append(LoggingEvent $event) {
-	}
+    /**
+     * Do nothing.
+     *
+     * @param LoggingEvent $event
+     */
+    public function append(LoggingEvent $event)
+    {
+    }
 }