//Dstl (c) Crown Copyright 2017 package uk.gov.dstl.baleen.core.logging; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.filter.Filter; import ch.qos.logback.core.spi.FilterReply; /** * A log event filter which includes only logs within a certain level window (defined by a minimum and maximum level). * * */ public class MinMaxFilter extends Filter<ILoggingEvent> { private final Level min; private final Level max; /** * Create a new instance of MinMaxFilter * * @param min The lowest level to log (inclusive), defaults to INFO if not provided * @param max The highest level to log (inclusive), defaults to the highest level, ERROR, if not provided */ public MinMaxFilter(Level min, Level max) { this.min = min == null ? Level.INFO : min; this.max = max == null ? Level.ERROR : max; } /** * Get the minimum level of the current filter. * * @return The minimum level */ public Level getMin() { return min; } /** * Get the maximum level of the current filter. * * @return The maximum level */ public Level getMax() { return max; } /** * Decide whether a given logging event should be accepted or not by this filter (i.e. whether it falls within the specified levels). * * @param event The logging event being examined * @return Whether the event should be accepted or not */ @Override public FilterReply decide(ILoggingEvent event) { Level level = event.getLevel(); if (level == null) { // We specifically avoid logging here to avoid any circular issues. return FilterReply.DENY; } boolean allow = level.isGreaterOrEqual(min) && max.isGreaterOrEqual(level); return allow ? FilterReply.NEUTRAL : FilterReply.DENY; } }