
This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Logback: the generic, reliable, fast and flexible logging framework.". The branch, eventAlteringTurboFilters has been created at c08e014747419bacec338a5104184535de8fcdce (commit) - Log ----------------------------------------------------------------- http://git.qos.ch/gitweb/?p=logback.git;a=commit;h=c08e014747419bacec338a510... http://github.com/ceki/logback/commit/c08e014747419bacec338a5104184535de8fcd... commit c08e014747419bacec338a5104184535de8fcdce Author: Ceki Gulcu <ceki@qos.ch> Date: Wed Mar 31 22:38:54 2010 +0200 - started work on http://jira.qos.ch/browse/LBCLASSIC-195 The decide() method in TurboFilter now admits a LoggingEvent as an argument instead of LoggingEvent constituents parts The performance of logging when no turbo filters are installed remains unchanged. However, an extra 30 nanoseconds (on a fast machine) are added when there are one or more registered turbo filters which corresponds to the cost of creating a LoggingEvent and garbage collecting it even if the event is not used. The extra cost is deemed acceptable given the flexibility it provides. diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java b/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java index 0d2957f..f2cdcbc 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/Logger.java @@ -80,12 +80,18 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, * synchronized on 'this' (Logger) protecting against simultaneous * re-configuration of this logger (a very unlikely scenario). * - * <p> It is further assumed that the AppenderAttachableImpl is responsible - * for its internal synchronization and thread safety. Thus, we can get away - * with *not* synchronizing on the 'aai' (check null/ read) because <p> 1) the - * 'aai' variable is immutable once set to non-null <p> 2) 'aai' is getAndSet - * only within addAppender which is synchronized <p> 3) all the other methods - * check whether 'aai' is null <p> 4) AppenderAttachableImpl is thread safe + * <p> + * It is further assumed that the AppenderAttachableImpl is responsible for + * its internal synchronization and thread safety. Thus, we can get away with + * *not* synchronizing on the 'aai' (check null/ read) because + * <p> + * 1) the 'aai' variable is immutable once set to non-null + * <p> + * 2) 'aai' is getAndSet only within addAppender which is synchronized + * <p> + * 3) all the other methods check whether 'aai' is null + * <p> + * 4) AppenderAttachableImpl is thread safe */ private transient AppenderAttachableImpl<ILoggingEvent> aai; /** @@ -158,17 +164,18 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, // nothing to do; return; } - if(newLevel == null && isRootLogger()) { - throw new IllegalArgumentException("The level of the root logger cannot be set to null"); + if (newLevel == null && isRootLogger()) { + throw new IllegalArgumentException( + "The level of the root logger cannot be set to null"); } - + level = newLevel; if (newLevel == null) { effectiveLevelInt = parent.effectiveLevelInt; } else { effectiveLevelInt = newLevel.levelInt; } - + if (childrenList != null) { int len = childrenList.size(); for (int i = 0; i < len; i++) { @@ -203,8 +210,9 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, } /** - * Remove all previously added appenders from this logger instance. <p/> This - * is useful when re-reading configuration information. + * Remove all previously added appenders from this logger instance. + * <p/> + * This is useful when re-reading configuration information. */ public void detachAndStopAllAppenders() { if (aai != null) { @@ -254,7 +262,7 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, * Invoke all the appenders of this logger. * * @param event - * The event to log + * The event to log */ public void callAppenders(ILoggingEvent event) { int writes = 0; @@ -291,7 +299,7 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, static int getSeparatorIndexOf(String name) { return getSeparatorIndexOf(name, 0); } - + /** * Get the position of the separator character, if any, starting at position * 'fromIndex'. @@ -300,35 +308,35 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, * @param fromIndex * @return */ - static int getSeparatorIndexOf(String name, int fromIndex) { + static int getSeparatorIndexOf(String name, int fromIndex) { int i = name.indexOf(CoreConstants.DOT, fromIndex); - if(i != -1) { + if (i != -1) { return i; } else { return name.indexOf(CoreConstants.DOLLAR, fromIndex); } } - + /** * Create a child of this logger by suffix, that is, the part of the name * extending this logger. For example, if this logger is named "x.y" and the * lastPart is "z", then the created child logger will be named "x.y.z". * - * <p> IMPORTANT: Calls to this method must be within a synchronized block on - * this logger. + * <p> + * IMPORTANT: Calls to this method must be within a synchronized block on this + * logger. * * @param lastPart - * the suffix (i.e. last part) of the child logger name. This - * parameter may not include dots, i.e. the logger separator - * character. + * the suffix (i.e. last part) of the child logger name. This + * parameter may not include dots, i.e. the logger separator + * character. * @return */ Logger createChildByLastNamePart(final String lastPart) { int i_index = getSeparatorIndexOf(lastPart); if (i_index != -1) { throw new IllegalArgumentException("Child name [" + lastPart - + " passed as parameter, may not include [" - + CoreConstants.DOT + "]"); + + " passed as parameter, may not include [" + CoreConstants.DOT + "]"); } if (childrenList == null) { @@ -338,8 +346,7 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, if (this.isRootLogger()) { childLogger = new Logger(lastPart, this, this.loggerContext); } else { - childLogger = new Logger( - name + CoreConstants.DOT + lastPart, this, + childLogger = new Logger(name + CoreConstants.DOT + lastPart, this, this.loggerContext); } childrenList.add(childLogger); @@ -349,13 +356,13 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, private void localLevelReset() { effectiveLevelInt = Level.DEBUG_INT; - if(isRootLogger()) { + if (isRootLogger()) { level = Level.DEBUG; } else { level = null; } } - + void recursiveReset() { detachAndStopAllAppenders(); localLevelReset(); @@ -375,8 +382,7 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, static private final int DEFAULT_CHILD_ARRAY_SIZE = 5; Logger createChildByName(final String childName) { - int i_index = getSeparatorIndexOf(childName, this.name - .length() + 1); + int i_index = getSeparatorIndexOf(childName, this.name.length() + 1); if (i_index != -1) { throw new IllegalArgumentException("For logger [" + this.name + "] child name [" + childName @@ -404,65 +410,95 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, final Marker marker, final Level level, final String msg, final Object[] params, final Throwable t) { - final FilterReply decision = loggerContext - .getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg, - params, t); - - if (decision == FilterReply.NEUTRAL) { + LoggingEvent event = null; + if (loggerContext.turboFilterList.size() == 0) { + if (effectiveLevelInt > level.levelInt) { return; } - } else if (decision == FilterReply.DENY) { - return; + event = buildLoggingEvent(localFQCN, marker, level, msg, params, t); + } else { + event = buildLoggingEvent(localFQCN, marker, level, msg, params, t); + final FilterReply decision = loggerContext.turboFilterList + .getTurboFilterChainDecision(event); + if (decision == FilterReply.NEUTRAL) { + if (effectiveLevelInt > level.levelInt) { + return; + } + } else if (decision == FilterReply.DENY) { + return; + } } - - buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t); + buildLoggingEventAndAppend(event); } private final void filterAndLog_1(final String localFQCN, final Marker marker, final Level level, final String msg, final Object param, final Throwable t) { - final FilterReply decision = loggerContext.getTurboFilterChainDecision_1( - marker, this, level, msg, param, t); - - if (decision == FilterReply.NEUTRAL) { + LoggingEvent event = null; + if (loggerContext.turboFilterList.size() == 0) { if (effectiveLevelInt > level.levelInt) { return; } - } else if (decision == FilterReply.DENY) { - return; + event = buildLoggingEvent(localFQCN, marker, level, msg, + new Object[] { param }, t); + } else { + event = buildLoggingEvent(localFQCN, marker, level, msg, + new Object[] { param }, t); + + final FilterReply decision = loggerContext.turboFilterList + .getTurboFilterChainDecision(event); + if (decision == FilterReply.NEUTRAL) { + if (effectiveLevelInt > level.levelInt) { + return; + } + } else if (decision == FilterReply.DENY) { + return; + } } - - buildLoggingEventAndAppend(localFQCN, marker, level, msg, - new Object[] { param }, t); + buildLoggingEventAndAppend(event); } private final void filterAndLog_2(final String localFQCN, final Marker marker, final Level level, final String msg, final Object param1, final Object param2, final Throwable t) { - final FilterReply decision = loggerContext.getTurboFilterChainDecision_2( - marker, this, level, msg, param1, param2, t); - - if (decision == FilterReply.NEUTRAL) { + LoggingEvent event = null; + if (loggerContext.turboFilterList.size() == 0) { if (effectiveLevelInt > level.levelInt) { return; } - } else if (decision == FilterReply.DENY) { - return; + event = buildLoggingEvent(localFQCN, marker, level, msg, new Object[] { + param1, param2 }, t); + } else { + event = buildLoggingEvent(localFQCN, marker, level, msg, new Object[] { + param1, param2 }, t); + + final FilterReply decision = loggerContext.turboFilterList + .getTurboFilterChainDecision(event); + if (decision == FilterReply.NEUTRAL) { + if (effectiveLevelInt > level.levelInt) { + return; + } + } else if (decision == FilterReply.DENY) { + return; + } } - - buildLoggingEventAndAppend(localFQCN, marker, level, msg, new Object[] { - param1, param2 }, t); + buildLoggingEventAndAppend(event); } - private void buildLoggingEventAndAppend(final String localFQCN, + private final LoggingEvent buildLoggingEvent(final String localFQCN, final Marker marker, final Level level, final String msg, final Object[] params, final Throwable t) { LoggingEvent le = new LoggingEvent(localFQCN, this, level, msg, t, params); le.setMarker(marker); - callAppenders(le); + return le; + } + + private void buildLoggingEventAndAppend(LoggingEvent event) { + event.secondaryInit(); + callAppenders(event); } public void trace(String msg) { @@ -792,8 +828,13 @@ public final class Logger implements org.slf4j.Logger, LocationAwareLogger, * @return the reply given by the TurboFilters */ private FilterReply callTurboFilters(Marker marker, Level level) { - return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, - level, null, null, null); + if (loggerContext.turboFilterList.size() == 0) { + return FilterReply.NEUTRAL; + } else { + LoggingEvent event = buildLoggingEvent(null, marker, level, null, + null, null); + return loggerContext.turboFilterList.getTurboFilterChainDecision(event); + } } /** diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java index b81c581..2defa6b 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/LoggerContext.java @@ -21,7 +21,6 @@ import java.util.Hashtable; import java.util.List; import org.slf4j.ILoggerFactory; -import org.slf4j.Marker; import ch.qos.logback.classic.spi.LoggerComparator; import ch.qos.logback.classic.spi.LoggerContextListener; @@ -30,7 +29,6 @@ import ch.qos.logback.classic.spi.TurboFilterList; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.ContextBase; import ch.qos.logback.core.CoreConstants; -import ch.qos.logback.core.spi.FilterReply; import ch.qos.logback.core.spi.LifeCycle; import ch.qos.logback.core.status.StatusListener; import ch.qos.logback.core.status.StatusManager; @@ -60,7 +58,9 @@ public class LoggerContext extends ContextBase implements ILoggerFactory, private Hashtable<String, Logger> loggerCache; private LoggerContextVO loggerContextRemoteView; - private final TurboFilterList turboFilterList = new TurboFilterList(); + + // allow the Logger class access to this list + final TurboFilterList turboFilterList = new TurboFilterList(); private boolean packagingDataEnabled = true; private int maxCallerDataDepth = ClassicConstants.DEFAULT_MAX_CALLEDER_DATA_DEPTH; @@ -250,36 +250,6 @@ public class LoggerContext extends ContextBase implements ILoggerFactory, turboFilterList.clear(); } - final FilterReply getTurboFilterChainDecision_0_3OrMore(final Marker marker, - final Logger logger, final Level level, final String format, - final Object[] params, final Throwable t) { - if (turboFilterList.size() == 0) { - return FilterReply.NEUTRAL; - } - return turboFilterList.getTurboFilterChainDecision(marker, logger, level, - format, params, t); - } - - final FilterReply getTurboFilterChainDecision_1(final Marker marker, - final Logger logger, final Level level, final String format, - final Object param, final Throwable t) { - if (turboFilterList.size() == 0) { - return FilterReply.NEUTRAL; - } - return turboFilterList.getTurboFilterChainDecision(marker, logger, level, - format, new Object[] { param }, t); - } - - final FilterReply getTurboFilterChainDecision_2(final Marker marker, - final Logger logger, final Level level, final String format, - final Object param1, final Object param2, final Throwable t) { - if (turboFilterList.size() == 0) { - return FilterReply.NEUTRAL; - } - return turboFilterList.getTurboFilterChainDecision(marker, logger, level, - format, new Object[] { param1, param2 }, t); - } - // === start listeners ============================================== public void addListener(LoggerContextListener listener) { loggerContextListenerList.add(listener); diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java index 867c9d2..d32d3bf 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java @@ -95,6 +95,7 @@ public class LoggingEvent implements ILoggingEvent { public LoggingEvent(String fqcn, Logger logger, Level level, String message, Throwable throwable, Object[] argArray) { + this.fqnOfLoggerClass = fqcn; this.loggerName = logger.getName(); this.loggerContext = logger.getLoggerContext(); @@ -113,7 +114,9 @@ public class LoggingEvent implements ILoggingEvent { // bug 85 (we previously failed to set this.argumentArray) this.argumentArray = argArray; + } + public void secondaryInit() { timeStamp = System.currentTimeMillis(); // the case is ugly but under the circumstances acceptable @@ -121,7 +124,7 @@ public class LoggingEvent implements ILoggingEvent { .getMDCAdapter(); mdcPropertyMap = logbackMDCAdapter.getPropertyMap(); } - + public void setArgumentArray(Object[] argArray) { if (this.argumentArray != null) { throw new IllegalStateException("argArray has been already set"); diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java b/logback-classic/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java index d104ff4..1cefdab 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java @@ -15,10 +15,6 @@ package ch.qos.logback.classic.spi; import java.util.concurrent.CopyOnWriteArrayList; -import org.slf4j.Marker; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; @@ -36,47 +32,16 @@ final public class TurboFilterList extends CopyOnWriteArrayList<TurboFilter> { * ACCEPT or DENY, then that value is returned. If all of the filters return * NEUTRAL, then NEUTRAL is returned. */ - public final FilterReply getTurboFilterChainDecision(final Marker marker, - final Logger logger, final Level level, final String format, - final Object[] params, final Throwable t) { - - - final int size = size(); -// if (size == 0) { -// return FilterReply.NEUTRAL; -// } - if (size == 1) { - try { - TurboFilter tf = get(0); - return tf.decide(marker, logger, level, format, params, t); - } catch (IndexOutOfBoundsException iobe) { - return FilterReply.NEUTRAL; - } - } - + public final FilterReply getTurboFilterChainDecision(final LoggingEvent event) { Object[] tfa = toArray(); final int len = tfa.length; for (int i = 0; i < len; i++) { - //for (TurboFilter tf : this) { final TurboFilter tf = (TurboFilter) tfa[i]; - final FilterReply r = tf.decide(marker, logger, level, format, params, t); + final FilterReply r = tf.decide(event); if (r == FilterReply.DENY || r == FilterReply.ACCEPT) { return r; } } return FilterReply.NEUTRAL; } - - // public boolean remove(TurboFilter turboFilter) { - // return tfList.remove(turboFilter); - // } - // - // public TurboFilter remove(int index) { - // return tfList.remove(index); - // } - // - // final public int size() { - // return tfList.size(); - // } - } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java index 939a7d3..21ee701 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java @@ -13,10 +13,7 @@ */ package ch.qos.logback.classic.turbo; -import org.slf4j.Marker; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; /** @@ -57,9 +54,8 @@ public class DuplicateMessageFilter extends TurboFilter { } @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { - int count = msgCache.getMessageCountAndThenIncrement(format); + public FilterReply decide(LoggingEvent event) { + int count = msgCache.getMessageCountAndThenIncrement(event.getMessage()); if (count <= allowedRepetitions) { return FilterReply.NEUTRAL; } else { diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java index eb61702..bf4a845 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java @@ -13,40 +13,45 @@ */ package ch.qos.logback.classic.turbo; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.Level; -import ch.qos.logback.core.spi.FilterReply; -import org.slf4j.Marker; +import java.util.HashMap; +import java.util.Map; + import org.slf4j.MDC; +import org.slf4j.Marker; -import java.util.Map; -import java.util.HashMap; +import ch.qos.logback.classic.Level; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.spi.FilterReply; /** * 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. * - * <p> 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'. + * <p> + * 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'. * - * <p> If 'levelAssociatedWithMDCValue' is higher or equal to the level of the + * <p> + * If 'levelAssociatedWithMDCValue' is higher or equal to the level of the * current logger request, the * {@link #decide(Marker, Logger, Level, String, Object[], Throwable) decide()} - * method returns the value of {@link #getOnHigherOrEqual() onHigherOrEqual}, - * if it is lower then the value of {@link #getOnLower() onLower} is returned. - * Both 'onHigherOrEqual' and 'onLower' can be set by the user. By default, + * method returns the value of {@link #getOnHigherOrEqual() onHigherOrEqual}, if + * it is lower then the value of {@link #getOnLower() onLower} 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. * - * <p> The example below illustrates how logging could be enabled for only + * <p> + * 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 @@ -220,21 +225,15 @@ public class DynamicThresholdFilter extends TurboFilter { * * @{link #defaultThreshold} value. * - * If no such value exists, then + * If no such value exists, then * * - * @param marker - * @param logger - * @param level - * @param s - * @param objects - * @param throwable + * @param event * * @return FilterReply - this filter's decision */ @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String s, Object[] objects, Throwable throwable) { + public FilterReply decide(LoggingEvent event) { String mdcValue = MDC.get(this.key); if (!isStarted()) { @@ -248,7 +247,7 @@ public class DynamicThresholdFilter extends TurboFilter { if (levelAssociatedWithMDCValue == null) { levelAssociatedWithMDCValue = defaultThreshold; } - if (level.isGreaterOrEqual(levelAssociatedWithMDCValue)) { + if (event.getLevel().isGreaterOrEqual(levelAssociatedWithMDCValue)) { return onHigherOrEqual; } else { return onLower; diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java index 111db11..aafe4b3 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java @@ -14,10 +14,8 @@ package ch.qos.logback.classic.turbo; import org.slf4j.MDC; -import org.slf4j.Marker; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; /** @@ -49,7 +47,7 @@ public class MDCFilter extends MatchingFilter { String value; @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { if (MDCKey == null) { return FilterReply.NEUTRAL; } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java index 8e133cb..747ab10 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java @@ -16,8 +16,7 @@ package ch.qos.logback.classic.turbo; import org.slf4j.Marker; import org.slf4j.MarkerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; /** @@ -38,11 +37,12 @@ public class MarkerFilter extends MatchingFilter { } @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { if(!isStarted()) { return FilterReply.NEUTRAL; } + Marker marker = event.getMarker(); if(marker == null) { return onMismatch; } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java index cd04f93..82ea352 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java @@ -17,12 +17,9 @@ import java.io.File; import java.net.URL; import java.net.URLDecoder; -import org.slf4j.Marker; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.spi.FilterReply; @@ -94,8 +91,7 @@ public class ReconfigureOnChangeFilter extends TurboFilter { private int invocationCounter = 0; @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { if (!isStarted()) { return FilterReply.NEUTRAL; } diff --git a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java index 4e6757c..2d6258c 100644 --- a/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java +++ b/logback-classic/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java @@ -13,10 +13,7 @@ */ package ch.qos.logback.classic.turbo; -import org.slf4j.Marker; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.ContextAwareBase; import ch.qos.logback.core.spi.FilterReply; import ch.qos.logback.core.spi.LifeCycle; @@ -50,8 +47,7 @@ public abstract class TurboFilter extends ContextAwareBase implements LifeCycle * @param t * @return */ - public abstract FilterReply decide(Marker marker, Logger logger, - Level level, String format, Object[] params, Throwable t); + public abstract FilterReply decide(LoggingEvent event); public void start() { this.start = true; diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java index c6723de..82d0b4e 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/LoggerPerfTest.java @@ -32,8 +32,8 @@ public class LoggerPerfTest { static long NORMAL_RUN_LENGTH = 1 * 1000 * 1000; static long SHORTENED_RUN_LENGTH = 500 * 1000; - LoggerContext lc = new LoggerContext(); - Logger lbLogger = lc.getLogger(this.getClass()); + LoggerContext context = new LoggerContext(); + Logger lbLogger = context.getLogger(this.getClass()); org.slf4j.Logger logger = lbLogger; @Before @@ -46,15 +46,15 @@ public class LoggerPerfTest { double avg = computeDurationOfDisabledLogsWith_1_NOPFilter(1, NORMAL_RUN_LENGTH); System.out.println("durationOfDisabledLogsWith_1_NOPFilter=" + avg); - long referencePerf = 60; - + + long referencePerf = 60+150; // 150 for LoggingEvent creation and gc BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS); } double computeDurationOfDisabledLogsWith_1_NOPFilter(int numOfFilters, long len) { for (int i = 0; i < numOfFilters; i++) { - lc.addTurboFilter(new NOPTurboFilter()); + context.addTurboFilter(new NOPTurboFilter()); } lbLogger.setLevel(Level.OFF); for (long i = 0; i < len; i++) diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java index 1bb51d6..a3e40cc 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java @@ -23,6 +23,7 @@ import org.junit.Test; import org.slf4j.Marker; import org.slf4j.MarkerFactory; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.turbo.MarkerFilter; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; @@ -168,16 +169,14 @@ public class TurboFilteringInLoggerTest { class YesFilter extends TurboFilter { @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { return FilterReply.ACCEPT; } } class NoFilter extends TurboFilter { @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { return FilterReply.DENY; } } \ No newline at end of file diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java index e9d6a07..ed0fe07 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/boolex/JaninoEventEvaluatorTest.java @@ -62,6 +62,7 @@ public class JaninoEventEvaluatorTest { LoggingEvent e = new LoggingEvent( ch.qos.logback.core.pattern.FormattingConverter.class.getName(), logger, Level.INFO, "Some message", ex, null); + e.secondaryInit(); return e; } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java index 5611786..2a46f8d 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java @@ -48,9 +48,11 @@ public class ConverterTest { // forces the returned caller information to match the caller stack for this // this particular test. LoggingEvent makeLoggingEvent(Exception ex) { - return new LoggingEvent( + LoggingEvent le = new LoggingEvent( ch.qos.logback.core.pattern.FormattingConverter.class.getName(), logger, Level.INFO, "Some message", ex, null); + le.secondaryInit(); + return le; } Exception getException(String msg, Exception cause) { @@ -74,7 +76,7 @@ public class ConverterTest { StringBuffer buf = new StringBuffer(); converter.write(buf, le); // the number below should be the line number of the previous line - assertEquals("75", buf.toString()); + assertEquals("77", buf.toString()); } } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java index 4dcf089..816fa69 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/pattern/MDCConverterTest.java @@ -70,9 +70,10 @@ public class MDCConverterTest { } private ILoggingEvent createLoggingEvent() { - ILoggingEvent le = new LoggingEvent(this.getClass().getName(), lc + LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc .getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", null, null); + le.secondaryInit(); return le; } } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java index 1caccf8..66977bb 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java @@ -186,6 +186,7 @@ public class LoggingEventSerializationTest { private LoggingEvent createLoggingEvent() { LoggingEvent le = new LoggingEvent(this.getClass().getName(), logger, Level.DEBUG, "test message", null, null); + le.secondaryInit(); return le; } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java index f79cdf0..740a8f8 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java @@ -17,11 +17,10 @@ import java.util.ArrayList; import java.util.List; import org.slf4j.MDC; -import org.slf4j.Marker; import ch.qos.logback.classic.ClassicConstants; import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; /** @@ -40,8 +39,8 @@ public class DebugUsersTurboFilter extends TurboFilter { List<String> userList = new ArrayList<String>(); @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { - if (!level.equals(Level.DEBUG)) { + public FilterReply decide(LoggingEvent event) { + if (!event.getLevel().equals(Level.DEBUG)) { return FilterReply.NEUTRAL; } String user = MDC.get(ClassicConstants.USER_MDC_KEY); diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest.java index 5daddf3..627d7bf 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/DuplicateMessageFilterTest.java @@ -13,27 +13,31 @@ */ package ch.qos.logback.classic.turbo; -import static org.junit.Assert.*; +import static org.junit.Assert.assertEquals; import org.junit.Test; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; public class DuplicateMessageFilterTest { + LoggerContext context = new LoggerContext(); + Logger logger = context.getLogger(this.getClass()); + @Test public void smoke() { DuplicateMessageFilter dmf = new DuplicateMessageFilter(); dmf.setAllowedRepetitions(0); dmf.start(); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "x", null, - null)); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "y", null, - null)); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("x"))); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("y"))); assertEquals(FilterReply.DENY, dmf - .decide(null, null, null, "x", null, null)); + .decide(newEvent("x"))); assertEquals(FilterReply.DENY, dmf - .decide(null, null, null, "y", null, null)); + .decide(newEvent("y"))); } @Test @@ -42,12 +46,9 @@ public class DuplicateMessageFilterTest { dmf.setAllowedRepetitions(1); dmf.setCacheSize(1); dmf.start(); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a", null, - null)); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "b", null, - null)); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a", null, - null)); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("a"))); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("b"))); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("a"))); } @Test @@ -59,16 +60,13 @@ public class DuplicateMessageFilterTest { dmf.setCacheSize(cacheSize); dmf.start(); for (int i = 0; i < cacheSize + margin; i++) { - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a" + i, - null, null)); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("a" + i))); } for (int i = cacheSize - 1; i >= margin; i--) { - assertEquals(FilterReply.DENY, dmf.decide(null, null, null, "a" + i, - null, null)); + assertEquals(FilterReply.DENY, dmf.decide(newEvent("a" + i))); } for (int i = margin - 1; i >= 0; i--) { - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, "a" + i, - null, null)); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent("a" + i))); } } @@ -80,10 +78,12 @@ public class DuplicateMessageFilterTest { dmf.setAllowedRepetitions(0); dmf.setCacheSize(10); dmf.start(); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, null, null, - null)); - assertEquals(FilterReply.NEUTRAL, dmf.decide(null, null, null, null, null, - null)); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent(null))); + assertEquals(FilterReply.NEUTRAL, dmf.decide(newEvent(null))); + } + + LoggingEvent newEvent(String m) { + return new LoggingEvent(null, logger, null, m, null, null); } } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java index 33805dc..1846d0b 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java @@ -21,6 +21,9 @@ import org.junit.Test; import org.slf4j.Marker; import org.slf4j.MarkerFactory; +import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; public class MarkerFilterTest { @@ -28,15 +31,16 @@ public class MarkerFilterTest { static String MARKER_NAME = "toto"; Marker totoMarker = MarkerFactory.getMarker(MARKER_NAME); - + LoggerContext context = new LoggerContext(); + Logger logger = context.getLogger(this.getClass()); @Test public void testNoMarker() { MarkerFilter mkt = new MarkerFilter(); mkt.start(); assertFalse(mkt.isStarted()); - assertEquals(FilterReply.NEUTRAL, mkt.decide(totoMarker, null, null, null, null, null)); - assertEquals(FilterReply.NEUTRAL, mkt.decide(null, null, null, null, null, null)); + assertEquals(FilterReply.NEUTRAL, mkt.decide(newEvent(totoMarker))); + assertEquals(FilterReply.NEUTRAL, mkt.decide(newEvent(null))); } @@ -50,8 +54,15 @@ public class MarkerFilterTest { mkt.start(); assertTrue(mkt.isStarted()); - assertEquals(FilterReply.DENY, mkt.decide(null, null, null, null, null, null)); - assertEquals(FilterReply.ACCEPT, mkt.decide(totoMarker, null, null, null, null, null)); + assertEquals(FilterReply.DENY, mkt.decide(newEvent(null))); + assertEquals(FilterReply.ACCEPT, mkt.decide(newEvent(totoMarker))); + } + + LoggingEvent newEvent(Marker marker) { + LoggingEvent event = new LoggingEvent(null, logger, null, null, null, null); + event.setMarker(marker); + return event; } + } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java index 94528b7..9cf43f4 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java @@ -13,18 +13,13 @@ */ package ch.qos.logback.classic.turbo; -import org.slf4j.Marker; - -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.spi.FilterReply; public class NOPTurboFilter extends TurboFilter { @Override - public FilterReply decide(final Marker marker, final Logger logger, final Level level, final String format, - final Object[] params, final Throwable t) { - + public FilterReply decide(LoggingEvent event) { return FilterReply.NEUTRAL; } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.java index ac2d714..4b462e7 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeTest.java @@ -24,6 +24,7 @@ import java.net.URL; import org.junit.After; import org.junit.Before; import org.junit.Test; +import org.slf4j.Marker; import org.slf4j.helpers.BogoPerf; import ch.qos.logback.classic.ClassicTestConstants; @@ -32,6 +33,7 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable; import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.contention.MultiThreadedHarness; import ch.qos.logback.core.contention.RunnableWithCounterAndDone; @@ -66,6 +68,12 @@ public class ReconfigureOnChangeTest { Logger logger = loggerContext.getLogger(this.getClass()); MultiThreadedHarness harness; + + LoggingEvent newEvent(Marker marker) { + LoggingEvent event = new LoggingEvent(null, logger, null, null, null, null); + event.setMarker(marker); + return event; + } @Before public void setUp() { System.out.println("======== TEST START"); @@ -192,10 +200,17 @@ public class ReconfigureOnChangeTest { BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS); } + LoggingEvent newEvent(Level level, String msg) { + LoggingEvent event = new LoggingEvent(null, logger, level, msg, null, null); + return event; + } + public double directLoop(ReconfigureOnChangeFilter rocf) { + LoggingEvent event = newEvent(Level.DEBUG, " "); + long start = System.nanoTime(); for (int i = 0; i < LOOP_LEN; i++) { - rocf.decide(null, logger, Level.DEBUG, " ", null, null); + rocf.decide(event); } long end = System.nanoTime(); return (end - start) / (1.0d * LOOP_LEN); @@ -219,7 +234,7 @@ public class ReconfigureOnChangeTest { double avg = indirectLoop(); System.out.println(avg); // the reference was computed on Orion (Ceki's computer) - long referencePerf = 68; + long referencePerf = 68+150; // extra 150 for LoggingEvent creation and gc BogoPerf.assertDuration(avg, referencePerf, CoreConstants.REFERENCE_BIPS); } diff --git a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigurePerf.java b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigurePerf.java index 16a36c0..2fdba85 100644 --- a/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigurePerf.java +++ b/logback-classic/src/test/java/ch/qos/logback/classic/turbo/ReconfigurePerf.java @@ -26,6 +26,7 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.issue.lbclassic135.LoggingRunnable; import ch.qos.logback.classic.joran.JoranConfigurator; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.CoreConstants; import ch.qos.logback.core.contention.MultiThreadedHarness; import ch.qos.logback.core.contention.RunnableWithCounterAndDone; @@ -109,11 +110,15 @@ public class ReconfigurePerf { return rocf; } - + LoggingEvent newEvent(Level level, String msg) { + LoggingEvent event = new LoggingEvent(null, logger, level, msg, null, null); + return event; + } + public double directLoop(ReconfigureOnChangeFilter rocf) { long start = System.nanoTime(); for (int i = 0; i < LOOP_LEN; i++) { - rocf.decide(null, logger, Level.DEBUG, " ", null, null); + rocf.decide(newEvent(Level.DEBUG, " ")); } long end = System.nanoTime(); return (end - start) / (1.0d * LOOP_LEN); diff --git a/logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java b/logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java index c75ce45..dfc4297 100644 --- a/logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java +++ b/logback-examples/src/main/java/chapters/filters/SampleTurboFilter.java @@ -16,8 +16,7 @@ package chapters.filters; import org.slf4j.Marker; import org.slf4j.MarkerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; +import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; @@ -27,8 +26,7 @@ public class SampleTurboFilter extends TurboFilter { Marker markerToAccept; @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(LoggingEvent event) { if (!isStarted()) { return FilterReply.NEUTRAL; ----------------------------------------------------------------------- hooks/post-receive -- Logback: the generic, reliable, fast and flexible logging framework.