diff --git a/library/log4php/filters/LoggerFilterLevelRange.php b/library/log4php/filters/LoggerFilterLevelRange.php new file mode 100644 --- /dev/null +++ b/library/log4php/filters/LoggerFilterLevelRange.php @@ -0,0 +1,138 @@ +The filter admits three options LevelMin, LevelMax + * and AcceptOnMatch.

+ * + *

If the level of the {@link LoggerLoggingEvent} is not between Min and Max + * (inclusive), then {@link LoggerFilter::DENY} is returned.

+ * + *

If the Logging event level is within the specified range, then if + * AcceptOnMatch is true, + * {@link LoggerFilter::ACCEPT} is returned, and if + * AcceptOnMatch is false, + * {@link LoggerFilter::NEUTRAL} is returned.

+ * + *

If LevelMin is not defined, then there is no + * minimum acceptable level (i.e. a level is never rejected for + * being too "low"/unimportant). If LevelMax is not + * defined, then there is no maximum acceptable level (ie a + * level is never rejected for being too "high"/important).

+ * + *

Refer to the {@link LoggerAppender::setThreshold()} method + * available to all appenders extending {@link LoggerAppender} + * for a more convenient way to filter out events by level.

+ * + *

+ * An example for this filter: + * + * {@example ../../examples/php/filter_levelrange.php 19} + * + *

+ * The corresponding XML file: + * + * {@example ../../examples/resources/filter_levelrange.xml 18} + * + * @author Simon Kitching + * @author based on the org.apache.log4j.varia.LevelRangeFilte Java code by Ceki Gülcü + * + * @version $Revision: 1213283 $ + * @package log4php + * @subpackage filters + * @since 0.6 + */ +class LoggerFilterLevelRange extends LoggerFilter { + + /** + * @var boolean + */ + protected $acceptOnMatch = true; + + /** + * @var LoggerLevel + */ + protected $levelMin; + + /** + * @var LoggerLevel + */ + protected $levelMax; + + /** + * @param boolean $acceptOnMatch + */ + public function setAcceptOnMatch($acceptOnMatch) { + $this->setBoolean('acceptOnMatch', $acceptOnMatch); + } + + /** + * @param string $l the level min to match + */ + public function setLevelMin($level) { + $this->setLevel('levelMin', $level); + } + + /** + * @param string $l the level max to match + */ + public function setLevelMax($level) { + $this->setLevel('levelMax', $level); + } + + /** + * Return the decision of this filter. + * + * @param LoggerLoggingEvent $event + * @return integer + */ + public function decide(LoggerLoggingEvent $event) { + $level = $event->getLevel(); + + if ($this->levelMin !== null) { + if ($level->isGreaterOrEqual($this->levelMin) == false) { + // level of event is less than minimum + return LoggerFilter::DENY; + } + } + + if ($this->levelMax !== null) { + if ($level->toInt() > $this->levelMax->toInt()) { + // level of event is greater than maximum + // Alas, there is no Level.isGreater method. and using + // a combo of isGreaterOrEqual && !Equal seems worse than + // checking the int values of the level objects.. + return LoggerFilter::DENY; + } + } + + if ($this->acceptOnMatch) { + // this filter set up to bypass later filters and always return + // accept if level in range + return LoggerFilter::ACCEPT; + } else { + // event is ok for this filter; allow later filters to have a look.. + return LoggerFilter::NEUTRAL; + } + } +}