Hello Log4J users,

I am using Log4J 2.5 with AsyncLogger mode enabled. I am trying to filter 
events at the Appender level using DynamicThresholdFilter but it is not working.

I believe this is because the filter is basing its decision on the 
ThreadContext even though it is filtering an asynchronous event on a worker 
thread :

    private Result filter(final Level level) {
        final Object value = ThreadContext.get(key); // always returns null, 
ThreadContext is empty on disruptor thread
        if (value != null) {
...

I fixed the DynamicThresholdFilter to use the context from the log event 
instead,  and it  gave me the expected filtering behavior :

    private Result filter(final Level level, Map<String, String> context) {
        final Object value = context.get(key);
        if (value != null) {
...

    public Result filter(final LogEvent event) {
        return filter(event.getLevel(), event.getContextMap());
    }

    public Result filter(final Logger logger, final Level level, final Marker 
marker, final Message msg,
                         final Throwable t) {
        return filter(level, ThreadContext.getContext());
    }

ThreadContextMapFilter is built the same way. Unless I am mistaken and forgot 
some basic tenement of log4j usage, this make these Filters useless in async 
mode elsewhere than Context-wide.

Should I keep  on using my fixed version of the Filter or should I submit a 
tentative fix? If so, please tell me what is the procedure to do so.

Thank you,

Francis




Reply via email to