This filter allows for efficient course grained filtering based on criteria
such as product name or company name that would be associated with requests
as they are processed.
This filter will allow you to associate threshold levels to a key put in
the MDC. This key can be any value specified by the user. Furthermore, you
can pass MDC value and level threshold associations, which are then looked up
to find the level threshold to apply to the current logging request. If no
level threshold could be found, then a 'default' value specified by the user
is applied. We call this value 'levelAssociatedWithMDCValue'.
If 'levelAssociatedWithMDCValue' is higher or equal to the level of the
current logger request, the
#decide(Marker,Logger,Level,String,Object[],Throwable)method returns the value of
#getOnHigherOrEqual(),
if it is lower then the value of
#getOnLower() is returned.
Both 'onHigherOrEqual' and 'onLower' can be set by the user. By default,
'onHigherOrEqual' is set to NEUTRAL and 'onLower' is set to DENY. Thus, if
the current logger request's level is lower than
'levelAssociatedWithMDCValue', then the request is denied, and if it is
higher or equal, then this filter decides NEUTRAL letting subsequent filters
to make the decision on the fate of the logging request.
The example below illustrates how logging could be enabled for only
individual users. In this example all events for logger names matching
"com.mycompany" will be logged if they are for 'user1' and at a level higher
than equals to DEBUG, and for 'user2' if they are at a level higher than or
equal to TRACE, and for other users only if they are at level ERROR or
higher. Events issued by loggers other than "com.mycompany" will only be
logged if they are at level ERROR or higher since that is all the root logger
allows.
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</appender>
<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
<Key>userId</Key>
<DefaultThreshold>ERROR</DefaultThreshold>
<MDCValueLevelPair>
<value>user1</value>
<level>DEBUG</level>
</MDCValueLevelPair>
<MDCValueLevelPair>
<value>user2</value>
<level>TRACE</level>
</MDCValueLevelPair>
</turboFilter>
<logger name="com.mycompany" level="TRACE"/>
<root level="ERROR" >
<appender-ref ref="STDOUT" />
</root>
</configuration>
In the next configuration events from user1 and user2 will be logged
regardless of the logger levels. Events for other users and records without a
userid in the MDC will be logged if they are ERROR level messages. With this
configuration, the root level is never checked since DynamicThresholdFilter
will either accept or deny all records.
<configuration>
<appender name="STDOUT"
class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>TEST %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</layout>
</appender>
<turboFilter class="ch.qos.logback.classic.turbo.DynamicThresholdFilter">
<Key>userId</Key>
<DefaultThreshold>ERROR</DefaultThreshold>
<OnHigherOrEqual>ACCEPT</OnHigherOrEqual>
<OnLower>DENY</OnLower>
<MDCValueLevelPair>
<value>user1</value>
<level>TRACE</level>
</MDCValueLevelPair>
<MDCValueLevelPair>
<value>user2</value>
<level>TRACE</level>
</MDCValueLevelPair>
</turboFilter>
<root level="DEBUG" >
<appender-ref ref="STDOUT" />
</root>
</configuration>