name = $name; } /** * Add a filter to the end of the filter list. * * @param LoggerFilter $newFilter add a new LoggerFilter */ public function addFilter($newFilter) { if($this->filter === null) { $this->filter = $newFilter; } else { $this->filter->addNext($newFilter); } } /** * Clear the list of filters by removing all the filters in it. * @abstract */ public function clearFilters() { unset($this->filter); $this->filter = null; } /** * Return the first filter in the filter chain for this Appender. * The return value may be null if no is filter is set. * @return LoggerFilter */ public function getFilter() { return $this->filter; } /** * Return the first filter in the filter chain for this Appender. * The return value may be null if no is filter is set. * @return LoggerFilter */ public function getFirstFilter() { return $this->filter; } /** * This method performs threshold checks and invokes filters before * delegating actual logging to the subclasses specific append() method. * @see LoggerAppender::doAppend() * @param LoggerLoggingEvent $event */ public function doAppend(LoggerLoggingEvent $event) { if($this->closed) { return; } if(!$this->isAsSevereAsThreshold($event->getLevel())) { return; } $f = $this->getFirstFilter(); while($f !== null) { switch ($f->decide($event)) { case LoggerFilter::DENY: return; case LoggerFilter::ACCEPT: return $this->append($event); case LoggerFilter::NEUTRAL: $f = $f->getNext(); } } $this->append($event); } /** * Set the Layout for this appender. * @see LoggerAppender::setLayout() * @param LoggerLayout $layout */ public function setLayout($layout) { if($this->requiresLayout()) { $this->layout = $layout; } } /** * Returns this appender layout. * @see LoggerAppender::getLayout() * @return LoggerLayout */ public function getLayout() { return $this->layout; } /** * Configurators call this method to determine if the appender * requires a layout. * *

If this method returns true, meaning that layout is required, * then the configurator will configure a layout using the configuration * information at its disposal. If this method returns false, * 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.

* *

In the rather exceptional case, where the appender * implementation admits a layout but can also work without it, then * the appender should return true.

* * @see LoggerAppender::requiresLayout() * @return boolean */ public function requiresLayout() { return $this->requiresLayout; } /** * Get the name of this appender. * @see LoggerAppender::getName() * @return string */ public function getName() { return $this->name; } /** * Set the name of this appender. * * The name is used by other components to identify this appender. * * * @param string $name */ public function setName($name) { $this->name = $name; } /** * Returns this appenders threshold level. * See the {@link setThreshold()} method for the meaning of this option. * @return LoggerLevel */ public function getThreshold() { return $this->threshold; } /** * Set the threshold level of this appender. * * @param mixed $threshold can be a {@link LoggerLevel} object or a string. * @see LoggerOptionConverter::toLevel() */ public function setThreshold($threshold) { if(is_string($threshold)) { $this->threshold = LoggerOptionConverter::toLevel($threshold, null); } else if($threshold instanceof LoggerLevel) { $this->threshold = $threshold; } } /** * Check whether the message level is below the appender's threshold. * * * If there is no threshold set, then the return value is always true. * @param LoggerLevel $level * @return boolean true if priority is greater or equal than threshold */ public function isAsSevereAsThreshold($level) { if($this->threshold === null) { return true; } return $level->isGreaterOrEqual($this->getThreshold()); } /** * Derived appenders should override this method if option structure * requires it. */ abstract public function activateOptions(); /** * Subclasses of {@link LoggerAppender} should implement * this method to perform actual logging. * * @param LoggerLoggingEvent $event * @see doAppend() * @abstract */ abstract protected function append(LoggerLoggingEvent $event); /** * Release any resources allocated. * Subclasses of {@link LoggerAppender} should implement * this method to perform proper closing procedures. * @abstract */ abstract public function close(); }