diff --git a/README.md b/README.md index e2889bb1e5..3e53db2265 100644 --- a/README.md +++ b/README.md @@ -22,8 +22,8 @@ Quick Start ```groovy dependencies { - implementation 'org.slf4j:slf4j-api:' // slf4j 2.x not yet supported - implementation 'com.github.tony19:logback-android:2.0.2-SNAPSHOT' + implementation 'org.slf4j:slf4j-api:2.0.3' + implementation 'com.github.tony19:logback-android:2.0.1' } ``` @@ -31,8 +31,8 @@ Quick Start ```groovy dependencies { - implementation 'org.slf4j:slf4j-api:' // slf4j 2.x not yet supported - implementation 'com.github.tony19:logback-android:2.0.2-SNAPSHOT' + implementation 'org.slf4j:slf4j-api:2.0.3' + implementation 'com.github.tony19:logback-android:2.0.1' testImplementation 'ch.qos.logback:logback-classic:1.2.11' } @@ -41,8 +41,6 @@ Quick Start } ``` - **NOTE:** SLF4J 2.x is not [yet](https://github.com/tony19/logback-android/pull/247) supported. - 3. Create `app/src/main/assets/logback.xml` containing: ```xml @@ -95,8 +93,8 @@ _Gradle_ **release** ```groovy dependencies { - implementation 'org.slf4j:slf4j-api:' // slf4j 2.x not yet supported - implementation 'com.github.tony19:logback-android:2.0.2-SNAPSHOT' + implementation 'org.slf4j:slf4j-api:2.0.3' + implementation 'com.github.tony19:logback-android:2.0.1' } ``` @@ -108,7 +106,7 @@ repositories { } dependencies { - implementation 'org.slf4j:slf4j-api:' // slf4j 2.x not yet supported + implementation 'org.slf4j:slf4j-api:2.0.3' implementation 'com.github.tony19:logback-android:2.0.2-SNAPSHOT' } ``` @@ -121,5 +119,5 @@ Use these commands to create the AAR: cd logback-android scripts/makejar.sh -The file is output to: `./build/logback-android-2.0.0-debug.aar` +The file is output to: `./build/logback-android-2.0.1-debug.aar` diff --git a/gradle.properties b/gradle.properties index e152ec776b..57120a30b2 100644 --- a/gradle.properties +++ b/gradle.properties @@ -11,6 +11,8 @@ version=2.0.2-SNAPSHOT VERSION_NAME=2.0.2-SNAPSHOT VERSION_CODE=3020000 +slf4jVersion=2.0.3 + # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. # Ensure important default jvmargs aren't overwritten. See https://github.com/gradle/gradle/issues/19750 diff --git a/logback-android/build.gradle b/logback-android/build.gradle index a6eebc3df7..a8402cc5a9 100644 --- a/logback-android/build.gradle +++ b/logback-android/build.gradle @@ -62,7 +62,7 @@ dependencies { testImplementation 'com.icegreen:greenmail:1.6.11' testImplementation 'dom4j:dom4j:1.6.1' testImplementation 'org.easytesting:fest-assert:1.4' - testImplementation "org.slf4j:integration:${slf4jVersion}" + testImplementation "org.slf4j:integration:2.0.0-alpha1" // don't seem to have any stable 2.x releases yet: https://mvnrepository.com/artifact/org.slf4j/integration testImplementation "org.slf4j:log4j-over-slf4j:${slf4jVersion}" testImplementation "org.slf4j:slf4j-api:${slf4jVersion}:tests" testImplementation "org.slf4j:slf4j-ext:${slf4jVersion}" diff --git a/logback-android/src/main/java/ch/qos/logback/classic/Logger.java b/logback-android/src/main/java/ch/qos/logback/classic/Logger.java index 0d1ab5d0fe..95cd38dea4 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/Logger.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/Logger.java @@ -30,6 +30,7 @@ import java.io.ObjectStreamException; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.Iterator; import java.util.List; @@ -374,11 +375,11 @@ Logger createChildByName(final String childName) { */ private void filterAndLog_0_Or3Plus(final String localFQCN, - final Marker marker, final Level level, final String msg, + final List markers, final Level level, final String msg, final Object[] params, final Throwable t) { final FilterReply decision = loggerContext - .getTurboFilterChainDecision_0_3OrMore(marker, this, level, msg, + .getTurboFilterChainDecision_0_3OrMore(markers, this, level, msg, params, t); if (decision == FilterReply.NEUTRAL) { @@ -389,15 +390,15 @@ private void filterAndLog_0_Or3Plus(final String localFQCN, return; } - buildLoggingEventAndAppend(localFQCN, marker, level, msg, params, t); + buildLoggingEventAndAppend(localFQCN, markers, level, msg, params, t); } private void filterAndLog_1(final String localFQCN, - final Marker marker, final Level level, final String msg, + final List markers, final Level level, final String msg, final Object param, final Throwable t) { final FilterReply decision = loggerContext.getTurboFilterChainDecision_1( - marker, this, level, msg, param, t); + markers, this, level, msg, param, t); if (decision == FilterReply.NEUTRAL) { if (effectiveLevelInt > level.levelInt) { @@ -407,16 +408,16 @@ private void filterAndLog_1(final String localFQCN, return; } - buildLoggingEventAndAppend(localFQCN, marker, level, msg, + buildLoggingEventAndAppend(localFQCN, markers, level, msg, new Object[] { param }, t); } private void filterAndLog_2(final String localFQCN, - final Marker marker, final Level level, final String msg, + final List markers, 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); + markers, this, level, msg, param1, param2, t); if (decision == FilterReply.NEUTRAL) { if (effectiveLevelInt > level.levelInt) { @@ -426,15 +427,15 @@ private void filterAndLog_2(final String localFQCN, return; } - buildLoggingEventAndAppend(localFQCN, marker, level, msg, new Object[] { + buildLoggingEventAndAppend(localFQCN, markers, level, msg, new Object[] { param1, param2 }, t); } private void buildLoggingEventAndAppend(final String localFQCN, - final Marker marker, final Level level, final String msg, + final List markers, 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); + le.setMarkers(markers); callAppenders(le); } @@ -458,32 +459,62 @@ public void trace(String msg, Throwable t) { filterAndLog_0_Or3Plus(FQCN, null, Level.TRACE, msg, null, t); } + @Override + public boolean isTraceEnabled(Marker marker) { + return isTraceEnabled(Collections.singletonList(marker)); + } + + @Override public void trace(Marker marker, String msg) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, null); + trace(Collections.singletonList(marker), msg); } + @Override public void trace(Marker marker, String format, Object arg) { - filterAndLog_1(FQCN, marker, Level.TRACE, format, arg, null); + trace(Collections.singletonList(marker), format, arg); } + @Override public void trace(Marker marker, String format, Object arg1, Object arg2) { - filterAndLog_2(FQCN, marker, Level.TRACE, format, arg1, arg2, null); + trace(Collections.singletonList(marker), format, arg1, arg2); } + @Override public void trace(Marker marker, String format, Object... argArray) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, format, argArray, null); + trace(Collections.singletonList(marker), format, argArray); } + @Override public void trace(Marker marker, String msg, Throwable t) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.TRACE, msg, null, t); + trace(Collections.singletonList(marker), msg, t); + } + + public void trace(List markers, String msg) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.TRACE, msg, null, null); + } + + public void trace(List markers, String format, Object arg) { + filterAndLog_1(FQCN, markers, Level.TRACE, format, arg, null); + } + + public void trace(List markers, String format, Object arg1, Object arg2) { + filterAndLog_2(FQCN, markers, Level.TRACE, format, arg1, arg2, null); + } + + public void trace(List markers, String format, Object... argArray) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.TRACE, format, argArray, null); + } + + public void trace(List markers, String msg, Throwable t) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.TRACE, msg, null, t); } public boolean isDebugEnabled() { - return isDebugEnabled(null); + return isDebugEnabled(Collections.emptyList()); } - public boolean isDebugEnabled(Marker marker) { - final FilterReply decision = callTurboFilters(marker, Level.DEBUG); + public boolean isDebugEnabled(List markers) { + final FilterReply decision = callTurboFilters(markers, Level.DEBUG); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= Level.DEBUG_INT; } else if (decision == FilterReply.DENY) { @@ -515,24 +546,54 @@ public void debug(String msg, Throwable t) { filterAndLog_0_Or3Plus(FQCN, null, Level.DEBUG, msg, null, t); } + @Override + public boolean isDebugEnabled(Marker marker) { + return isDebugEnabled(Collections.singletonList(marker)); + } + + @Override public void debug(Marker marker, String msg) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, msg, null, null); + debug(Collections.singletonList(marker), msg); } + @Override public void debug(Marker marker, String format, Object arg) { - filterAndLog_1(FQCN, marker, Level.DEBUG, format, arg, null); + debug(Collections.singletonList(marker), format, arg); } + @Override public void debug(Marker marker, String format, Object arg1, Object arg2) { - filterAndLog_2(FQCN, marker, Level.DEBUG, format, arg1, arg2, null); + debug(Collections.singletonList(marker), format, arg1, arg2); } + @Override public void debug(Marker marker, String format, Object... argArray) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, format, argArray, null); + debug(Collections.singletonList(marker), format, argArray); } + @Override public void debug(Marker marker, String msg, Throwable t) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.DEBUG, msg, null, t); + debug(Collections.singletonList(marker), msg, t); + } + + public void debug(List markers, String msg) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.DEBUG, msg, null, null); + } + + public void debug(List markers, String format, Object arg) { + filterAndLog_1(FQCN, markers, Level.DEBUG, format, arg, null); + } + + public void debug(List markers, String format, Object arg1, Object arg2) { + filterAndLog_2(FQCN, markers, Level.DEBUG, format, arg1, arg2, null); + } + + public void debug(List markers, String format, Object... argArray) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.DEBUG, format, argArray, null); + } + + public void debug(List markers, String msg, Throwable t) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.DEBUG, msg, null, t); } public void error(String msg) { @@ -555,32 +616,62 @@ public void error(String msg, Throwable t) { filterAndLog_0_Or3Plus(FQCN, null, Level.ERROR, msg, null, t); } + @Override + public boolean isErrorEnabled(Marker marker) { + return isErrorEnabled(Collections.singletonList(marker)); + } + + @Override public void error(Marker marker, String msg) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, msg, null, null); + error(Collections.singletonList(marker), msg); } + @Override public void error(Marker marker, String format, Object arg) { - filterAndLog_1(FQCN, marker, Level.ERROR, format, arg, null); + error(Collections.singletonList(marker), format, arg); } + @Override public void error(Marker marker, String format, Object arg1, Object arg2) { - filterAndLog_2(FQCN, marker, Level.ERROR, format, arg1, arg2, null); + error(Collections.singletonList(marker), format, arg1, arg2); } - public void error(Marker marker, String format, Object... argArray) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, format, argArray, null); + @Override + public void error(Marker marker, String format, Object... arguments) { + error(Collections.singletonList(marker), format, arguments); } + @Override public void error(Marker marker, String msg, Throwable t) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.ERROR, msg, null, t); + error(Collections.singletonList(marker), msg, t); + } + + public void error(List markers, String msg) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.ERROR, msg, null, null); + } + + public void error(List markers, String format, Object arg) { + filterAndLog_1(FQCN, markers, Level.ERROR, format, arg, null); + } + + public void error(List markers, String format, Object arg1, Object arg2) { + filterAndLog_2(FQCN, markers, Level.ERROR, format, arg1, arg2, null); + } + + public void error(List markers, String format, Object... argArray) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.ERROR, format, argArray, null); + } + + public void error(List markers, String msg, Throwable t) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.ERROR, msg, null, t); } public boolean isInfoEnabled() { - return isInfoEnabled(null); + return isInfoEnabled(Collections.emptyList()); } - public boolean isInfoEnabled(Marker marker) { - FilterReply decision = callTurboFilters(marker, Level.INFO); + public boolean isInfoEnabled(List markers) { + FilterReply decision = callTurboFilters(markers, Level.INFO); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= Level.INFO_INT; } else if (decision == FilterReply.DENY) { @@ -612,32 +703,62 @@ public void info(String msg, Throwable t) { filterAndLog_0_Or3Plus(FQCN, null, Level.INFO, msg, null, t); } + @Override + public boolean isInfoEnabled(Marker marker) { + return isInfoEnabled(Collections.singletonList(marker)); + } + + @Override public void info(Marker marker, String msg) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, msg, null, null); + info(Collections.singletonList(marker), msg); } + @Override public void info(Marker marker, String format, Object arg) { - filterAndLog_1(FQCN, marker, Level.INFO, format, arg, null); + info(Collections.singletonList(marker), format, arg); } + @Override public void info(Marker marker, String format, Object arg1, Object arg2) { - filterAndLog_2(FQCN, marker, Level.INFO, format, arg1, arg2, null); + info(Collections.singletonList(marker), format, arg1, arg2); } - public void info(Marker marker, String format, Object... argArray) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, format, argArray, null); + @Override + public void info(Marker marker, String format, Object... arguments) { + info(Collections.singletonList(marker), format, arguments); } + @Override public void info(Marker marker, String msg, Throwable t) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.INFO, msg, null, t); + info(Collections.singletonList(marker), msg, t); + } + + public void info(List markers, String msg) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.INFO, msg, null, null); + } + + public void info(List markers, String format, Object arg) { + filterAndLog_1(FQCN, markers, Level.INFO, format, arg, null); + } + + public void info(List markers, String format, Object arg1, Object arg2) { + filterAndLog_2(FQCN, markers, Level.INFO, format, arg1, arg2, null); + } + + public void info(List markers, String format, Object... argArray) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.INFO, format, argArray, null); + } + + public void info(List markers, String msg, Throwable t) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.INFO, msg, null, t); } public boolean isTraceEnabled() { - return isTraceEnabled(null); + return isTraceEnabled(Collections.emptyList()); } - public boolean isTraceEnabled(Marker marker) { - final FilterReply decision = callTurboFilters(marker, Level.TRACE); + public boolean isTraceEnabled(List markers) { + final FilterReply decision = callTurboFilters(markers, Level.TRACE); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= Level.TRACE_INT; } else if (decision == FilterReply.DENY) { @@ -650,11 +771,11 @@ public boolean isTraceEnabled(Marker marker) { } public boolean isErrorEnabled() { - return isErrorEnabled(null); + return isErrorEnabled(Collections.emptyList()); } - public boolean isErrorEnabled(Marker marker) { - FilterReply decision = callTurboFilters(marker, Level.ERROR); + public boolean isErrorEnabled(List markers) { + FilterReply decision = callTurboFilters(markers, Level.ERROR); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= Level.ERROR_INT; } else if (decision == FilterReply.DENY) { @@ -667,11 +788,11 @@ public boolean isErrorEnabled(Marker marker) { } public boolean isWarnEnabled() { - return isWarnEnabled(null); + return isWarnEnabled(Collections.emptyList()); } - public boolean isWarnEnabled(Marker marker) { - FilterReply decision = callTurboFilters(marker, Level.WARN); + public boolean isWarnEnabled(List markers) { + FilterReply decision = callTurboFilters(markers, Level.WARN); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= Level.WARN_INT; } else if (decision == FilterReply.DENY) { @@ -684,8 +805,8 @@ public boolean isWarnEnabled(Marker marker) { } - public boolean isEnabledFor(Marker marker, Level level) { - FilterReply decision = callTurboFilters(marker, level); + public boolean isEnabledFor(List markers, Level level) { + FilterReply decision = callTurboFilters(markers, level); if (decision == FilterReply.NEUTRAL) { return effectiveLevelInt <= level.levelInt; } else if (decision == FilterReply.DENY) { @@ -709,6 +830,36 @@ public void warn(String msg, Throwable t) { filterAndLog_0_Or3Plus(FQCN, null, Level.WARN, msg, null, t); } + @Override + public boolean isWarnEnabled(Marker marker) { + return isWarnEnabled(Collections.singletonList(marker)); + } + + @Override + public void warn(Marker marker, String msg) { + warn(Collections.singletonList(marker), msg); + } + + @Override + public void warn(Marker marker, String format, Object arg) { + warn(Collections.singletonList(marker), format, arg); + } + + @Override + public void warn(Marker marker, String format, Object arg1, Object arg2) { + warn(Collections.singletonList(marker), format, arg1, arg2); + } + + @Override + public void warn(Marker marker, String format, Object... arguments) { + warn(Collections.singletonList(marker), format, arguments); + } + + @Override + public void warn(Marker marker, String msg, Throwable t) { + warn(Collections.singletonList(marker), msg, t); + } + public void warn(String format, Object arg) { filterAndLog_1(FQCN, null, Level.WARN, format, arg, null); } @@ -721,24 +872,24 @@ public void warn(String format, Object... argArray) { filterAndLog_0_Or3Plus(FQCN, null, Level.WARN, format, argArray, null); } - public void warn(Marker marker, String msg) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, msg, null, null); + public void warn(List markers, String msg) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.WARN, msg, null, null); } - public void warn(Marker marker, String format, Object arg) { - filterAndLog_1(FQCN, marker, Level.WARN, format, arg, null); + public void warn(List markers, String format, Object arg) { + filterAndLog_1(FQCN, markers, Level.WARN, format, arg, null); } - public void warn(Marker marker, String format, Object... argArray) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, format, argArray, null); + public void warn(List markers, String format, Object... argArray) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.WARN, format, argArray, null); } - public void warn(Marker marker, String format, Object arg1, Object arg2) { - filterAndLog_2(FQCN, marker, Level.WARN, format, arg1, arg2, null); + public void warn(List markers, String format, Object arg1, Object arg2) { + filterAndLog_2(FQCN, markers, Level.WARN, format, arg1, arg2, null); } - public void warn(Marker marker, String msg, Throwable t) { - filterAndLog_0_Or3Plus(FQCN, marker, Level.WARN, msg, null, t); + public void warn(List markers, String msg, Throwable t) { + filterAndLog_0_Or3Plus(FQCN, markers, Level.WARN, msg, null, t); } public boolean isAdditive() { @@ -764,8 +915,8 @@ public String toString() { * @param level * @return the reply given by the TurboFilters */ - private FilterReply callTurboFilters(Marker marker, Level level) { - return loggerContext.getTurboFilterChainDecision_0_3OrMore(marker, this, + private FilterReply callTurboFilters(List markers, Level level) { + return loggerContext.getTurboFilterChainDecision_0_3OrMore(markers, this, level, null, null, null); } @@ -778,10 +929,10 @@ public LoggerContext getLoggerContext() { return loggerContext; } - public void log(Marker marker, String fqcn, int levelInt, String message, + public void log(List markers, String fqcn, int levelInt, String message, Object[] argArray, Throwable t) { Level level = Level.fromLocationAwareLoggerInteger(levelInt); - filterAndLog_0_Or3Plus(fqcn, marker, level, message, argArray, t); + filterAndLog_0_Or3Plus(fqcn, markers, level, message, argArray, t); } /** @@ -791,7 +942,7 @@ public void log(Marker marker, String fqcn, int levelInt, String message, */ public void log(org.slf4j.event.LoggingEvent slf4jEvent) { Level level = Level.fromLocationAwareLoggerInteger(slf4jEvent.getLevel().toInt()); - filterAndLog_0_Or3Plus(FQCN, slf4jEvent.getMarker(), level, slf4jEvent.getMessage(), slf4jEvent.getArgumentArray(), slf4jEvent.getThrowable()); + filterAndLog_0_Or3Plus(FQCN, slf4jEvent.getMarkers(), level, slf4jEvent.getMessage(), slf4jEvent.getArgumentArray(), slf4jEvent.getThrowable()); } /** @@ -805,4 +956,12 @@ public void log(org.slf4j.event.LoggingEvent slf4jEvent) { protected Object readResolve() throws ObjectStreamException { return LoggerFactory.getLogger(getName()); } + + @Override + public void log(Marker marker, String fqcn, int levelInt, String message, Object[] argArray, Throwable t) { + Level level = Level.fromLocationAwareLoggerInteger(levelInt); + List markerlist = new ArrayList(); + markerlist.add(marker); + filterAndLog_0_Or3Plus(fqcn, markerlist, level, message, argArray, t); + } } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/LoggerContext.java b/logback-android/src/main/java/ch/qos/logback/classic/LoggerContext.java index c9b04fb762..7876f48905 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/LoggerContext.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/LoggerContext.java @@ -266,33 +266,33 @@ public void resetTurboFilterList() { turboFilterList.clear(); } - final FilterReply getTurboFilterChainDecision_0_3OrMore(final Marker marker, + final FilterReply getTurboFilterChainDecision_0_3OrMore(final List markers, 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, + return turboFilterList.getTurboFilterChainDecision(markers, logger, level, format, params, t); } - final FilterReply getTurboFilterChainDecision_1(final Marker marker, + final FilterReply getTurboFilterChainDecision_1(final List markers, 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, + return turboFilterList.getTurboFilterChainDecision(markers, logger, level, format, new Object[]{param}, t); } - final FilterReply getTurboFilterChainDecision_2(final Marker marker, + final FilterReply getTurboFilterChainDecision_2(final List markers, 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, + return turboFilterList.getTurboFilterChainDecision(markers, logger, level, format, new Object[]{param1, param2}, t); } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/boolex/OnMarkerEvaluator.java b/logback-android/src/main/java/ch/qos/logback/classic/boolex/OnMarkerEvaluator.java index 3ae798965b..329c0b52d8 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/boolex/OnMarkerEvaluator.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/boolex/OnMarkerEvaluator.java @@ -45,14 +45,16 @@ public void addMarker(String markerStr) { public boolean evaluate(ILoggingEvent event) throws NullPointerException, EvaluationException { - Marker eventsMarker = event.getMarker(); - if (eventsMarker == null) { + List eventsMarker = event.getMarkers(); + if (eventsMarker.isEmpty()) { return false; } for (String markerStr : markerList) { - if (eventsMarker.contains(markerStr)) { - return true; + for (Marker marker : eventsMarker) { + if (marker.contains(markerStr)) { + return true; + } } } return false; diff --git a/logback-android/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java b/logback-android/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java index b79dc6fb40..b5adbaff35 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/net/SMTPAppender.java @@ -25,6 +25,8 @@ import ch.qos.logback.core.net.SMTPAppenderBase; import org.slf4j.Marker; +import java.util.List; + /** * Send an e-mail when a specific logging event occurs, typically on errors or * fatal errors. @@ -93,11 +95,16 @@ protected void fillBuffer(CyclicBuffer cb, StringBuffer sbuf) { } protected boolean eventMarksEndOfLife(ILoggingEvent eventObject) { - Marker marker = eventObject.getMarker(); - if(marker == null) + List markers = eventObject.getMarkers(); + if(markers == null || markers.isEmpty()) return false; - return marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER); + for(Marker marker : markers) { + if(marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER)) { + return true; + } + } + return false; } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/pattern/MarkerConverter.java b/logback-android/src/main/java/ch/qos/logback/classic/pattern/MarkerConverter.java index 3b25e3ad31..1d529fb8fe 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/pattern/MarkerConverter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/pattern/MarkerConverter.java @@ -17,6 +17,8 @@ import org.slf4j.Marker; +import java.util.List; + import ch.qos.logback.classic.spi.ILoggingEvent; /** @@ -29,11 +31,11 @@ public class MarkerConverter extends ClassicConverter { private static String EMPTY = ""; public String convert(ILoggingEvent le) { - Marker marker = le.getMarker(); - if (marker == null) { + List markers = le.getMarkers(); + if (markers == null || markers.isEmpty()) { return EMPTY; } else { - return marker.toString(); + return markers.toString(); } } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java b/logback-android/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java index 3cfce30a51..22bd73369e 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/sift/SiftingAppender.java @@ -22,6 +22,8 @@ import ch.qos.logback.core.sift.SiftingAppenderBase; import org.slf4j.Marker; +import java.util.List; + /** * This appender can contains other appenders which it can build dynamically * depending on MDC values. The built appender is specified as part of a @@ -47,10 +49,14 @@ public void setDiscriminator(Discriminator discriminator) { } protected boolean eventMarksEndOfLife(ILoggingEvent event) { - Marker marker = event.getMarker(); - if(marker == null) + List markers = event.getMarkers(); + if(markers == null) return false; - return marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER); + for (Marker marker : markers) { + if(marker.contains(ClassicConstants.FINALIZE_SESSION_MARKER)) + return true; + } + return false; } } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java b/logback-android/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java index f79d082ff7..3c53723845 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/spi/ILoggingEvent.java @@ -15,6 +15,7 @@ */ package ch.qos.logback.classic.spi; +import java.util.List; import java.util.Map; import org.slf4j.Marker; @@ -69,7 +70,7 @@ public interface ILoggingEvent extends DeferredProcessingAware { */ boolean hasCallerData(); - Marker getMarker(); + List getMarkers(); /** * @return the MDC map. The returned value can be an empty map but not null. diff --git a/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java b/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java index 06b19a6f53..6346047d3c 100755 --- a/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEvent.java @@ -18,6 +18,7 @@ import java.io.IOException; import java.io.ObjectOutputStream; import java.util.Collections; +import java.util.List; import java.util.Map; import org.slf4j.MDC; @@ -88,7 +89,7 @@ public class LoggingEvent implements ILoggingEvent { private StackTraceElement[] callerDataArray; - private Marker marker; + private List markers; private Map mdcPropertyMap; @@ -271,16 +272,16 @@ public void setCallerData(StackTraceElement[] callerDataArray) { this.callerDataArray = callerDataArray; } - public Marker getMarker() { - return marker; + public List getMarkers() { + return markers; } - public void setMarker(Marker marker) { - if (this.marker != null) { + public void setMarkers(List markers) { + if (this.markers != null) { throw new IllegalStateException( "The marker has been already set for this event."); } - this.marker = marker; + this.markers = markers; } public long getContextBirthTime() { diff --git a/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java b/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java index 83b4d4308d..18e7157355 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/spi/LoggingEventVO.java @@ -19,6 +19,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import java.util.List; import java.util.Map; import org.slf4j.Marker; @@ -57,7 +58,7 @@ public class LoggingEventVO implements ILoggingEvent, Serializable { private ThrowableProxyVO throwableProxy; private StackTraceElement[] callerDataArray; - private Marker marker; + private List markers; private Map mdcPropertyMap; private long timeStamp; @@ -69,7 +70,7 @@ public static LoggingEventVO build(ILoggingEvent le) { ledo.level = (le.getLevel()); ledo.message = (le.getMessage()); ledo.argumentArray = (le.getArgumentArray()); - ledo.marker = le.getMarker(); + ledo.markers = le.getMarkers(); ledo.mdcPropertyMap = le.getMDCPropertyMap(); ledo.timeStamp = le.getTimeStamp(); ledo.throwableProxy = ThrowableProxyVO.build(le.getThrowableProxy()); @@ -132,8 +133,8 @@ public boolean hasCallerData() { return callerDataArray != null; } - public Marker getMarker() { - return marker; + public List getMarkers() { + return markers; } public long getTimeStamp() { @@ -235,10 +236,10 @@ public boolean equals(Object obj) { if (timeStamp != other.timeStamp) return false; - if (marker == null) { - if (other.marker != null) + if (markers == null) { + if (other.markers != null) return false; - } else if (!marker.equals(other.marker)) + } else if (!markers.equals(other.markers)) return false; if (mdcPropertyMap == null) { diff --git a/logback-android/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java b/logback-android/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java index db27d86d51..f19c3afe85 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/spi/TurboFilterList.java @@ -15,6 +15,7 @@ */ package ch.qos.logback.classic.spi; +import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import org.slf4j.Marker; @@ -38,7 +39,7 @@ final public class TurboFilterList extends CopyOnWriteArrayList { * ACCEPT or DENY, then that value is returned. If all of the filters return * NEUTRAL, then NEUTRAL is returned. */ - public FilterReply getTurboFilterChainDecision(final Marker marker, + public FilterReply getTurboFilterChainDecision(final List markers, final Logger logger, final Level level, final String format, final Object[] params, final Throwable t) { @@ -50,7 +51,7 @@ public FilterReply getTurboFilterChainDecision(final Marker marker, if (size == 1) { try { TurboFilter tf = get(0); - return tf.decide(marker, logger, level, format, params, t); + return tf.decide(markers, logger, level, format, params, t); } catch (IndexOutOfBoundsException iobe) { return FilterReply.NEUTRAL; } @@ -61,7 +62,7 @@ public FilterReply getTurboFilterChainDecision(final Marker marker, 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(markers, logger, level, format, params, t); if (r == FilterReply.DENY || r == FilterReply.ACCEPT) { return r; } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java index 5327f84aec..11473eb064 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/DuplicateMessageFilter.java @@ -17,6 +17,8 @@ import org.slf4j.Marker; +import java.util.List; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.core.spi.FilterReply; @@ -59,8 +61,8 @@ public void stop() { } @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(List markers, Logger logger, Level level, + String format, Object[] params, Throwable t) { int count = msgCache.getMessageCountAndThenIncrement(format); if (count <= allowedRepetitions) { return FilterReply.NEUTRAL; diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java index f5d69200b1..6c46eb4d8e 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/DynamicThresholdFilter.java @@ -21,6 +21,7 @@ import org.slf4j.Marker; import org.slf4j.MDC; +import java.util.List; import java.util.Map; import java.util.HashMap; @@ -223,7 +224,7 @@ public void start() { * 'levelAssociatedWithMDCValue'. If it null, then it is set to the * {@link #defaultThreshold} value. * - * @param marker + * @param markers * @param logger * @param level * @param s @@ -233,8 +234,8 @@ public void start() { * @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(List markers, Logger logger, Level level, + String s, Object[] objects, Throwable throwable) { String mdcValue = MDC.get(this.key); if (!isStarted()) { diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java index 7c8b022760..d1fb47bdb6 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/MDCFilter.java @@ -18,6 +18,8 @@ import org.slf4j.MDC; import org.slf4j.Marker; +import java.util.List; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.core.spi.FilterReply; @@ -49,7 +51,7 @@ public class MDCFilter extends MatchingFilter { String MDCKey; String value; - + @Override public void start() { int errorCount = 0; @@ -67,7 +69,7 @@ public void start() { } @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { + public FilterReply decide(List markers, Logger logger, Level level, String format, Object[] params, Throwable t) { if (!isStarted()) { return FilterReply.NEUTRAL; diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java index e82ada29aa..966886eac1 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/MarkerFilter.java @@ -18,6 +18,8 @@ import org.slf4j.Marker; import org.slf4j.MarkerFactory; +import java.util.List; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.core.spi.FilterReply; @@ -40,7 +42,7 @@ public void start() { } @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { + public FilterReply decide(List marker, Logger logger, Level level, String format, Object[] params, Throwable t) { if(!isStarted()) { return FilterReply.NEUTRAL; } diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java index 370110e665..55ab1352c2 100755 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/ReconfigureOnChangeFilter.java @@ -95,9 +95,8 @@ public String toString() { private volatile long mask = 0xF; private volatile long lastMaskCheck = System.currentTimeMillis(); - @Override - public FilterReply decide(Marker marker, Logger logger, Level level, + public FilterReply decide(List markers, Logger logger, Level level, String format, Object[] params, Throwable t) { if (!isStarted()) { return FilterReply.NEUTRAL; diff --git a/logback-android/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java b/logback-android/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java index 44ad1a963d..bdfe2e6760 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/turbo/TurboFilter.java @@ -17,6 +17,8 @@ import org.slf4j.Marker; +import java.util.List; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.core.spi.ContextAwareBase; @@ -44,7 +46,7 @@ public abstract class TurboFilter extends ContextAwareBase implements LifeCycle * The returned value should be one of {@link FilterReply#DENY}, * {@link FilterReply#NEUTRAL}, or {@link FilterReply#ACCEPT}. - * @param marker + * @param markers * @param logger * @param level * @param format @@ -52,8 +54,8 @@ public abstract class TurboFilter extends ContextAwareBase implements LifeCycle * @param t * @return decision */ - public abstract FilterReply decide(Marker marker, Logger logger, - Level level, String format, Object[] params, Throwable t); + public abstract FilterReply decide(List markers, Logger logger, + Level level, String format, Object[] params, Throwable t); public void start() { this.start = true; diff --git a/logback-android/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java b/logback-android/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java index ef81dbd88b..029615d055 100644 --- a/logback-android/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java +++ b/logback-android/src/main/java/ch/qos/logback/classic/util/LogbackMDCAdapter.java @@ -15,7 +15,10 @@ */ package ch.qos.logback.classic.util; +import java.util.ArrayDeque; +import java.util.Arrays; import java.util.Collections; +import java.util.Deque; import java.util.HashMap; import java.util.Map; import java.util.Set; @@ -195,4 +198,24 @@ public void setContextMap(Map contextMap) { // the newMap replaces the old one for serialisation's sake copyOnThreadLocal.set(newMap); } + + @Override + public void pushByKey(String key, String value) { + put(key, value); + } + + @Override + public String popByKey(String key) { + return get(key); + } + + @Override + public Deque getCopyOfDequeByKey(String key) { + return get(key) == null ? null : new ArrayDeque(Collections.singletonList(get(key))); + } + + @Override + public void clearDequeByKey(String key) { + put(key, null); + } } diff --git a/logback-android/src/main/java/org/slf4j/impl/LoggerFactory.java b/logback-android/src/main/java/org/slf4j/impl/LoggerFactory.java new file mode 100644 index 0000000000..7d096d17ca --- /dev/null +++ b/logback-android/src/main/java/org/slf4j/impl/LoggerFactory.java @@ -0,0 +1,35 @@ +package org.slf4j.impl; + +import org.slf4j.ILoggerFactory; +import org.slf4j.Logger; + +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import ch.qos.logback.classic.LoggerContext; + +/** + * Based on https://github.com/qos-ch/slf4j/blob/master/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLoggerFactory.java + */ +public class LoggerFactory implements ILoggerFactory { + + ConcurrentMap loggerMap; + LoggerContext loggerContext; + + public LoggerFactory() { + loggerMap = new ConcurrentHashMap(); + loggerContext = new LoggerContext(); + } + + @Override + public Logger getLogger(String name) { + Logger logger = loggerMap.get(name); + if (logger != null) { + return logger; + } else { + Logger newInstance = loggerContext.getLogger(name); + Logger oldInstance = loggerMap.putIfAbsent(name, newInstance); + return oldInstance == null ? newInstance : oldInstance; + } + } +} \ No newline at end of file diff --git a/logback-android/src/main/java/org/slf4j/impl/LoggerServiceProvider.java b/logback-android/src/main/java/org/slf4j/impl/LoggerServiceProvider.java new file mode 100644 index 0000000000..9a6cf4c1de --- /dev/null +++ b/logback-android/src/main/java/org/slf4j/impl/LoggerServiceProvider.java @@ -0,0 +1,81 @@ +package org.slf4j.impl; + +import org.slf4j.ILoggerFactory; +import org.slf4j.IMarkerFactory; +import org.slf4j.helpers.BasicMarkerFactory; +import org.slf4j.helpers.NOPMDCAdapter; +import org.slf4j.helpers.Util; +import org.slf4j.spi.MDCAdapter; +import org.slf4j.spi.SLF4JServiceProvider; + +import ch.qos.logback.classic.LoggerContext; +import ch.qos.logback.classic.util.ContextInitializer; +import ch.qos.logback.core.CoreConstants; +import ch.qos.logback.core.joran.spi.JoranException; +import ch.qos.logback.core.status.StatusUtil; +import ch.qos.logback.core.util.StatusPrinter; + +/** + * Based on https://github.com/qos-ch/slf4j/blob/master/slf4j-simple/src/main/java/org/slf4j/simple/SimpleServiceProvider.java + * and + * https://github.com/qos-ch/logback/blob/master/logback-classic/src/main/java/ch/qos/logback/classic/spi/LogbackServiceProvider.java + */ +public class LoggerServiceProvider implements SLF4JServiceProvider { + /** + * Declare the version of the SLF4J API this implementation is compiled + * against. The value of this field is usually modified with each release. + */ + // to avoid constant folding by the compiler, this field must *not* be final + public static String REQUESTED_API_VERSION = "2.0.3"; // !final + private LoggerContext defaultLoggerContext;; + private IMarkerFactory markerFactory; + private MDCAdapter mdcAdapter; + + @Override + public ILoggerFactory getLoggerFactory() { + return defaultLoggerContext; + } + + @Override + public IMarkerFactory getMarkerFactory() { + return markerFactory; + } + + @Override + public MDCAdapter getMDCAdapter() { + return mdcAdapter; + } + + @Override + public String getRequestedApiVersion() { + return REQUESTED_API_VERSION; + } + + @Override + public void initialize() { + defaultLoggerContext = new LoggerContext(); + defaultLoggerContext.setName(CoreConstants.DEFAULT_CONTEXT_NAME); + initializeLoggerContext(); + defaultLoggerContext.start(); + markerFactory = new BasicMarkerFactory(); + mdcAdapter = new NOPMDCAdapter(); + } + + private void initializeLoggerContext() { + try { + try { + new ContextInitializer(defaultLoggerContext).autoConfig(); + } catch (JoranException je) { + Util.report("Failed to auto configure default logger context", je); + } + // LOGBACK-292 + if (!StatusUtil.contextHasStatusListener(defaultLoggerContext)) { + StatusPrinter.printInCaseOfErrorsOrWarnings(defaultLoggerContext); + } + // contextSelectorBinder.init(defaultLoggerContext, KEY); + + } catch (Exception t) { // see LOGBACK-1159 + Util.report("Failed to instantiate [" + LoggerContext.class.getName() + "]", t); + } + } +} diff --git a/logback-android/src/main/java/org/slf4j/impl/StaticLoggerBinder.java b/logback-android/src/main/java/org/slf4j/impl/StaticLoggerBinder.java index 07cf0639d5..aeacfd8f38 100644 --- a/logback-android/src/main/java/org/slf4j/impl/StaticLoggerBinder.java +++ b/logback-android/src/main/java/org/slf4j/impl/StaticLoggerBinder.java @@ -15,11 +15,19 @@ */ package org.slf4j.impl; +import static org.slf4j.impl.LoggerServiceProvider.REQUESTED_API_VERSION; + import ch.qos.logback.core.status.StatusUtil; import org.slf4j.ILoggerFactory; +import org.slf4j.IMarkerFactory; +import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.slf4j.helpers.Util; import org.slf4j.spi.LoggerFactoryBinder; +import org.slf4j.spi.MDCAdapter; +import org.slf4j.spi.SLF4JServiceProvider; + +import java.util.concurrent.ConcurrentMap; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.util.ContextInitializer; @@ -35,14 +43,7 @@ * * @author Ceki Gülcü */ -public class StaticLoggerBinder implements LoggerFactoryBinder { - - /** - * Declare the version of the SLF4J API this implementation is compiled - * against. The value of this field is usually modified with each release. - */ - // to avoid constant folding by the compiler, this field must *not* be final - public static String REQUESTED_API_VERSION = "1.7"; // !final +public class StaticLoggerBinder implements SLF4JServiceProvider { final static String NULL_CS_URL = CoreConstants.CODES_URL + "#null_CS"; @@ -54,7 +55,7 @@ public class StaticLoggerBinder implements LoggerFactoryBinder { private static Object KEY = new Object(); static { - SINGLETON.init(); + SINGLETON.initialize(); } private boolean initialized = false; @@ -75,13 +76,11 @@ public static StaticLoggerBinder getSingleton() { */ static void reset() { SINGLETON = new StaticLoggerBinder(); - SINGLETON.init(); + SINGLETON.initialize(); } - /** - * Package access for testing purposes. - */ - void init() { + @Override + public void initialize() { try { try { new ContextInitializer(defaultLoggerContext).autoConfig(); @@ -112,8 +111,22 @@ public ILoggerFactory getLoggerFactory() { return contextSelectorBinder.getContextSelector().getLoggerContext(); } + @Override + public IMarkerFactory getMarkerFactory() { + return StaticMarkerBinder.SINGLETON.getMarkerFactory(); + } + + @Override + public MDCAdapter getMDCAdapter() { + return StaticMDCBinder.SINGLETON.getMDCA(); + } + + @Override + public String getRequestedApiVersion() { + return REQUESTED_API_VERSION; + } + public String getLoggerFactoryClassStr() { return contextSelectorBinder.getClass().getName(); } - } diff --git a/logback-android/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider b/logback-android/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider new file mode 100644 index 0000000000..bfaee2c766 --- /dev/null +++ b/logback-android/src/main/resources/META-INF/services/org.slf4j.spi.SLF4JServiceProvider @@ -0,0 +1 @@ +org.slf4j.impl.LoggerServiceProvider \ No newline at end of file diff --git a/logback-android/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java b/logback-android/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java index b499093f1b..08fe84b79a 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/TurboFilteringInLoggerTest.java @@ -29,6 +29,8 @@ import ch.qos.logback.classic.turbo.TurboFilter; import ch.qos.logback.core.spi.FilterReply; +import java.util.List; + public class TurboFilteringInLoggerTest { @@ -170,16 +172,14 @@ public void testLoggingContextReset() { class YesFilter extends TurboFilter { @Override - public FilterReply decide(Marker marker, Logger logger, Level level, - String format, Object[] params, Throwable t) { + public FilterReply decide(List markers, Logger logger, Level level, String format, Object[] params, Throwable t) { 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(List markers, Logger logger, Level level, String format, Object[] params, Throwable t) { return FilterReply.DENY; } } \ No newline at end of file diff --git a/logback-android/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.java b/logback-android/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.java index 81ddd9e6fe..fce75fad56 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/boolex/OnMarkerEvaluatorTest.java @@ -22,6 +22,8 @@ import org.junit.Test; import org.slf4j.MarkerFactory; +import java.util.Collections; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.spi.LoggingEvent; @@ -45,7 +47,7 @@ public void smoke() throws EvaluationException { evaluator.addMarker("M"); evaluator.start(); - event.setMarker(MarkerFactory.getMarker("M")); + event.setMarkers(Collections.singletonList(MarkerFactory.getMarker("M"))); assertTrue(evaluator.evaluate(event)); } diff --git a/logback-android/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java b/logback-android/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java index 13882d7b34..fe9f14927e 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/pattern/ConverterTest.java @@ -16,6 +16,7 @@ package ch.qos.logback.classic.pattern; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.junit.Before; @@ -252,7 +253,7 @@ public void testCallerData() { StringBuilder buf = new StringBuilder(); LoggingEvent event = makeLoggingEvent(null); - event.setMarker(MarkerFactory.getMarker("XXX")); + event.setMarkers(Collections.singletonList(MarkerFactory.getMarker("XXX"))); converter.write(buf, event); if (buf.length() < 10) { fail("buf is too short"); @@ -270,7 +271,7 @@ public void testCallerData() { StringBuilder buf = new StringBuilder(); LoggingEvent event = makeLoggingEvent(null); - event.setMarker(MarkerFactory.getMarker("YYY")); + event.setMarkers(Collections.singletonList(MarkerFactory.getMarker("YYY"))); converter.write(buf, event); if (buf.length() < 10) { fail("buf is too short"); @@ -287,7 +288,7 @@ public void testCallerData() { StringBuilder buf = new StringBuilder(); LoggingEvent event = makeLoggingEvent(null); - event.setMarker(MarkerFactory.getMarker("YYY")); + event.setMarkers(Collections.singletonList(MarkerFactory.getMarker("YYY"))); converter.write(buf, event); if (buf.length() < 10) { fail("buf is too short"); diff --git a/logback-android/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java b/logback-android/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java index e39fd849ee..fcfa6d161a 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/pattern/MarkerConverterTest.java @@ -24,6 +24,8 @@ import org.slf4j.Marker; import org.slf4j.helpers.BasicMarkerFactory; +import java.util.Collections; + import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; import ch.qos.logback.classic.LoggerContext; @@ -90,7 +92,7 @@ public void testWithSeveralChildMarker() { private ILoggingEvent createLoggingEvent(Marker marker) { LoggingEvent le = new LoggingEvent(this.getClass().getName(), lc.getLogger(Logger.ROOT_LOGGER_NAME), Level.DEBUG, "test message", null, null); - le.setMarker(marker); + le.setMarkers(Collections.singletonList(marker)); return le; } } diff --git a/logback-android/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java b/logback-android/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java index 8d44badb26..2fbc023b42 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/spi/LoggingEventSerializationTest.java @@ -25,6 +25,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import java.util.Collections; import java.util.Map; import org.junit.After; @@ -158,14 +159,14 @@ public void testWithMarker() throws Exception { LoggingEvent event = createLoggingEvent(); - event.setMarker(marker); - assertNotNull(event.getMarker()); + event.setMarkers(Collections.singletonList(marker)); + assertNotNull(event.getMarkers()); ILoggingEvent remoteEvent = writeAndRead(event); checkForEquality(event, remoteEvent); - assertNotNull(remoteEvent.getMarker()); - assertEquals(marker, remoteEvent.getMarker()); + assertNotNull(remoteEvent.getMarkers()); + assertEquals(marker, remoteEvent.getMarkers()); } @Test @@ -175,14 +176,14 @@ public void testWithTwoMarkers() throws Exception { marker.add(marker2); LoggingEvent event = createLoggingEvent(); - event.setMarker(marker); - assertNotNull(event.getMarker()); + event.setMarkers(Collections.singletonList(marker)); + assertNotNull(event.getMarkers()); ILoggingEvent remoteEvent = writeAndRead(event); checkForEquality(event, remoteEvent); - assertNotNull(remoteEvent.getMarker()); - assertEquals(marker, remoteEvent.getMarker()); + assertNotNull(remoteEvent.getMarkers()); + assertEquals(marker, remoteEvent.getMarkers()); } @Test diff --git a/logback-android/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java b/logback-android/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java index fe6b9c398f..653b87d2b5 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/spi/PubLoggingEventVO.java @@ -19,6 +19,7 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; +import java.util.List; import java.util.Map; import org.slf4j.Marker; @@ -51,7 +52,7 @@ public class PubLoggingEventVO implements ILoggingEvent, Serializable { public IThrowableProxy throwableProxy; public StackTraceElement[] callerDataArray; - public Marker marker; + public List markers; public Map mdcPropertyMap; public long timeStamp; @@ -106,8 +107,9 @@ public boolean hasCallerData() { return callerDataArray != null; } - public Marker getMarker() { - return marker; + @Override + public List getMarkers() { + return markers; } public long getTimeStamp() { @@ -210,10 +212,10 @@ public boolean equals(Object obj) { if (timeStamp != other.timeStamp) return false; - if (marker == null) { - if (other.marker != null) + if (markers == null) { + if (other.markers != null) return false; - } else if (!marker.equals(other.marker)) + } else if (!markers.equals(other.markers)) return false; if (mdcPropertyMap == null) { diff --git a/logback-android/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java b/logback-android/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java index c56bd7710e..8fbb5775bb 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/turbo/DebugUsersTurboFilter.java @@ -41,7 +41,7 @@ public class DebugUsersTurboFilter extends TurboFilter { List userList = new ArrayList(); @Override - public FilterReply decide(Marker marker, Logger logger, Level level, String format, Object[] params, Throwable t) { + public FilterReply decide(List markers, Logger logger, Level level, String format, Object[] params, Throwable t) { if (!level.equals(Level.DEBUG)) { return FilterReply.NEUTRAL; } diff --git a/logback-android/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java b/logback-android/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java index e86f86b526..886e8d30c8 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/turbo/MarkerFilterTest.java @@ -25,6 +25,8 @@ import ch.qos.logback.core.spi.FilterReply; +import java.util.Collections; + public class MarkerFilterTest { static String TOTO = "TOTO"; @@ -38,7 +40,7 @@ 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(Collections.singletonList(totoMarker), null, null, null, null, null)); assertEquals(FilterReply.NEUTRAL, mkt.decide(null, null, null, null, null, null)); } @@ -54,7 +56,7 @@ public void testBasic() { 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.ACCEPT, mkt.decide(Collections.singletonList(totoMarker), null, null, null, null, null)); } @Test @@ -72,8 +74,8 @@ public void testComposite() { 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.ACCEPT, mkt.decide(compositeMarker, null, null, null, null, null)); + assertEquals(FilterReply.ACCEPT, mkt.decide(Collections.singletonList(totoMarker), null, null, null, null, null)); + assertEquals(FilterReply.ACCEPT, mkt.decide(Collections.singletonList(compositeMarker), null, null, null, null, null)); } } diff --git a/logback-android/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java b/logback-android/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java index 29ab75b248..b1e14bb135 100644 --- a/logback-android/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java +++ b/logback-android/src/test/java/ch/qos/logback/classic/turbo/NOPTurboFilter.java @@ -21,11 +21,13 @@ import ch.qos.logback.classic.Logger; import ch.qos.logback.core.spi.FilterReply; +import java.util.List; + 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(final List markers, final Logger logger, final Level level, final String format, + final Object[] params, final Throwable t) { return FilterReply.NEUTRAL; } diff --git a/scripts/makejar.sh b/scripts/makejar.sh index f9748bdc59..77bd02b971 100755 --- a/scripts/makejar.sh +++ b/scripts/makejar.sh @@ -20,4 +20,5 @@ if [[ "$1" == "-r" ]]; then fi ./gradlew clean assemble${_profile} -x test -PVERSION_NAME=${version} +mkdir build cp -vf ./logback-android/build/outputs/aar/logback-android*.aar ./build/