package org.infinispan.util.logging.log4j;
import java.util.regex.Pattern;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Marker;
import org.apache.logging.log4j.core.Filter;
import org.apache.logging.log4j.core.LogEvent;
import org.apache.logging.log4j.core.Logger;
import org.apache.logging.log4j.core.config.plugins.Plugin;
import org.apache.logging.log4j.core.config.plugins.PluginAttribute;
import org.apache.logging.log4j.core.config.plugins.PluginFactory;
import org.apache.logging.log4j.core.filter.AbstractFilter;
import org.apache.logging.log4j.message.Message;
/**
* Log4j {@link Filter} that only allow events from threads matching a regular expression.
* Events with a level greater than {@code threshold} are always logged.
*
* @author Dan Berindei
* @since 5.2
*/
@Plugin(name = "ThreadNameFilter", category = "Core", elementType = Filter.ELEMENT_TYPE, printObject = true)
public final class ThreadNameFilter extends AbstractFilter {
/** The serialVersionUID */
private static final long serialVersionUID = 1L;
private final Level level;
private final Pattern includePattern;
public ThreadNameFilter(Level actualLevel, String includeRegex) {
this.level = actualLevel;
this.includePattern = Pattern.compile(includeRegex);
}
@Override
public Result filter(final Logger logger, final Level level, final Marker marker, final String msg,
final Object... params) {
return filter(level, Thread.currentThread().getName());
}
@Override
public Result filter(final Logger logger, final Level level, final Marker marker, final Object msg,
final Throwable t) {
return filter(level, Thread.currentThread().getName());
}
@Override
public Result filter(final Logger logger, final Level level, final Marker marker, final Message msg,
final Throwable t) {
return filter(level, Thread.currentThread().getName());
}
@Override
public Result filter(final LogEvent event) {
return filter(event.getLevel(), event.getThreadName());
}
private Result filter(final Level level, String threadName) {
if (level.isMoreSpecificThan(this.level)) {
return Result.NEUTRAL;
} else if (includePattern == null || includePattern.matcher(threadName).find()) {
return Result.NEUTRAL;
} else {
return Result.DENY;
}
}
@Override
public String toString() {
return level.toString();
}
/**
* Create a ThresholdFilter.
* @param level The log Level.
* @param match The action to take on a match.
* @param mismatch The action to take on a mismatch.
* @return The created ThresholdFilter.
*/
@PluginFactory
public static ThreadNameFilter createFilter(
@PluginAttribute("level") final Level level,
@PluginAttribute("include") final String include) {
final Level actualLevel = level == null ? Level.DEBUG : level;
final String includeRegex = include == null ? ".*" : include;
return new ThreadNameFilter(actualLevel, includeRegex);
}
}