You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

355 lines
8.8 KiB

<?php
/**
* log4php is a PHP port of the log4j java logging package.
*
* <p>This framework is based on log4j (see {@link http://jakarta.apache.org/log4j log4j} for details).</p>
* <p>Design, strategies and part of the methods documentation are developed by log4j team
* (Ceki G�lc� as log4j project founder and
* {@link http://jakarta.apache.org/log4j/docs/contributors.html contributors}).</p>
*
* <p>PHP port, extensions and modifications by VxR. All rights reserved.<br>
* For more information, please see {@link http://www.vxr.it/log4php/}.</p>
*
* <p>This software is published under the terms of the LGPL License
* a copy of which has been included with this distribution in the LICENSE file.</p>
*
* @package log4php
*/
/**
* @ignore
*/
if (!defined('LOG4PHP_DIR')) define('LOG4PHP_DIR', dirname(__FILE__));
/**
*/
require_once(LOG4PHP_DIR . '/LoggerAppender.php');
require_once(LOG4PHP_DIR . '/LoggerLog.php');
require_once(LOG4PHP_DIR . '/helpers/LoggerOptionConverter.php');
/**
* Abstract superclass of the other appenders in the package.
*
* This class provides the code for common functionality, such as
* support for threshold filtering and support for general filters.
*
* @author VxR <vxr@vxr.it>
* @author Sergio Strampelli <sergio@ascia.net>
* @version $Revision: 1.1 $
* @package log4php
* @abstract
*/
class LoggerAppenderSkeleton extends LoggerAppender {
/**
* @var boolean closed appender flag
*/
var $closed;
/**
* @var object unused
*/
var $errorHandler;
/**
* The first filter in the filter chain
* @var LoggerFilter
*/
var $headFilter = null;
/**
* LoggerLayout for this appender. It can be null if appender has its own layout
* @var LoggerLayout
*/
var $layout = null;
/**
* @var string Appender name
*/
var $name;
/**
* The last filter in the filter chain
* @var LoggerFilter
*/
var $tailFilter = null;
/**
* @var LoggerLevel There is no level threshold filtering by default.
*/
var $threshold = null;
/**
* @var boolean needs a layout formatting ?
*/
var $requiresLayout = false;
/* --------------------------------------------------------------------------*/
/* --------------------------------------------------------------------------*/
/* --------------------------------------------------------------------------*/
/**
* Constructor
*
* @param string $name appender name
*/
function LoggerAppenderSkeleton($name)
{
$this->name = $name;
$this->clearFilters();
}
/**
* @param LoggerFilter $newFilter add a new LoggerFilter
* @see LoggerAppender::addFilter()
*/
function addFilter($newFilter)
{
if($this->headFilter === null) {
$this->headFilter = $newFilter;
$this->tailFilter =& $this->headFilter;
} else {
$this->tailFilter->next = $newFilter;
$this->tailFilter =& $this->tailFilter->next;
}
}
/**
* Derived appenders should override this method if option structure
* requires it.
*/
function activateOptions()
{
}
/**
* Subclasses of {@link LoggerAppenderSkeleton} should implement
* this method to perform actual logging.
*
* @param LoggerLoggingEvent $event
* @see doAppend()
* @abstract
*/
function append($event)
{
// override me
}
/**
* @see LoggerAppender::clearFilters()
*/
function clearFilters()
{
unset($this->headFilter);
unset($this->tailFilter);
$this->headFilter = null;
$this->tailFilter = null;
}
/**
* @see LoggerAppender::close()
*/
function close()
{
//override me
}
/**
* Finalize this appender by calling the derived class' <i>close()</i> method.
*/
function finalize()
{
// An appender might be closed then garbage collected. There is no
// point in closing twice.
if ($this->closed) return;
LoggerLog::debug("LoggerAppenderSkeleton::finalize():name=[{$this->name}].");
$this->close();
}
/**
* Do not use this method.
* @see LoggerAppender::getErrorHandler()
* @return object
*/
function &getErrorHandler()
{
return $this->errorHandler;
}
/**
* @see LoggerAppender::getFilter()
* @return Filter
*/
function &getFilter()
{
return $this->headFilter;
}
/**
* Return the first filter in the filter chain for this Appender.
* The return value may be <i>null</i> if no is filter is set.
* @return Filter
*/
function &getFirstFilter()
{
return $this->headFilter;
}
/**
* @see LoggerAppender::getLayout()
* @return LoggerLayout
*/
function &getLayout()
{
return $this->layout;
}
/**
* @see LoggerAppender::getName()
* @return string
*/
function getName()
{
return $this->name;
}
/**
* Returns this appenders threshold level.
* See the {@link setThreshold()} method for the meaning of this option.
* @return LoggerLevel
*/
function &getThreshold()
{
return $this->threshold;
}
/**
* Check 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 LoggerLevel $priority
* @return boolean true if priority is greater or equal than threshold
*/
function isAsSevereAsThreshold($priority)
{
if ($this->threshold === null)
return true;
return $priority->isGreaterOrEqual($this->getThreshold());
}
/**
* @see LoggerAppender::doAppend()
* @param LoggerLoggingEvent $event
*/
function doAppend($event)
{
LoggerLog::debug("LoggerAppenderSkeleton::doAppend()");
if ($this->closed) {
LoggerLog::debug("LoggerAppenderSkeleton::doAppend() Attempted to append to closed appender named [{$this->name}].");
return;
}
if(!$this->isAsSevereAsThreshold($event->getLevel())) {
LoggerLog::debug("LoggerAppenderSkeleton::doAppend() event level is less severe than threshold.");
return;
}
$f = $this->getFirstFilter();
while($f !== null) {
switch ($f->decide($event)) {
case LOG4PHP_LOGGER_FILTER_DENY: return;
case LOG4PHP_LOGGER_FILTER_ACCEPT: return $this->append($event);
case LOG4PHP_LOGGER_FILTER_NEUTRAL: $f = $f->next;
}
}
$this->append($event);
}
/**
* @see LoggerAppender::requiresLayout()
* @return boolean
*/
function requiresLayout()
{
return $this->requiresLayout;
}
/**
* @see LoggerAppender::setErrorHandler()
* @param object
*/
function setErrorHandler($errorHandler)
{
if($errorHandler == null) {
// We do not throw exception here since the cause is probably a
// bad config file.
LoggerLog::warn("You have tried to set a null error-handler.");
} else {
$this->errorHandler = $errorHandler;
}
}
/**
* @see LoggerAppender::setLayout()
* @param LoggerLayout $layout
*/
function setLayout($layout)
{
if ($this->requiresLayout())
$this->layout = $layout;
}
/**
* @see LoggerAppender::setName()
* @param string $name
*/
function setName($name)
{
$this->name = $name;
}
/**
* Set the threshold level of this appender.
*
* @param mixed $threshold can be a {@link LoggerLevel} object or a string.
* @see LoggerOptionConverter::toLevel()
*/
function setThreshold($threshold)
{
if (is_string($threshold)) {
$this->threshold = LoggerOptionConverter::toLevel($threshold, null);
}elseif (is_a($threshold, 'loggerlevel')) {
$this->threshold = $threshold;
}
}
/**
* Perform actions before object serialization.
*
* Call {@link finalize()} to properly close the appender.
*/
function __sleep()
{
$this->finalize();
return array_keys(get_object_vars($this));
}
/**
* Perform actions after object deserialization.
*
* Call {@link activateOptions()} to properly setup the appender.
*/
function __wakeup()
{
$this->activateOptions();
}
}
?>