The the 2.0.x series requires Java 8 and
+ adds a fluent-api.
+
+
SLF4J version 2.0.0 requires Java 8. It builds on the 1.8.x
+ series and adds a fluent-api.
+
+
+
2019 - Release of SLF4J 1.8.0-beta5
From 4faf891b8a1e9c56fe6eea0618a707a6acb16dd2 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 14 Jun 2019 02:06:42 +0200
Subject: [PATCH 004/121] document fluent api
---
.../slf4j/jul/FluentApiInvocationTest.java | 34 +++++++++++++
slf4j-site/src/site/pages/manual.html | 48 ++++++++++++++++++-
slf4j-site/src/site/pages/news.html | 9 +++-
3 files changed, 87 insertions(+), 4 deletions(-)
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
index 329cdc2d..b69446f8 100755
--- a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
@@ -57,6 +57,40 @@ public class FluentApiInvocationTest {
}
+ @Test
+ public void messageWithTwoArguments() {
+ int old = 15;
+ int t = 16;
+
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(t).addArgument(old).log(msg);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
+
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().log(msg, t, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
+
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(t).log(msg, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
+
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(() -> t16()).log(msg, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
+ }
+
+ public int t16() {
+ return 16;
+ }
+
@Test
public void messageWithThrowable() {
String msg = "Hello world.";
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index 47b8ce5d..849ec198 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -65,7 +65,10 @@
since 2.0.0 SLF4J API version 2.0.0
- requires Java 8 and inroduces a fluent API.
+ requires Java 8 and introduces a backward-compatible fluent logging
+ API. By backward-compatible, we mean that existing logging
+ frameworks do not have to be changed in order for the user to
+ benefit from the fluent logging API.
Hello World
@@ -149,7 +152,48 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
20: }
21: }
-
+
+
Fluent Logging API
+
+
As of version 2.0, SLF4J API introduces a fluent API.
+
+
The idea is to contruct a logging event piece by piece and to
+ log it once constructed. If a given logger is disabled for a
+ given level, than the no construction takes place.
+
+
Here are few examples:
+
+
The statement
+
logger.atInfo().log("Hello world");
+
+
is equivalent to:
+
+
logger.info("Hello world.");
+
+
The following statements are all equivalent:
+
+
+ int newT = 15;
+ int oldT = 16;
+
+ // using classical API
+ logger.debug("Temperature set to {}. Old temperature was {}.", newT, oldT);
+
+ // using fluent API, add arguments one by one and then log message
+ logger.atDebug().addArgument(newT).addArgument(oldT).log("Temperature set to {}. Old temperature was {}.");
+
+ // using fluent API, log message with arguments
+ logger.atDebug().log("Temperature set to {}. Old temperature was {}.", newT, oldT);
+
+ // using fluent API, add one argument and then log message providing one more argument
+ logger.atDebug().addArgument(newT).log("Temperature set to {}. Old temperature was {}.", oldT);
+
+ // using fluent API, add one argument with a Supplier and then log message with one more argument.
+ // Assume the method t16() returns 16.
+ logger.atDebug().addArgument(() -> t16()).log(msg, "Temperature set to {}. Old temperature was {}.", oldT);
+
+
+
Binding with a logging
framework at deployment time
SLF4J version 2.0.0 requires Java 8. It builds on the 1.8.x
- series and adds a fluent-api.
+ series and adds a backward-compatible fluent-api. By backward-compatible,
+ we mean that existing logging frameworks do not have to be changed
+ for the user to benefit from the fluent logging API.
+
From f9c1d25113eec6a89a3da818c402fcc58478ee9f Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 14 Jun 2019 12:08:20 +0200
Subject: [PATCH 005/121] doc fixes
---
pom.xml | 2 +-
.../slf4j/jul/FluentApiInvocationTest.java | 27 ++---
slf4j-site/src/site/pages/manual.html | 102 ++++++++++++------
slf4j-site/src/site/pages/news.html | 2 +-
4 files changed, 84 insertions(+), 49 deletions(-)
diff --git a/pom.xml b/pom.xml
index 3b22bd64..e4e6e5ab 100755
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
1.6.00.8.11.2.17
- 1.0.13
+ 1.2.34.123.7.13.8.0
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
index b69446f8..cd0f056e 100755
--- a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
@@ -19,7 +19,7 @@ public class FluentApiInvocationTest {
java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
Level oldLevel;
Logger logger = LoggerFactory.getLogger(this.getClass());
-
+
@Before
public void setUp() throws Exception {
oldLevel = root.getLevel();
@@ -56,24 +56,23 @@ public class FluentApiInvocationTest {
assertLogMessage("Hello world.", 0);
}
-
@Test
public void messageWithTwoArguments() {
int old = 15;
int t = 16;
-
+
{
String msg = "Temperature set to {}. Old temperature was {}.";
logger.atDebug().addArgument(t).addArgument(old).log(msg);
assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
}
-
+
{
String msg = "Temperature set to {}. Old temperature was {}.";
logger.atDebug().log(msg, t, old);
assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
}
-
+
{
String msg = "Temperature set to {}. Old temperature was {}.";
logger.atDebug().addArgument(t).log(msg, old);
@@ -86,11 +85,11 @@ public class FluentApiInvocationTest {
assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
}
}
-
+
public int t16() {
return 16;
}
-
+
@Test
public void messageWithThrowable() {
String msg = "Hello world.";
@@ -104,7 +103,7 @@ public class FluentApiInvocationTest {
public void messageWithArgumentsAndThrowable() {
String msg = "Hello {}.";
Throwable t = new IllegalStateException();
-
+
logger.atDebug().setCause(t).addArgument("world").log(msg);
assertLogMessage("Hello world.", 0);
assertThrowable(t, 0);
@@ -113,20 +112,22 @@ public class FluentApiInvocationTest {
@Test
public void messageWithKeyValuePair() {
String msg = "Hello world.";
-
logger.atDebug().addKeyValue("k", "v").log(msg);
assertLogMessage("k=v Hello world.", 0);
-
+
+ int oldT = 15;
+ int newT = 16;
+ logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");
+ assertLogMessage("oldT=15 newT=16 Temperature changed.", 1);
+
}
-
-
private void assertLogMessage(String expected, int index) {
LogRecord logRecord = listHandler.recordList.get(index);
Assert.assertNotNull(logRecord);
assertEquals(expected, logRecord.getMessage());
}
-
+
private void assertThrowable(Throwable expected, int index) {
LogRecord logRecord = listHandler.recordList.get(index);
Assert.assertNotNull(logRecord);
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index 849ec198..8a21fa92 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -68,7 +68,7 @@
requires Java 8 and introduces a backward-compatible fluent logging
API. By backward-compatible, we mean that existing logging
frameworks do not have to be changed in order for the user to
- benefit from the fluent logging API.
+ benefit from the fluent logging API.
Hello World
@@ -92,7 +92,7 @@ public class HelloWorld {
To run this example, you first need to download the slf4j distribution, and
then to unpack it. Once that is done, add the file
- slf4j-api-${project.version}.jar to your class path.
+ slf4j-api-${latest.stable.version}.jar to your class path.
Compiling and running HelloWorld will result in the
following output being printed on the console.
@@ -106,12 +106,12 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
The warning will disappear as soon as you add a binding to your class path. Assuming you add
- slf4j-simple-${project.version}.jar so that your class
+ slf4j-simple-${latest.stable.version}.jar so that your class
path contains:
-
slf4j-api-${project.version}.jar
-
slf4j-simple-${project.version}.jar
+
slf4j-api-${latest.stable.version}.jar
+
slf4j-simple-${latest.stable.version}.jar
Compiling and running HelloWorld will now result in
@@ -157,11 +157,21 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
As of version 2.0, SLF4J API introduces a fluent API.
-
The idea is to contruct a logging event piece by piece and to
- log it once constructed. If a given logger is disabled for a
- given level, than the no construction takes place.
+
The idea is to build a logging event piece by piece with a LoggingEventBuilder
+ and to log once the event is fully built. The
+ atTrace(), atDebug(),
+ atInfo(), atWarn() and
+ atError() methods new in the
+ org.slf4j.Logger interface return an instance of LoggingEventBuilder. For
+ disabled log levels, the returned
+ LoggingEventBuilder instance does nothing, thus
+ preserving the nano-second level performance of the regular
+ logging interface.
-
Here are few examples:
+
+
Here are few usage examples:
The statement
logger.atInfo().log("Hello world");
@@ -180,20 +190,44 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
logger.debug("Temperature set to {}. Old temperature was {}.", newT, oldT);
// using fluent API, add arguments one by one and then log message
- logger.atDebug().addArgument(newT).addArgument(oldT).log("Temperature set to {}. Old temperature was {}.");
+ logger.atDebug().addArgument(newT).addArgument(oldT).log("Temperature set to {}. Old temperature was {}.");
// using fluent API, log message with arguments
- logger.atDebug().log("Temperature set to {}. Old temperature was {}.", newT, oldT);
+ logger.atDebug().log("Temperature set to {}. Old temperature was {}.", newT, oldT);
// using fluent API, add one argument and then log message providing one more argument
- logger.atDebug().addArgument(newT).log("Temperature set to {}. Old temperature was {}.", oldT);
+ logger.atDebug().addArgument(newT).log("Temperature set to {}. Old temperature was {}.", oldT);
// using fluent API, add one argument with a Supplier and then log message with one more argument.
// Assume the method t16() returns 16.
- logger.atDebug().addArgument(() -> t16()).log(msg, "Temperature set to {}. Old temperature was {}.", oldT);
+ logger.atDebug().addArgument(() -> t16()).log(msg, "Temperature set to {}. Old temperature was {}.", oldT);
+
The fluent logging API allows the specification of many
+ different type of data to a org.slf4j.Logger
+ without a combinatorial explosion in the number of methods in
+ the Logger interface.
+
+
It is now possible to pass multiple Markers, pass arguments
+ with a Supplier
+ or pass multiple key-value pairs. Key-value pairs are
+ particularly useful in conjuction with log data analysers which
+ can interpret them automatically.
+
+
The following log statements are equivalent:
+
+ int newT = 15;
+ int oldT = 16;
+
+ // using classical API
+ logger.debug("oldT={} newT={} Temperature changed.", newT, oldT);
+
+ // using fluent API
+ logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");
+
Binding with a logging
framework at deployment time
@@ -205,23 +239,23 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
-
slf4j-log4j12-${project.version}.jar
+
slf4j-log4j12-${latest.stable.version}.jar
Binding for log4j
version 1.2, a widely used logging framework. You also
need to place log4j.jar on your class path.
-
slf4j-jdk14-${project.version}.jar
+
slf4j-jdk14-${latest.stable.version}.jar
Binding for java.util.logging, also referred to as JDK 1.4
logging
Binding for Simple
implementation, which outputs all events to
@@ -229,7 +263,7 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
printed. This binding may be useful in the context of small
applications.
. By backward-compatible,
we mean that existing logging frameworks do not have to be changed
for the user to benefit from the fluent logging API.
From a5357c8d49aab89659d40da25f2e31487add20b3 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 14 Jun 2019 13:11:01 +0200
Subject: [PATCH 006/121] ongoing doc improvements
---
slf4j-site/src/site/pages/manual.html | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index 8a21fa92..134f1803 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -155,7 +155,13 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
Fluent Logging API
-
As of version 2.0, SLF4J API introduces a fluent API.
+
since 2.0.0 SLF4J API version
+ 2.0.0 requires Java 8 and introduces a backward-compatible
+ fluent logging API. By backward-compatible, we mean that
+ existing logging frameworks do not have to be changed in order
+ for the user to benefit from the fluent
+ logging API.
+
The idea is to build a logging event piece by piece with a LoggingEventBuilder
From 83b88c502a322742f855bbb6e9d2f856dbd0d02d Mon Sep 17 00:00:00 2001
From: Artsiom Chapialiou
Date: Thu, 25 Jul 2019 17:09:52 -0400
Subject: [PATCH 007/121] fix JavaDoc typo
---
slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java
index 8ed82f3c..6fec242c 100644
--- a/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/ILoggerFactory.java
@@ -29,7 +29,7 @@ package org.slf4j;
* instances by name.
*
*
Most users retrieve {@link Logger} instances through the static
- * {@link LoggerFactory#getLogger(String)} method. An instance of of this
+ * {@link LoggerFactory#getLogger(String)} method. An instance of this
* interface is bound internally with {@link LoggerFactory} class at
* compile time.
*
From fde8ca480c86bd01dcca4d492e0fc5db56eb2619 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 28 Jul 2019 17:13:08 +0200
Subject: [PATCH 008/121] refactor EventBuilder construction
---
slf4j-api/src/main/java/org/slf4j/Logger.java | 37 +++++++++++++++----
slf4j-site/src/site/pages/manual.html | 10 ++---
2 files changed, 35 insertions(+), 12 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/Logger.java b/slf4j-api/src/main/java/org/slf4j/Logger.java
index 2d1a6a97..307dc1fc 100644
--- a/slf4j-api/src/main/java/org/slf4j/Logger.java
+++ b/slf4j-api/src/main/java/org/slf4j/Logger.java
@@ -31,6 +31,7 @@ import static org.slf4j.event.Level.INFO;
import static org.slf4j.event.Level.TRACE;
import static org.slf4j.event.Level.WARN;
+import org.slf4j.event.Level;
import org.slf4j.spi.DefaultLoggingEventBuilder;
import org.slf4j.spi.LoggingEventBuilder;
import org.slf4j.spi.NOPLoggingEventBuilder;
@@ -62,7 +63,10 @@ import org.slf4j.spi.NOPLoggingEventBuilder;
* }
*
*
- * Be sure to read the FAQ entry relating to parameterized
+ *
Be sure to read the FAQ entry relating to parameterized
* logging. Note that logging statements can be parameterized in
* presence of an exception/throwable.
*
@@ -86,6 +90,19 @@ public interface Logger {
*/
public String getName();
+ /**
+ * Make a new {@link LoggingEventBuilder} instance as appropriate for this logger and the
+ * desired {@link Level} passed as parameter.
+ *
+ * @param level desired level for the event builder
+ * @return a new {@link LoggingEventBuilder} instance as appropriate for this logger
+ * @since 2.0
+ */
+ default LoggingEventBuilder makeLoggingEventBuilder(Level level) {
+ return new DefaultLoggingEventBuilder(this, level);
+ }
+
+
/**
* Is the logger instance enabled for the TRACE level?
*
@@ -172,10 +189,11 @@ public interface Logger {
* Entry point for fluent-logging for {@link org.slf4j.event.Level#TRACE} level.
*
* @return LoggingEventBuilder instance as appropriate for level TRACE
+ * @since 2.0
*/
default public LoggingEventBuilder atTrace() {
if(isTraceEnabled()) {
- return new DefaultLoggingEventBuilder(this, TRACE);
+ return makeLoggingEventBuilder(TRACE);
} else {
return NOPLoggingEventBuilder.singleton();
}
@@ -186,7 +204,7 @@ public interface Logger {
*
* @param marker the marker data specific to this log statement
* @param msg the message string to be logged
- * @since 1.4@
+ * @since 1.4
*/
public void trace(Marker marker, String msg);
@@ -364,14 +382,16 @@ public interface Logger {
public void debug(Marker marker, String msg, Throwable t);
+
/**
* Entry point for fluent-logging for {@link org.slf4j.event.Level#DEBUG} level.
*
* @return LoggingEventBuilder instance as appropriate for level DEBUG
+ * @since 2.0
*/
default public LoggingEventBuilder atDebug() {
if(isDebugEnabled()) {
- return new DefaultLoggingEventBuilder(this, DEBUG);
+ return makeLoggingEventBuilder(DEBUG);
} else {
return NOPLoggingEventBuilder.singleton();
}
@@ -506,10 +526,11 @@ public interface Logger {
* Entry point for fluent-logging for {@link org.slf4j.event.Level#INFO} level.
*
* @return LoggingEventBuilder instance as appropriate for level INFO
+ * @since 2.0
*/
default public LoggingEventBuilder atInfo() {
if(isInfoEnabled()) {
- return new DefaultLoggingEventBuilder(this, INFO);
+ return makeLoggingEventBuilder(INFO);
} else {
return NOPLoggingEventBuilder.singleton();
}
@@ -647,10 +668,11 @@ public interface Logger {
* Entry point for fluent-logging for {@link org.slf4j.event.Level#WARN} level.
*
* @return LoggingEventBuilder instance as appropriate for level WARN
+ * @since 2.0
*/
default public LoggingEventBuilder atWarn() {
if(isWarnEnabled()) {
- return new DefaultLoggingEventBuilder(this, WARN);
+ return makeLoggingEventBuilder(WARN);
} else {
return NOPLoggingEventBuilder.singleton();
}
@@ -790,10 +812,11 @@ public interface Logger {
* Entry point for fluent-logging for {@link org.slf4j.event.Level#ERROR} level.
*
* @return LoggingEventBuilder instance as appropriate for level ERROR
+ * @since 2.0
*/
default public LoggingEventBuilder atError() {
if(isErrorEnabled()) {
- return new DefaultLoggingEventBuilder(this, ERROR);
+ return makeLoggingEventBuilder(ERROR);
} else {
return NOPLoggingEventBuilder.singleton();
}
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index 134f1803..f939b71e 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -169,11 +169,11 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
atTrace(), atDebug(),
atInfo(), atWarn() and
atError() methods new in the
- org.slf4j.Logger interface return an instance of LoggingEventBuilder. For
- disabled log levels, the returned
- LoggingEventBuilder instance does nothing, thus
- preserving the nano-second level performance of the regular
+ org.slf4j.Logger interface return an instance of
+ LoggingEventBuilder.
+ For disabled log levels, the
+ returned LoggingEventBuilder instance does nothing,
+ thus preserving the nano-second level performance of the traditional
logging interface.
• Added Automatic-Module-Name in
+ MANIFEST.MF files in various SLF4J artifacts. This fixes
+ SLF4J-420 as
+ reported by Gael Lalire.
+
+
The module names to JMPS automatic module name mappings are
+ listed in the table below.
+
+
+
+
Maven artifact/module
+
JMPS module name
+
+
+
slf4j-api
+
org.slf4j
+
+
+
slf4j-jdk14
+
org.slf4j.jul
+
+
+
slf4j-nop
+
org.slf4j.nop
+
+
slf4j-simple
+
org.slf4j.simple
+
+
+
jcl-over-slf4j
+
org.apache.commons.logging
+
+
+
log4j-over-slf4j
+
log4j
+
+
+
+
• Fixed incorrect use of TRACE level in one of the
+ debug() printing methods in
+ EventRecodingLogger class. This corrects SLF4J-460 as reporeted byKevin Goveia.
+
+
+
+
+
13th of June, 2019 - Release of SLF4J 2.0.0-alpha0
From e0a6d06fc03935ef5ae559f46fa6e96c1c348480 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 9 Aug 2019 14:51:04 +0200
Subject: [PATCH 013/121] minor edit
---
slf4j-site/src/site/pages/manual.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index f939b71e..5c5c6a5b 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -192,7 +192,7 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
int newT = 15;
int oldT = 16;
- // using classical API
+ // using traditional API
logger.debug("Temperature set to {}. Old temperature was {}.", newT, oldT);
// using fluent API, add arguments one by one and then log message
From 96783aab43ea798f4c3695a91c4d5612084d819f Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 9 Aug 2019 22:30:23 +0200
Subject: [PATCH 014/121] misplaced test class
---
.../java/org/slf4j/simple/DoubleInitializationPitfallTest.java | 0
1 file changed, 0 insertions(+), 0 deletions(-)
rename slf4j-simple/src/{main => test}/java/org/slf4j/simple/DoubleInitializationPitfallTest.java (100%)
diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java b/slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
similarity index 100%
rename from slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
rename to slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
From 94393567276108257bacc34bd460d742d93d9d08 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 9 Aug 2019 22:30:47 +0200
Subject: [PATCH 015/121] misplaced test class
---
.../java/org/slf4j/simple/DoubleInitializationPitfallTest.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java b/slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
index 202f354c..9a159682 100644
--- a/slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
+++ b/slf4j-simple/src/test/java/org/slf4j/simple/DoubleInitializationPitfallTest.java
@@ -8,9 +8,11 @@ import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
import org.slf4j.MarkerFactory;
+// See https://jira.qos.ch/browse/SLF4J-463
public class DoubleInitializationPitfallTest {
+ // See https://jira.qos.ch/browse/SLF4J-463
@Test
public void verifyImpactOfMarkerFactory() {
ILoggerFactory firstFactory = LoggerFactory.getILoggerFactory();
From 999539196e687d3b4eb9b15dcd7c1cb8b7cd3cbd Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 9 Aug 2019 23:30:23 +0200
Subject: [PATCH 016/121] update to README.md
---
README.md | 40 ++++++++++++++++++++++++++++++++++------
1 file changed, 34 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 34f94a77..a4300798 100644
--- a/README.md
+++ b/README.md
@@ -4,11 +4,39 @@ More information can be found on the [SLF4J website](http://www.slf4j.org).
# Build Status
[](https://travis-ci.org/qos-ch/slf4j)
-# How to contribute pull requests
-If you are interested in improving SLF4J, great! The SLF4J community looks forward to your contribution. Please follow this process:
-1. Start a discussion on the [slf4j-dev mailing list](http://www.slf4j.org/mailing-lists.html) about your proposed change. Alternately file a [bug report](http://www.slf4j.org/bug-reporting.html).
-2. Fork qos-ch/slf4j. Ideally, create a new branch from your fork for your contribution to make it easier to merge your changes back.
-3. Make your changes on the branch you hopefuly created in Step 2. Be sure that your code passes existing unit tests. Please add unit tests for your work if appropriate. It usually is.
-4. Push your changes to your fork/branch in github. Don't push it to your master! If you do it will make it harder to submit new changes later.
+# How to build SLF4J
+
+SLF4J requires Maven.
+
+All versions uptp and including 1.7 require Java 5 or later to
+build. SLF4J version 2.0.x requires Java 9 or later.
+
+# How to contribute pull requests
+
+If you are interested in improving SLF4J, that is great! The SLF4J
+community looks forward to your contribution. Please follow this
+process:
+
+1. Start a discussion on the [slf4j-dev mailing
+list](http://www.slf4j.org/mailing-lists.html) about your proposed
+change. Alternately, file a [bug
+report](http://www.slf4j.org/bug-reporting.html) to initiatite the
+discussion. Note that we usually ask most pull requests to be linked
+to a Jira ticket.
+
+2. Fork qos-ch/slf4j. Ideally, create a new branch from your fork for
+your contribution to make it easier to merge your changes back.
+
+3. Make your changes on the branch you hopefuly created in Step 2. Be
+sure that your code passes existing unit tests. Please add unit tests
+for your work if appropriate. It usually is.
+
+4. Push your changes to your fork/branch in github. Don't push it to
+your master! If you do it will make it harder to submit new changes
+later.
+
5. Submit a pull request to SLF4J from from your commit page on github.
+
+6. Did we mention that you will be asked to link your pull request
+with a Jira ticket?
\ No newline at end of file
From 173b06ad885c1b4fa6f506ceeabe76860d9bfb03 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 9 Aug 2019 23:33:53 +0200
Subject: [PATCH 017/121] typo fix
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index a4300798..353272af 100644
--- a/README.md
+++ b/README.md
@@ -7,9 +7,9 @@ More information can be found on the [SLF4J website](http://www.slf4j.org).
# How to build SLF4J
-SLF4J requires Maven.
+SLF4J uses Maven as its build tool.
-All versions uptp and including 1.7 require Java 5 or later to
+All versions upto and including 1.7.x require Java 5 or later to
build. SLF4J version 2.0.x requires Java 9 or later.
# How to contribute pull requests
From 206449b67433696c3ab85a1d9f990468b7839dd7 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sat, 10 Aug 2019 10:58:36 +0200
Subject: [PATCH 018/121] 1.7.28 notes
---
pom.xml | 2 +-
slf4j-site/src/site/pages/news.html | 27 ++++++++++++++++++++-------
2 files changed, 21 insertions(+), 8 deletions(-)
diff --git a/pom.xml b/pom.xml
index 9aed47c0..53f6c408 100755
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
- 1.7.27
+ 1.7.288${jdk.version}
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 9404e73e..85635ff0 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -37,7 +37,7 @@
class names in
-->
-
+
+
-
6th of August, 2019 - Release of SLF4J 1.7.27
+
10th of August, 2019 - Release of SLF4J 1.7.28
• Added Automatic-Module-Name in
MANIFEST.MF files in various SLF4J artifacts. This fixes
@@ -86,15 +87,27 @@
log4j-over-slf4j
-
log4j
+
org.apache.log4j
-
• Fixed incorrect use of TRACE level in one of the
- debug() printing methods in
+
• Fixed incorrect use of TRACE level in one of
+ the debug() printing methods in
EventRecodingLogger class. This corrects SLF4J-460 as reporeted byKevin Goveia.
+ href="https://jira.qos.ch/browse/SLF4J-460">SLF4J-460
as
+ reporeted by Kevin Goveia.
+
+
+
+
+
6th of August, 2019 - Release of SLF4J 1.7.27
+
+
+
This version had the incorrect "Automatic-Module-Name" for the
+ log4j-over-slf4j artifact. Please use version 1.7.28
+ or later which contain correct automatic module names.
+
From fe440ce9cdf1637dfd8aa9998114c627ff7c1078 Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 15:56:52 +0200
Subject: [PATCH 019/121] SLF4j-466: Add test for all happy flow cases
---
.../slf4j/event/EventRecodingLoggerTest.java | 797 ++++++++++++++++++
1 file changed, 797 insertions(+)
create mode 100644 slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
diff --git a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
new file mode 100644
index 00000000..d41c6814
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
@@ -0,0 +1,797 @@
+package org.slf4j.event;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Marker;
+import org.slf4j.helpers.BasicMarkerFactory;
+import org.slf4j.helpers.SubstituteLogger;
+
+import java.util.Queue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import static org.junit.Assert.*;
+
+public class EventRecodingLoggerTest {
+ private Queue queue;
+ private EventRecodingLogger logger;
+ private String message;
+ private Object param1;
+ private Object param2;
+ private Object param3;
+ private Object[] oneParam;
+ private Object[] twoParams;
+ private Object[] threeParams;
+ private Throwable exception;
+ private Marker marker;
+
+ @Before
+ public void setUp() {
+ queue = new LinkedBlockingQueue<>();
+ logger = new EventRecodingLogger(new SubstituteLogger("testLogger", queue, true), queue);
+ message = "Test message with 3 parameters {} {} {} {}";
+ param1 = 1;
+ param2 = 2;
+ param3 = 3;
+ oneParam = new Object[] { param1 };
+ twoParams = new Object[] { param1, param2 };
+ threeParams = new Object[] { param1, param2, param3 };
+ exception = new IllegalStateException("We just need an exception");
+ marker = new BasicMarkerFactory().getMarker("testMarker");
+ }
+
+ @After
+ public void tearDown() {
+ assertTrue(queue.isEmpty());
+ }
+
+ @Test
+ public void traceMessage() {
+ logger.trace(message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, null, null);
+ }
+
+ @Test
+ public void traceMessageOneParameter() {
+ logger.trace(message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, oneParam, null);
+ }
+
+ @Test
+ public void traceMessageTwoParameters() {
+ logger.trace(message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, twoParams, null);
+ }
+
+ @Test
+ public void traceMessageThreeParameters() {
+ logger.trace(message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, threeParams, null);
+ }
+
+ @Test
+ public void traceMessageThrowable() {
+ logger.trace(message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, null, exception);
+ }
+
+ @Test
+ public void traceMessageOneParameterThrowable() {
+ logger.trace(message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, oneParam, exception);
+ }
+
+ @Test
+ public void traceMessageTwoParametersThrowable() {
+ logger.trace(message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, twoParams, exception);
+ }
+
+ @Test
+ public void traceMessageThreeParametersThrowable() {
+ logger.trace(message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, threeParams, exception);
+ }
+
+ @Test
+ public void traceMarkerMessage() {
+ logger.trace(marker, message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, null, null);
+ }
+
+ @Test
+ public void traceMarkerMessageOneParameter() {
+ logger.trace(marker, message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, oneParam, null);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParameters() {
+ logger.trace(marker, message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, twoParams, null);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParameters() {
+ logger.trace(marker, message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, threeParams, null);
+ }
+
+ @Test
+ public void traceMarkerMessageThrowable() {
+ logger.trace(marker, message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, null, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageOneParameterThrowable() {
+ logger.trace(marker, message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, oneParam, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParametersThrowable() {
+ logger.trace(marker, message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, twoParams, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParametersThrowable() {
+ logger.trace(marker, message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.TRACE, marker, threeParams, exception);
+ }
+
+ @Test
+ public void debugMessage() {
+ logger.debug(message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, null, null);
+ }
+
+ @Test
+ public void debugMessageOneParameter() {
+ logger.debug(message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, oneParam, null);
+ }
+
+ @Test
+ public void debugMessageTwoParameters() {
+ logger.debug(message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, twoParams, null);
+ }
+
+ @Test
+ public void debugMessageThreeParameters() {
+ logger.debug(message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, threeParams, null);
+ }
+
+ @Test
+ public void debugMessageThrowable() {
+ logger.debug(message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, null, exception);
+ }
+
+ @Test
+ public void debugMessageOneParameterThrowable() {
+ logger.debug(message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, oneParam, exception);
+ }
+
+ @Test
+ public void debugMessageTwoParametersThrowable() {
+ logger.debug(message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, twoParams, exception);
+ }
+
+ @Test
+ public void debugMessageThreeParametersThrowable() {
+ logger.debug(message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, threeParams, exception);
+ }
+
+ @Test
+ public void debugMarkerMessage() {
+ logger.debug(marker, message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, null, null);
+ }
+
+ @Test
+ public void debugMarkerMessageOneParameter() {
+ logger.debug(marker, message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, oneParam, null);
+ }
+
+ @Test
+ public void debugMarkerMessageTwoParameters() {
+ logger.debug(marker, message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, twoParams, null);
+ }
+
+ @Test
+ public void debugMarkerMessageThreeParameters() {
+ logger.debug(marker, message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, threeParams, null);
+ }
+
+ @Test
+ public void debugMarkerMessageThrowable() {
+ logger.debug(marker, message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, null, exception);
+ }
+
+ @Test
+ public void debugMarkerMessageOneParameterThrowable() {
+ logger.debug(marker, message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, oneParam, exception);
+ }
+
+ @Test
+ public void debugMarkerMessageTwoParametersThrowable() {
+ logger.debug(marker, message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, twoParams, exception);
+ }
+
+ @Test
+ public void debugMarkerMessageThreeParametersThrowable() {
+ logger.debug(marker, message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.DEBUG, marker, threeParams, exception);
+ }
+
+ @Test
+ public void infoMessage() {
+ logger.info(message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, null, null);
+ }
+
+ @Test
+ public void infoMessageOneParameter() {
+ logger.info(message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, oneParam, null);
+ }
+
+ @Test
+ public void infoMessageTwoParameters() {
+ logger.info(message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, twoParams, null);
+ }
+
+ @Test
+ public void infoMessageThreeParameters() {
+ logger.info(message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, threeParams, null);
+ }
+
+ @Test
+ public void infoMessageThrowable() {
+ logger.info(message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, null, exception);
+ }
+
+ @Test
+ public void infoMessageOneParameterThrowable() {
+ logger.info(message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, oneParam, exception);
+ }
+
+ @Test
+ public void infoMessageTwoParametersThrowable() {
+ logger.info(message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, twoParams, exception);
+ }
+
+ @Test
+ public void infoMessageThreeParametersThrowable() {
+ logger.info(message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, threeParams, exception);
+ }
+
+ @Test
+ public void infoMarkerMessage() {
+ logger.info(marker, message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, null, null);
+ }
+
+ @Test
+ public void infoMarkerMessageOneParameter() {
+ logger.info(marker, message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, oneParam, null);
+ }
+
+ @Test
+ public void infoMarkerMessageTwoParameters() {
+ logger.info(marker, message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, twoParams, null);
+ }
+
+ @Test
+ public void infoMarkerMessageThreeParameters() {
+ logger.info(marker, message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, threeParams, null);
+ }
+
+ @Test
+ public void infoMarkerMessageThrowable() {
+ logger.info(marker, message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, null, exception);
+ }
+
+ @Test
+ public void infoMarkerMessageOneParameterThrowable() {
+ logger.info(marker, message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, oneParam, exception);
+ }
+
+ @Test
+ public void infoMarkerMessageTwoParametersThrowable() {
+ logger.info(marker, message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, twoParams, exception);
+ }
+
+ @Test
+ public void infoMarkerMessageThreeParametersThrowable() {
+ logger.info(marker, message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.INFO, marker, threeParams, exception);
+ }
+
+ @Test
+ public void warnMessage() {
+ logger.warn(message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, null, null);
+ }
+
+ @Test
+ public void warnMessageOneParameter() {
+ logger.warn(message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, oneParam, null);
+ }
+
+ @Test
+ public void warnMessageTwoParameters() {
+ logger.warn(message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, twoParams, null);
+ }
+
+ @Test
+ public void warnMessageThreeParameters() {
+ logger.warn(message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, threeParams, null);
+ }
+
+ @Test
+ public void warnMessageThrowable() {
+ logger.warn(message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, null, exception);
+ }
+
+ @Test
+ public void warnMessageOneParameterThrowable() {
+ logger.warn(message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, oneParam, exception);
+ }
+
+ @Test
+ public void warnMessageTwoParametersThrowable() {
+ logger.warn(message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, twoParams, exception);
+ }
+
+ @Test
+ public void warnMessageThreeParametersThrowable() {
+ logger.warn(message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, threeParams, exception);
+ }
+
+ @Test
+ public void warnMarkerMessage() {
+ logger.warn(marker, message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, null, null);
+ }
+
+ @Test
+ public void warnMarkerMessageOneParameter() {
+ logger.warn(marker, message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, oneParam, null);
+ }
+
+ @Test
+ public void warnMarkerMessageTwoParameters() {
+ logger.warn(marker, message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, twoParams, null);
+ }
+
+ @Test
+ public void warnMarkerMessageThreeParameters() {
+ logger.warn(marker, message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, threeParams, null);
+ }
+
+ @Test
+ public void warnMarkerMessageThrowable() {
+ logger.warn(marker, message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, null, exception);
+ }
+
+ @Test
+ public void warnMarkerMessageOneParameterThrowable() {
+ logger.warn(marker, message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, oneParam, exception);
+ }
+
+ @Test
+ public void warnMarkerMessageTwoParametersThrowable() {
+ logger.warn(marker, message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, twoParams, exception);
+ }
+
+ @Test
+ public void warnMarkerMessageThreeParametersThrowable() {
+ logger.warn(marker, message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.WARN, marker, threeParams, exception);
+ }
+
+ @Test
+ public void errorMessage() {
+ logger.error(message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, null, null);
+ }
+
+ @Test
+ public void errorMessageOneParameter() {
+ logger.error(message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, oneParam, null);
+ }
+
+ @Test
+ public void errorMessageTwoParameters() {
+ logger.error(message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, twoParams, null);
+ }
+
+ @Test
+ public void errorMessageThreeParameters() {
+ logger.error(message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, threeParams, null);
+ }
+
+ @Test
+ public void errorMessageThrowable() {
+ logger.error(message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, null, exception);
+ }
+
+ @Test
+ public void errorMessageOneParameterThrowable() {
+ logger.error(message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, oneParam, exception);
+ }
+
+ @Test
+ public void errorMessageTwoParametersThrowable() {
+ logger.error(message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, twoParams, exception);
+ }
+
+ @Test
+ public void errorMessageThreeParametersThrowable() {
+ logger.error(message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, threeParams, exception);
+ }
+
+ @Test
+ public void errorMarkerMessage() {
+ logger.error(marker, message);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, null, null);
+ }
+
+ @Test
+ public void errorMarkerMessageOneParameter() {
+ logger.error(marker, message, param1);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, oneParam, null);
+ }
+
+ @Test
+ public void errorMarkerMessageTwoParameters() {
+ logger.error(marker, message, param1, param2);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, twoParams, null);
+ }
+
+ @Test
+ public void errorMarkerMessageThreeParameters() {
+ logger.error(marker, message, param1, param2, param3);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, threeParams, null);
+ }
+
+ @Test
+ public void errorMarkerMessageThrowable() {
+ logger.error(marker, message, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, null, exception);
+ }
+
+ @Test
+ public void errorMarkerMessageOneParameterThrowable() {
+ logger.error(marker, message, param1, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, oneParam, exception);
+ }
+
+ @Test
+ public void errorMarkerMessageTwoParametersThrowable() {
+ logger.error(marker, message, param1, param2, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, twoParams, exception);
+ }
+
+ @Test
+ public void errorMarkerMessageThreeParametersThrowable() {
+ logger.error(marker, message, param1, param2, param3, exception);
+
+ SubstituteLoggingEvent event = queue.poll();
+
+ verifyMessage(event, Level.ERROR, marker, threeParams, exception);
+ }
+
+ private void verifyMessage(SubstituteLoggingEvent event, Level level, Object[] arguments, Throwable exception) {
+ verifyMessage(event, level, null, arguments, exception);
+ }
+
+ private void verifyMessage(SubstituteLoggingEvent event, Level level, Marker marker, Object[] arguments, Throwable exception) {
+ assertNotNull(event);
+
+ if (marker == null) {
+ assertNull(event.getMarkers().get(0));
+ } else {
+ assertEquals(marker, event.getMarkers().get(0));
+ }
+
+ assertEquals(message, event.getMessage());
+
+ if (arguments == null) {
+ assertNull(event.getArgumentArray());
+ } else {
+ assertArrayEquals(arguments, event.getArgumentArray());
+ }
+
+ assertEquals(level, event.getLevel());
+
+ if (exception == null) {
+ assertNull(event.getThrowable());
+ } else {
+ assertEquals(exception, event.getThrowable());
+ }
+ }
+}
\ No newline at end of file
From b99ad9f80f937a91209accd9561332bb9fa30312 Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 15:58:02 +0200
Subject: [PATCH 020/121] SLF4j-466: add missing marker in one of the warn
methods
---
.../src/main/java/org/slf4j/event/EventRecodingLogger.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index 402caf7e..536f09ec 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -224,7 +224,7 @@ public class EventRecodingLogger implements Logger {
}
public void warn(Marker marker, String format, Object arg) {
- recordEvent(Level.WARN, format, new Object[] { arg }, null);
+ recordEvent(Level.WARN, marker, format, new Object[] { arg }, null);
}
public void warn(Marker marker, String format, Object arg1, Object arg2) {
From a09d78831003bc155ca9ea5374d24dde24dd2976 Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 15:59:14 +0200
Subject: [PATCH 021/121] SLF4j-466: Move two methods from MessageFormatter to
Util so they can be used by the EventRecordingLogger as well
---
.../org/slf4j/helpers/MessageFormatter.java | 25 +----------
.../src/main/java/org/slf4j/helpers/Util.java | 43 ++++++++++++++++++-
2 files changed, 43 insertions(+), 25 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
index e5df70e9..f2602066 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
@@ -153,34 +153,13 @@ final public class MessageFormatter {
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
- Throwable throwableCandidate = getThrowableCandidate(argArray);
+ Throwable throwableCandidate = Util.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
- args = trimmedCopy(argArray);
+ args = Util.trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
}
-
- static final Throwable getThrowableCandidate(Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- return null;
- }
-
- final Object lastEntry = argArray[argArray.length - 1];
- if (lastEntry instanceof Throwable) {
- return (Throwable) lastEntry;
- }
- return null;
- }
- private static Object[] trimmedCopy(Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- throw new IllegalStateException("non-sensical empty or null argument array");
- }
- final int trimemdLen = argArray.length - 1;
- Object[] trimmed = new Object[trimemdLen];
- System.arraycopy(argArray, 0, trimmed, 0, trimemdLen);
- return trimmed;
- }
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
index 06017849..68840067 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
@@ -127,7 +127,46 @@ public final class Util {
static final public void report(String msg) {
System.err.println("SLF4J: " + msg);
}
-
-
+
+ /**
+ * Helper method to determine if an {@link Object} array contains an {@link Throwable} as last element
+ *
+ * @param argArray
+ * The arguments off which we want to know if it contains a {@link Throwable} as last element
+ * @return if the last parameter in argArray is a Throwable this method will return it, otherwise it returns null
+ */
+ public static Throwable getThrowableCandidate(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ return null;
+ }
+
+ final Object lastEntry = argArray[argArray.length - 1];
+ if (lastEntry instanceof Throwable) {
+ return (Throwable) lastEntry;
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method to get all but the last element of an array
+ *
+ * @param argArray
+ * The arguments from which we want to remove the last element
+ *
+ * @return a copy of the array without the last element
+ */
+ public static Object[] trimmedCopy(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ throw new IllegalStateException("non-sensical empty or null argument array");
+ }
+
+ final int trimmedLen = argArray.length - 1;
+
+ Object[] trimmed = new Object[trimmedLen];
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+
+ return trimmed;
+ }
}
From 9df5d4fe915b887ff610a50fca30fe1064d63c66 Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 16:01:42 +0200
Subject: [PATCH 022/121] SLF4j-466: put the throwable at the right place of
the SubstituteLoggingEvent, introduced two more recordEvent methods for the
two object argument log statements
---
.../org/slf4j/event/EventRecodingLogger.java | 53 ++++++++++++++-----
1 file changed, 39 insertions(+), 14 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index 536f09ec..fe86316e 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -5,6 +5,7 @@ import java.util.Queue;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.helpers.SubstituteLogger;
+import org.slf4j.helpers.Util;
public class EventRecodingLogger implements Logger {
@@ -22,6 +23,18 @@ public class EventRecodingLogger implements Logger {
return name;
}
+ private void recordEvent(Level level, String msg, Object arg1, Object arg2) {
+ recordEvent(level, null, msg, arg1, arg2);
+ }
+
+ private void recordEvent(Level level, Marker marker, String msg, Object arg1, Object arg2) {
+ if (arg2 instanceof Throwable) {
+ recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
+ } else {
+ recordEvent(level, marker, msg, new Object[] { arg1, arg2 }, null);
+ }
+ }
+
private void recordEvent(Level level, String msg, Object[] args, Throwable throwable) {
recordEvent(level, null, msg, args, throwable);
}
@@ -35,9 +48,23 @@ public class EventRecodingLogger implements Logger {
loggingEvent.setLoggerName(name);
loggingEvent.addMarker(marker);
loggingEvent.setMessage(msg);
- loggingEvent.setArgumentArray(args);
- loggingEvent.setThrowable(throwable);
loggingEvent.setThreadName(Thread.currentThread().getName());
+
+ // 1 and 2 args are covered by other methods
+ if(throwable == null && args != null && args.length > 2) {
+ Throwable throwableCandidate = Util.getThrowableCandidate(args);
+ if(throwableCandidate != null) {
+ loggingEvent.setArgumentArray(Util.trimmedCopy(args));
+ loggingEvent.setThrowable(throwableCandidate);
+ } else {
+ loggingEvent.setArgumentArray(args);
+ loggingEvent.setThrowable(null);
+ }
+ } else {
+ loggingEvent.setArgumentArray(args);
+ loggingEvent.setThrowable(throwable);
+ }
+
eventQueue.add(loggingEvent);
}
@@ -54,7 +81,7 @@ public class EventRecodingLogger implements Logger {
}
public void trace(String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.TRACE, format, arg1, arg2);
}
public void trace(String format, Object... arguments) {
@@ -79,7 +106,7 @@ public class EventRecodingLogger implements Logger {
}
public void trace(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, marker, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.TRACE, marker, format, arg1, arg2);
}
public void trace(Marker marker, String format, Object... argArray) {
@@ -105,8 +132,7 @@ public class EventRecodingLogger implements Logger {
}
public void debug(String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, format, new Object[] { arg1, arg2 }, null);
-
+ recordEvent(Level.DEBUG, format, arg1, arg2);
}
public void debug(String format, Object... arguments) {
@@ -130,7 +156,7 @@ public class EventRecodingLogger implements Logger {
}
public void debug(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, marker, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.DEBUG, marker, format, arg1, arg2);
}
public void debug(Marker marker, String format, Object... arguments) {
@@ -154,7 +180,7 @@ public class EventRecodingLogger implements Logger {
}
public void info(String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.INFO, format, arg1, arg2);
}
public void info(String format, Object... arguments) {
@@ -178,7 +204,7 @@ public class EventRecodingLogger implements Logger {
}
public void info(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, marker, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.INFO, marker, format, arg1, arg2);
}
public void info(Marker marker, String format, Object... arguments) {
@@ -204,7 +230,7 @@ public class EventRecodingLogger implements Logger {
}
public void warn(String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.WARN, format, arg1, arg2);
}
public void warn(String format, Object... arguments) {
@@ -228,8 +254,7 @@ public class EventRecodingLogger implements Logger {
}
public void warn(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, marker, format, new Object[] { arg1, arg2 }, null);
-
+ recordEvent(Level.WARN, marker, format, arg1, arg2);
}
public void warn(Marker marker, String format, Object... arguments) {
@@ -254,7 +279,7 @@ public class EventRecodingLogger implements Logger {
}
public void error(String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.ERROR, format, arg1, arg2);
}
@@ -282,7 +307,7 @@ public class EventRecodingLogger implements Logger {
}
public void error(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, marker, format, new Object[] { arg1, arg2 }, null);
+ recordEvent(Level.ERROR, marker, format, arg1, arg2);
}
public void error(Marker marker, String format, Object... arguments) {
From 7c3d35596f93142cd75a7c1d00c677c9c3051d0b Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 16:40:13 +0200
Subject: [PATCH 023/121] SLF4j-466: only call arraycopy if we have elements to
copy
---
slf4j-api/src/main/java/org/slf4j/helpers/Util.java | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
index 68840067..50a7bb7f 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
@@ -164,7 +164,10 @@ public final class Util {
final int trimmedLen = argArray.length - 1;
Object[] trimmed = new Object[trimmedLen];
- System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+
+ if (trimmedLen > 0) {
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+ }
return trimmed;
}
From 587ec03af793126782efb6f8196b2487e524801f Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 16:42:41 +0200
Subject: [PATCH 024/121] SLF4j-466: added missing newline at end of file
---
.../src/test/java/org/slf4j/event/EventRecodingLoggerTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
index d41c6814..68abff0e 100644
--- a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
@@ -794,4 +794,4 @@ public class EventRecodingLoggerTest {
assertEquals(exception, event.getThrowable());
}
}
-}
\ No newline at end of file
+}
From a98bd22216fabe015635445be7ba9e77caabee72 Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 16:49:37 +0200
Subject: [PATCH 025/121] SLF4j-466: fixed typo in javadoc
---
slf4j-api/src/main/java/org/slf4j/helpers/Util.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
index 50a7bb7f..ab92f326 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
@@ -129,11 +129,12 @@ public final class Util {
}
/**
- * Helper method to determine if an {@link Object} array contains an {@link Throwable} as last element
+ * Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
*
* @param argArray
* The arguments off which we want to know if it contains a {@link Throwable} as last element
- * @return if the last parameter in argArray is a Throwable this method will return it, otherwise it returns null
+ * @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
+ * otherwise it returns null
*/
public static Throwable getThrowableCandidate(final Object[] argArray) {
if (argArray == null || argArray.length == 0) {
From b0b57b9f9b261158d4c888f6527018c5f80eed8b Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 17:40:47 +0200
Subject: [PATCH 026/121] SLF4j-466: if was missing a space
---
.../src/main/java/org/slf4j/event/EventRecodingLogger.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index fe86316e..abb33ab1 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -51,7 +51,7 @@ public class EventRecodingLogger implements Logger {
loggingEvent.setThreadName(Thread.currentThread().getName());
// 1 and 2 args are covered by other methods
- if(throwable == null && args != null && args.length > 2) {
+ if (throwable == null && args != null && args.length > 2) {
Throwable throwableCandidate = Util.getThrowableCandidate(args);
if(throwableCandidate != null) {
loggingEvent.setArgumentArray(Util.trimmedCopy(args));
From b266bb29374e37b63ae106f3177941df10b9aa6f Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Mon, 12 Aug 2019 17:46:11 +0200
Subject: [PATCH 027/121] Change the java indent from 2 to 4.
---
.idea/codeStyleSettings.xml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.idea/codeStyleSettings.xml b/.idea/codeStyleSettings.xml
index 31cb3222..3507c0b8 100755
--- a/.idea/codeStyleSettings.xml
+++ b/.idea/codeStyleSettings.xml
@@ -31,8 +31,8 @@
-
-
+
+
From 178e836f714c3024c6317fb1b09760d4b5c9e2fe Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 13 Aug 2019 15:38:32 +0200
Subject: [PATCH 028/121] move methods from Util back to MessageFormatter
---
.../org/slf4j/event/EventRecodingLogger.java | 528 +++++++++---------
.../org/slf4j/helpers/MessageFormatter.java | 49 +-
.../src/main/java/org/slf4j/helpers/Util.java | 45 --
3 files changed, 317 insertions(+), 305 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index abb33ab1..e11adce4 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -4,15 +4,28 @@ import java.util.Queue;
import org.slf4j.Logger;
import org.slf4j.Marker;
+import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.SubstituteLogger;
-import org.slf4j.helpers.Util;
+/**
+ *
+ * This class is used to record events during the initialization phase of
+ * the underlying logging framework. It is called by {@link SubstituteLogger}.
+ *
+ *
+ * @author Ceki Gülcü
+ * @author Wessel van Norel
+ *
+ */
public class EventRecodingLogger implements Logger {
String name;
SubstituteLogger logger;
Queue eventQueue;
+ // as an event recording logger we have no choice but to record all events
+ final static boolean RECORD_ALL_EVENTS = true;
+
public EventRecodingLogger(SubstituteLogger logger, Queue eventQueue) {
this.logger = logger;
this.name = logger.getName();
@@ -23,11 +36,261 @@ public class EventRecodingLogger implements Logger {
return name;
}
- private void recordEvent(Level level, String msg, Object arg1, Object arg2) {
- recordEvent(level, null, msg, arg1, arg2);
+ public boolean isTraceEnabled() {
+ return RECORD_ALL_EVENTS;
}
- private void recordEvent(Level level, Marker marker, String msg, Object arg1, Object arg2) {
+ public void trace(String msg) {
+ recordEventwithoutMarkerArgArray(Level.TRACE, msg, null, null);
+ }
+
+ public void trace(String format, Object arg) {
+ recordEventwithoutMarkerArgArray(Level.TRACE, format, new Object[] { arg }, null);
+ }
+
+ public void trace(String format, Object arg1, Object arg2) {
+ recordEventWithoutMarker2Args(Level.TRACE, format, arg1, arg2);
+ }
+
+ public void trace(String format, Object... arguments) {
+ recordEventwithoutMarkerArgArray(Level.TRACE, format, arguments, null);
+ }
+
+ public void trace(String msg, Throwable t) {
+ recordEventwithoutMarkerArgArray(Level.TRACE, msg, null, t);
+ }
+
+ public boolean isTraceEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void trace(Marker marker, String msg) {
+ recordEvent(Level.TRACE, marker, msg, null, null);
+
+ }
+
+ public void trace(Marker marker, String format, Object arg) {
+ recordEvent(Level.TRACE, marker, format, new Object[] { arg }, null);
+ }
+
+ public void trace(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.TRACE, marker, format, arg1, arg2);
+ }
+
+ public void trace(Marker marker, String format, Object... argArray) {
+ recordEvent(Level.TRACE, marker, format, argArray, null);
+
+ }
+
+ public void trace(Marker marker, String msg, Throwable t) {
+ recordEvent(Level.TRACE, marker, msg, null, t);
+ }
+
+ public boolean isDebugEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void debug(String msg) {
+ recordEventwithoutMarkerArgArray(Level.DEBUG, msg, null, null);
+ }
+
+ public void debug(String format, Object arg) {
+ recordEventwithoutMarkerArgArray(Level.DEBUG, format, new Object[] { arg }, null);
+
+ }
+
+ public void debug(String format, Object arg1, Object arg2) {
+ recordEventWithoutMarker2Args(Level.DEBUG, format, arg1, arg2);
+ }
+
+ public void debug(String format, Object... arguments) {
+ recordEventwithoutMarkerArgArray(Level.DEBUG, format, arguments, null);
+ }
+
+ public void debug(String msg, Throwable t) {
+ recordEventwithoutMarkerArgArray(Level.DEBUG, msg, null, t);
+ }
+
+ public boolean isDebugEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void debug(Marker marker, String msg) {
+ recordEvent(Level.DEBUG, marker, msg, null, null);
+ }
+
+ public void debug(Marker marker, String format, Object arg) {
+ recordEvent(Level.DEBUG, marker, format, new Object[] { arg }, null);
+ }
+
+ public void debug(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.DEBUG, marker, format, arg1, arg2);
+ }
+
+ public void debug(Marker marker, String format, Object... arguments) {
+ recordEvent(Level.DEBUG, marker, format, arguments, null);
+ }
+
+ public void debug(Marker marker, String msg, Throwable t) {
+ recordEvent(Level.DEBUG, marker, msg, null, t);
+ }
+
+ public boolean isInfoEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void info(String msg) {
+ recordEventwithoutMarkerArgArray(Level.INFO, msg, null, null);
+ }
+
+ public void info(String format, Object arg) {
+ recordEventwithoutMarkerArgArray(Level.INFO, format, new Object[] { arg }, null);
+ }
+
+ public void info(String format, Object arg1, Object arg2) {
+ recordEventWithoutMarker2Args(Level.INFO, format, arg1, arg2);
+ }
+
+ public void info(String format, Object... arguments) {
+ recordEventwithoutMarkerArgArray(Level.INFO, format, arguments, null);
+ }
+
+ public void info(String msg, Throwable t) {
+ recordEventwithoutMarkerArgArray(Level.INFO, msg, null, t);
+ }
+
+ public boolean isInfoEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void info(Marker marker, String msg) {
+ recordEvent(Level.INFO, marker, msg, null, null);
+ }
+
+ public void info(Marker marker, String format, Object arg) {
+ recordEvent(Level.INFO, marker, format, new Object[] { arg }, null);
+ }
+
+ public void info(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.INFO, marker, format, arg1, arg2);
+ }
+
+ public void info(Marker marker, String format, Object... arguments) {
+ recordEvent(Level.INFO, marker, format, arguments, null);
+ }
+
+ public void info(Marker marker, String msg, Throwable t) {
+ recordEvent(Level.INFO, marker, msg, null, t);
+
+ }
+
+ public boolean isWarnEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void warn(String msg) {
+ recordEventwithoutMarkerArgArray(Level.WARN, msg, null, null);
+ }
+
+ public void warn(String format, Object arg) {
+ recordEventwithoutMarkerArgArray(Level.WARN, format, new Object[] { arg }, null);
+
+ }
+
+ public void warn(String format, Object arg1, Object arg2) {
+ recordEventWithoutMarker2Args(Level.WARN, format, arg1, arg2);
+ }
+
+ public void warn(String format, Object... arguments) {
+ recordEventwithoutMarkerArgArray(Level.WARN, format, arguments, null);
+ }
+
+ public void warn(String msg, Throwable t) {
+ recordEventwithoutMarkerArgArray(Level.WARN, msg, null, t);
+ }
+
+ public boolean isWarnEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void warn(Marker marker, String msg) {
+ recordEvent(Level.WARN, marker, msg, null, null);
+ }
+
+ public void warn(Marker marker, String format, Object arg) {
+ recordEvent(Level.WARN, marker, format, new Object[] { arg }, null);
+ }
+
+ public void warn(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.WARN, marker, format, arg1, arg2);
+ }
+
+ public void warn(Marker marker, String format, Object... arguments) {
+ recordEvent(Level.WARN, marker, format, arguments, null);
+ }
+
+ public void warn(Marker marker, String msg, Throwable t) {
+ recordEvent(Level.WARN, marker, msg, null, t);
+ }
+
+ public boolean isErrorEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(String msg) {
+ recordEventwithoutMarkerArgArray(Level.ERROR, msg, null, null);
+ }
+
+ public void error(String format, Object arg) {
+ recordEventwithoutMarkerArgArray(Level.ERROR, format, new Object[] { arg }, null);
+
+ }
+
+ public void error(String format, Object arg1, Object arg2) {
+ recordEventWithoutMarker2Args(Level.ERROR, format, arg1, arg2);
+
+ }
+
+ public void error(String format, Object... arguments) {
+ recordEventwithoutMarkerArgArray(Level.ERROR, format, arguments, null);
+
+ }
+
+ public void error(String msg, Throwable t) {
+ recordEventwithoutMarkerArgArray(Level.ERROR, msg, null, t);
+ }
+
+ public boolean isErrorEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(Marker marker, String msg) {
+ recordEvent(Level.ERROR, marker, msg, null, null);
+
+ }
+
+ public void error(Marker marker, String format, Object arg) {
+ recordEvent(Level.ERROR, marker, format, new Object[] { arg }, null);
+
+ }
+
+ public void error(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.ERROR, marker, format, arg1, arg2);
+ }
+
+ public void error(Marker marker, String format, Object... arguments) {
+ recordEvent(Level.ERROR, marker, format, arguments, null);
+ }
+
+ public void error(Marker marker, String msg, Throwable t) {
+ recordEvent(Level.ERROR, marker, msg, null, t);
+ }
+
+ private void recordEventWithoutMarker2Args(Level level, String msg, Object arg1, Object arg2) {
+ recordEvent2Args(level, null, msg, arg1, arg2);
+ }
+
+ private void recordEvent2Args(Level level, Marker marker, String msg, Object arg1, Object arg2) {
if (arg2 instanceof Throwable) {
recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
} else {
@@ -35,7 +298,7 @@ public class EventRecodingLogger implements Logger {
}
}
- private void recordEvent(Level level, String msg, Object[] args, Throwable throwable) {
+ private void recordEventwithoutMarkerArgArray(Level level, String msg, Object[] args, Throwable throwable) {
recordEvent(level, null, msg, args, throwable);
}
@@ -52,9 +315,9 @@ public class EventRecodingLogger implements Logger {
// 1 and 2 args are covered by other methods
if (throwable == null && args != null && args.length > 2) {
- Throwable throwableCandidate = Util.getThrowableCandidate(args);
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
if(throwableCandidate != null) {
- loggingEvent.setArgumentArray(Util.trimmedCopy(args));
+ loggingEvent.setArgumentArray(MessageFormatter.trimmedCopy(args));
loggingEvent.setThrowable(throwableCandidate);
} else {
loggingEvent.setArgumentArray(args);
@@ -67,255 +330,4 @@ public class EventRecodingLogger implements Logger {
eventQueue.add(loggingEvent);
}
-
- public boolean isTraceEnabled() {
- return true;
- }
-
- public void trace(String msg) {
- recordEvent(Level.TRACE, msg, null, null);
- }
-
- public void trace(String format, Object arg) {
- recordEvent(Level.TRACE, format, new Object[] { arg }, null);
- }
-
- public void trace(String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, format, arg1, arg2);
- }
-
- public void trace(String format, Object... arguments) {
- recordEvent(Level.TRACE, format, arguments, null);
- }
-
- public void trace(String msg, Throwable t) {
- recordEvent(Level.TRACE, msg, null, t);
- }
-
- public boolean isTraceEnabled(Marker marker) {
- return true;
- }
-
- public void trace(Marker marker, String msg) {
- recordEvent(Level.TRACE, marker, msg, null, null);
-
- }
-
- public void trace(Marker marker, String format, Object arg) {
- recordEvent(Level.TRACE, marker, format, new Object[] { arg }, null);
- }
-
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.TRACE, marker, format, arg1, arg2);
- }
-
- public void trace(Marker marker, String format, Object... argArray) {
- recordEvent(Level.TRACE, marker, format, argArray, null);
-
- }
-
- public void trace(Marker marker, String msg, Throwable t) {
- recordEvent(Level.TRACE, marker, msg, null, t);
- }
-
- public boolean isDebugEnabled() {
- return true;
- }
-
- public void debug(String msg) {
- recordEvent(Level.DEBUG, msg, null, null);
- }
-
- public void debug(String format, Object arg) {
- recordEvent(Level.DEBUG, format, new Object[] { arg }, null);
-
- }
-
- public void debug(String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, format, arg1, arg2);
- }
-
- public void debug(String format, Object... arguments) {
- recordEvent(Level.DEBUG, format, arguments, null);
- }
-
- public void debug(String msg, Throwable t) {
- recordEvent(Level.DEBUG, msg, null, t);
- }
-
- public boolean isDebugEnabled(Marker marker) {
- return true;
- }
-
- public void debug(Marker marker, String msg) {
- recordEvent(Level.DEBUG, marker, msg, null, null);
- }
-
- public void debug(Marker marker, String format, Object arg) {
- recordEvent(Level.DEBUG, marker, format, new Object[] { arg }, null);
- }
-
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.DEBUG, marker, format, arg1, arg2);
- }
-
- public void debug(Marker marker, String format, Object... arguments) {
- recordEvent(Level.DEBUG, marker, format, arguments, null);
- }
-
- public void debug(Marker marker, String msg, Throwable t) {
- recordEvent(Level.DEBUG, marker, msg, null, t);
- }
-
- public boolean isInfoEnabled() {
- return true;
- }
-
- public void info(String msg) {
- recordEvent(Level.INFO, msg, null, null);
- }
-
- public void info(String format, Object arg) {
- recordEvent(Level.INFO, format, new Object[] { arg }, null);
- }
-
- public void info(String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, format, arg1, arg2);
- }
-
- public void info(String format, Object... arguments) {
- recordEvent(Level.INFO, format, arguments, null);
- }
-
- public void info(String msg, Throwable t) {
- recordEvent(Level.INFO, msg, null, t);
- }
-
- public boolean isInfoEnabled(Marker marker) {
- return true;
- }
-
- public void info(Marker marker, String msg) {
- recordEvent(Level.INFO, marker, msg, null, null);
- }
-
- public void info(Marker marker, String format, Object arg) {
- recordEvent(Level.INFO, marker, format, new Object[] { arg }, null);
- }
-
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.INFO, marker, format, arg1, arg2);
- }
-
- public void info(Marker marker, String format, Object... arguments) {
- recordEvent(Level.INFO, marker, format, arguments, null);
- }
-
- public void info(Marker marker, String msg, Throwable t) {
- recordEvent(Level.INFO, marker, msg, null, t);
-
- }
-
- public boolean isWarnEnabled() {
- return true;
- }
-
- public void warn(String msg) {
- recordEvent(Level.WARN, msg, null, null);
- }
-
- public void warn(String format, Object arg) {
- recordEvent(Level.WARN, format, new Object[] { arg }, null);
-
- }
-
- public void warn(String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, format, arg1, arg2);
- }
-
- public void warn(String format, Object... arguments) {
- recordEvent(Level.WARN, format, arguments, null);
- }
-
- public void warn(String msg, Throwable t) {
- recordEvent(Level.WARN, msg, null, t);
- }
-
- public boolean isWarnEnabled(Marker marker) {
- return true;
- }
-
- public void warn(Marker marker, String msg) {
- recordEvent(Level.WARN, marker, msg, null, null);
- }
-
- public void warn(Marker marker, String format, Object arg) {
- recordEvent(Level.WARN, marker, format, new Object[] { arg }, null);
- }
-
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.WARN, marker, format, arg1, arg2);
- }
-
- public void warn(Marker marker, String format, Object... arguments) {
- recordEvent(Level.WARN, marker, format, arguments, null);
- }
-
- public void warn(Marker marker, String msg, Throwable t) {
- recordEvent(Level.WARN, marker, msg, null, t);
- }
-
- public boolean isErrorEnabled() {
- return true;
- }
-
- public void error(String msg) {
- recordEvent(Level.ERROR, msg, null, null);
- }
-
- public void error(String format, Object arg) {
- recordEvent(Level.ERROR, format, new Object[] { arg }, null);
-
- }
-
- public void error(String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, format, arg1, arg2);
-
- }
-
- public void error(String format, Object... arguments) {
- recordEvent(Level.ERROR, format, arguments, null);
-
- }
-
- public void error(String msg, Throwable t) {
- recordEvent(Level.ERROR, msg, null, t);
- }
-
- public boolean isErrorEnabled(Marker marker) {
- return true;
- }
-
- public void error(Marker marker, String msg) {
- recordEvent(Level.ERROR, marker, msg, null, null);
-
- }
-
- public void error(Marker marker, String format, Object arg) {
- recordEvent(Level.ERROR, marker, format, new Object[] { arg }, null);
-
- }
-
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent(Level.ERROR, marker, format, arg1, arg2);
- }
-
- public void error(Marker marker, String format, Object... arguments) {
- recordEvent(Level.ERROR, marker, format, arguments, null);
- }
-
- public void error(Marker marker, String msg, Throwable t) {
- recordEvent(Level.ERROR, marker, msg, null, t);
- }
-
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
index f2602066..09a55f44 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
@@ -153,10 +153,10 @@ final public class MessageFormatter {
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray) {
- Throwable throwableCandidate = Util.getThrowableCandidate(argArray);
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(argArray);
Object[] args = argArray;
if (throwableCandidate != null) {
- args = Util.trimmedCopy(argArray);
+ args = MessageFormatter.trimmedCopy(argArray);
}
return arrayFormat(messagePattern, args, throwableCandidate);
}
@@ -389,4 +389,49 @@ final public class MessageFormatter {
sbuf.append(']');
}
+ /**
+ * Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
+ *
+ * @param argArray
+ * The arguments off which we want to know if it contains a {@link Throwable} as last element
+ * @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
+ * otherwise it returns null
+ */
+ public static Throwable getThrowableCandidate(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ return null;
+ }
+
+ final Object lastEntry = argArray[argArray.length - 1];
+ if (lastEntry instanceof Throwable) {
+ return (Throwable) lastEntry;
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method to get all but the last element of an array
+ *
+ * @param argArray
+ * The arguments from which we want to remove the last element
+ *
+ * @return a copy of the array without the last element
+ */
+ public static Object[] trimmedCopy(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ throw new IllegalStateException("non-sensical empty or null argument array");
+ }
+
+ final int trimmedLen = argArray.length - 1;
+
+ Object[] trimmed = new Object[trimmedLen];
+
+ if (trimmedLen > 0) {
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+ }
+
+ return trimmed;
+ }
+
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
index ab92f326..112b46df 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/Util.java
@@ -128,49 +128,4 @@ public final class Util {
System.err.println("SLF4J: " + msg);
}
- /**
- * Helper method to determine if an {@link Object} array contains a {@link Throwable} as last element
- *
- * @param argArray
- * The arguments off which we want to know if it contains a {@link Throwable} as last element
- * @return if the last {@link Object} in argArray is a {@link Throwable} this method will return it,
- * otherwise it returns null
- */
- public static Throwable getThrowableCandidate(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- return null;
- }
-
- final Object lastEntry = argArray[argArray.length - 1];
- if (lastEntry instanceof Throwable) {
- return (Throwable) lastEntry;
- }
-
- return null;
- }
-
- /**
- * Helper method to get all but the last element of an array
- *
- * @param argArray
- * The arguments from which we want to remove the last element
- *
- * @return a copy of the array without the last element
- */
- public static Object[] trimmedCopy(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- throw new IllegalStateException("non-sensical empty or null argument array");
- }
-
- final int trimmedLen = argArray.length - 1;
-
- Object[] trimmed = new Object[trimmedLen];
-
- if (trimmedLen > 0) {
- System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
- }
-
- return trimmed;
- }
-
}
From 78c10ee651d0c8317971982cbcfdf963aabc8285 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 13 Aug 2019 17:30:17 +0200
Subject: [PATCH 029/121] refactored EventRecodingLogger and
EventRecodingLoggerTest
---
.../org/slf4j/event/EventRecodingLogger.java | 530 ++++---
.../slf4j/event/EventRecodingLoggerTest.java | 1290 +++++++----------
2 files changed, 769 insertions(+), 1051 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index e11adce4..c515034e 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -9,8 +9,8 @@ import org.slf4j.helpers.SubstituteLogger;
/**
*
- * This class is used to record events during the initialization phase of
- * the underlying logging framework. It is called by {@link SubstituteLogger}.
+ * This class is used to record events during the initialization phase of the
+ * underlying logging framework. It is called by {@link SubstituteLogger}.
*
*
* @author Ceki Gülcü
@@ -19,315 +19,305 @@ import org.slf4j.helpers.SubstituteLogger;
*/
public class EventRecodingLogger implements Logger {
- String name;
- SubstituteLogger logger;
- Queue eventQueue;
+ String name;
+ SubstituteLogger logger;
+ Queue eventQueue;
+
+ // as an event recording logger we have no choice but to record all events
+ final static boolean RECORD_ALL_EVENTS = true;
- // as an event recording logger we have no choice but to record all events
- final static boolean RECORD_ALL_EVENTS = true;
-
- public EventRecodingLogger(SubstituteLogger logger, Queue eventQueue) {
- this.logger = logger;
- this.name = logger.getName();
- this.eventQueue = eventQueue;
- }
+ public EventRecodingLogger(SubstituteLogger logger, Queue eventQueue) {
+ this.logger = logger;
+ this.name = logger.getName();
+ this.eventQueue = eventQueue;
+ }
- public String getName() {
- return name;
- }
+ public String getName() {
+ return name;
+ }
- public boolean isTraceEnabled() {
- return RECORD_ALL_EVENTS;
- }
+ public boolean isTraceEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
- public void trace(String msg) {
- recordEventwithoutMarkerArgArray(Level.TRACE, msg, null, null);
- }
+ public void trace(String msg) {
+ recordEvent_0Args(Level.TRACE, null, msg, null);
+ }
- public void trace(String format, Object arg) {
- recordEventwithoutMarkerArgArray(Level.TRACE, format, new Object[] { arg }, null);
- }
+ public void trace(String format, Object arg) {
+ recordEvent_1Args(Level.TRACE, null, format, arg);
+ }
- public void trace(String format, Object arg1, Object arg2) {
- recordEventWithoutMarker2Args(Level.TRACE, format, arg1, arg2);
- }
+ public void trace(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.TRACE, null, format, arg1, arg2);
+ }
- public void trace(String format, Object... arguments) {
- recordEventwithoutMarkerArgArray(Level.TRACE, format, arguments, null);
- }
+ public void trace(String format, Object... arguments) {
+ recordEventArgArray(Level.TRACE, null, format, arguments);
+ }
- public void trace(String msg, Throwable t) {
- recordEventwithoutMarkerArgArray(Level.TRACE, msg, null, t);
- }
+ public void trace(String msg, Throwable t) {
+ recordEvent_0Args(Level.TRACE, null, msg, t);
+ }
- public boolean isTraceEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
+ public boolean isTraceEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
- public void trace(Marker marker, String msg) {
- recordEvent(Level.TRACE, marker, msg, null, null);
+ public void trace(Marker marker, String msg) {
+ recordEvent_0Args(Level.TRACE, marker, msg, null);
+ }
- }
+ public void trace(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.TRACE, marker, format, arg);
+ }
- public void trace(Marker marker, String format, Object arg) {
- recordEvent(Level.TRACE, marker, format, new Object[] { arg }, null);
- }
+ public void trace(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.TRACE, marker, format, arg1, arg2);
+ }
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.TRACE, marker, format, arg1, arg2);
- }
+ public void trace(Marker marker, String format, Object... argArray) {
+ recordEventArgArray(Level.TRACE, marker, format, argArray);
+ }
- public void trace(Marker marker, String format, Object... argArray) {
- recordEvent(Level.TRACE, marker, format, argArray, null);
+ public void trace(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.TRACE, marker, msg, t);
+ }
- }
+ public boolean isDebugEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
- public void trace(Marker marker, String msg, Throwable t) {
- recordEvent(Level.TRACE, marker, msg, null, t);
- }
+ public void debug(String msg) {
+ recordEvent_0Args(Level.DEBUG, null, msg, null);
+ }
- public boolean isDebugEnabled() {
- return RECORD_ALL_EVENTS;
- }
+ public void debug(String format, Object arg) {
+ recordEvent_1Args(Level.DEBUG, null, format, arg);
+ }
- public void debug(String msg) {
- recordEventwithoutMarkerArgArray(Level.DEBUG, msg, null, null);
- }
+ public void debug(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.DEBUG, null, format, arg1, arg2);
+ }
- public void debug(String format, Object arg) {
- recordEventwithoutMarkerArgArray(Level.DEBUG, format, new Object[] { arg }, null);
+ public void debug(String format, Object... arguments) {
+ recordEventArgArray(Level.DEBUG, null, format, arguments);
+ }
- }
+ public void debug(String msg, Throwable t) {
+ recordEvent_0Args(Level.DEBUG, null, msg, t);
+ }
- public void debug(String format, Object arg1, Object arg2) {
- recordEventWithoutMarker2Args(Level.DEBUG, format, arg1, arg2);
- }
+ public boolean isDebugEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
- public void debug(String format, Object... arguments) {
- recordEventwithoutMarkerArgArray(Level.DEBUG, format, arguments, null);
- }
+ public void debug(Marker marker, String msg) {
+ recordEvent_0Args(Level.DEBUG, marker, msg, null);
+ }
- public void debug(String msg, Throwable t) {
- recordEventwithoutMarkerArgArray(Level.DEBUG, msg, null, t);
- }
+ public void debug(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.DEBUG, marker, format, arg);
+ }
- public boolean isDebugEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
+ public void debug(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.DEBUG, marker, format, arg1, arg2);
+ }
- public void debug(Marker marker, String msg) {
- recordEvent(Level.DEBUG, marker, msg, null, null);
- }
+ public void debug(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.DEBUG, marker, format, arguments);
+ }
- public void debug(Marker marker, String format, Object arg) {
- recordEvent(Level.DEBUG, marker, format, new Object[] { arg }, null);
- }
+ public void debug(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.DEBUG, marker, msg, t);
+ }
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.DEBUG, marker, format, arg1, arg2);
- }
+ public boolean isInfoEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
- public void debug(Marker marker, String format, Object... arguments) {
- recordEvent(Level.DEBUG, marker, format, arguments, null);
- }
+ public void info(String msg) {
+ recordEvent_0Args(Level.INFO, null, msg, null);
+ }
- public void debug(Marker marker, String msg, Throwable t) {
- recordEvent(Level.DEBUG, marker, msg, null, t);
- }
+ public void info(String format, Object arg) {
+ recordEvent_1Args(Level.INFO, null, format, arg);
+ }
- public boolean isInfoEnabled() {
- return RECORD_ALL_EVENTS;
- }
+ public void info(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.INFO, null, format, arg1, arg2);
+ }
- public void info(String msg) {
- recordEventwithoutMarkerArgArray(Level.INFO, msg, null, null);
- }
+ public void info(String format, Object... arguments) {
+ recordEventArgArray(Level.INFO, null, format, arguments);
+ }
- public void info(String format, Object arg) {
- recordEventwithoutMarkerArgArray(Level.INFO, format, new Object[] { arg }, null);
- }
+ public void info(String msg, Throwable t) {
+ recordEvent_0Args(Level.INFO, null, msg, t);
+ }
- public void info(String format, Object arg1, Object arg2) {
- recordEventWithoutMarker2Args(Level.INFO, format, arg1, arg2);
- }
+ public boolean isInfoEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
- public void info(String format, Object... arguments) {
- recordEventwithoutMarkerArgArray(Level.INFO, format, arguments, null);
- }
+ public void info(Marker marker, String msg) {
+ recordEvent_0Args(Level.INFO, marker, msg, null);
+ }
- public void info(String msg, Throwable t) {
- recordEventwithoutMarkerArgArray(Level.INFO, msg, null, t);
- }
+ public void info(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.INFO, marker, format, arg);
+ }
- public boolean isInfoEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
+ public void info(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.INFO, marker, format, arg1, arg2);
+ }
- public void info(Marker marker, String msg) {
- recordEvent(Level.INFO, marker, msg, null, null);
- }
+ public void info(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.INFO, marker, format, arguments);
+ }
- public void info(Marker marker, String format, Object arg) {
- recordEvent(Level.INFO, marker, format, new Object[] { arg }, null);
- }
+ public void info(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.INFO, marker, msg, t);
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.INFO, marker, format, arg1, arg2);
- }
+ }
- public void info(Marker marker, String format, Object... arguments) {
- recordEvent(Level.INFO, marker, format, arguments, null);
- }
+ public boolean isWarnEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
- public void info(Marker marker, String msg, Throwable t) {
- recordEvent(Level.INFO, marker, msg, null, t);
+ public void warn(String msg) {
+ recordEvent_0Args(Level.WARN, null, msg, null);
+ }
- }
+ public void warn(String format, Object arg) {
+ recordEvent_1Args(Level.WARN, null, format, arg);
+ }
- public boolean isWarnEnabled() {
- return RECORD_ALL_EVENTS;
- }
-
- public void warn(String msg) {
- recordEventwithoutMarkerArgArray(Level.WARN, msg, null, null);
- }
-
- public void warn(String format, Object arg) {
- recordEventwithoutMarkerArgArray(Level.WARN, format, new Object[] { arg }, null);
-
- }
-
- public void warn(String format, Object arg1, Object arg2) {
- recordEventWithoutMarker2Args(Level.WARN, format, arg1, arg2);
- }
-
- public void warn(String format, Object... arguments) {
- recordEventwithoutMarkerArgArray(Level.WARN, format, arguments, null);
- }
-
- public void warn(String msg, Throwable t) {
- recordEventwithoutMarkerArgArray(Level.WARN, msg, null, t);
- }
-
- public boolean isWarnEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
- public void warn(Marker marker, String msg) {
- recordEvent(Level.WARN, marker, msg, null, null);
- }
-
- public void warn(Marker marker, String format, Object arg) {
- recordEvent(Level.WARN, marker, format, new Object[] { arg }, null);
- }
-
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.WARN, marker, format, arg1, arg2);
- }
-
- public void warn(Marker marker, String format, Object... arguments) {
- recordEvent(Level.WARN, marker, format, arguments, null);
- }
-
- public void warn(Marker marker, String msg, Throwable t) {
- recordEvent(Level.WARN, marker, msg, null, t);
- }
-
- public boolean isErrorEnabled() {
- return RECORD_ALL_EVENTS;
- }
-
- public void error(String msg) {
- recordEventwithoutMarkerArgArray(Level.ERROR, msg, null, null);
- }
-
- public void error(String format, Object arg) {
- recordEventwithoutMarkerArgArray(Level.ERROR, format, new Object[] { arg }, null);
-
- }
-
- public void error(String format, Object arg1, Object arg2) {
- recordEventWithoutMarker2Args(Level.ERROR, format, arg1, arg2);
-
- }
-
- public void error(String format, Object... arguments) {
- recordEventwithoutMarkerArgArray(Level.ERROR, format, arguments, null);
-
- }
-
- public void error(String msg, Throwable t) {
- recordEventwithoutMarkerArgArray(Level.ERROR, msg, null, t);
- }
-
- public boolean isErrorEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
- public void error(Marker marker, String msg) {
- recordEvent(Level.ERROR, marker, msg, null, null);
-
- }
-
- public void error(Marker marker, String format, Object arg) {
- recordEvent(Level.ERROR, marker, format, new Object[] { arg }, null);
-
- }
-
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.ERROR, marker, format, arg1, arg2);
- }
-
- public void error(Marker marker, String format, Object... arguments) {
- recordEvent(Level.ERROR, marker, format, arguments, null);
- }
-
- public void error(Marker marker, String msg, Throwable t) {
- recordEvent(Level.ERROR, marker, msg, null, t);
- }
-
- private void recordEventWithoutMarker2Args(Level level, String msg, Object arg1, Object arg2) {
- recordEvent2Args(level, null, msg, arg1, arg2);
- }
-
- private void recordEvent2Args(Level level, Marker marker, String msg, Object arg1, Object arg2) {
- if (arg2 instanceof Throwable) {
- recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
- } else {
- recordEvent(level, marker, msg, new Object[] { arg1, arg2 }, null);
- }
- }
-
- private void recordEventwithoutMarkerArgArray(Level level, String msg, Object[] args, Throwable throwable) {
- recordEvent(level, null, msg, args, throwable);
- }
-
- private void recordEvent(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
- // System.out.println("recording logger:"+name+", msg:"+msg);
- SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
- loggingEvent.setTimeStamp(System.currentTimeMillis());
- loggingEvent.setLevel(level);
- loggingEvent.setLogger(logger);
- loggingEvent.setLoggerName(name);
- loggingEvent.addMarker(marker);
- loggingEvent.setMessage(msg);
- loggingEvent.setThreadName(Thread.currentThread().getName());
-
- // 1 and 2 args are covered by other methods
- if (throwable == null && args != null && args.length > 2) {
- Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
- if(throwableCandidate != null) {
- loggingEvent.setArgumentArray(MessageFormatter.trimmedCopy(args));
- loggingEvent.setThrowable(throwableCandidate);
- } else {
- loggingEvent.setArgumentArray(args);
- loggingEvent.setThrowable(null);
- }
- } else {
- loggingEvent.setArgumentArray(args);
- loggingEvent.setThrowable(throwable);
- }
-
- eventQueue.add(loggingEvent);
- }
+ public void warn(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.WARN, null, format, arg1, arg2);
+ }
+
+ public void warn(String format, Object... arguments) {
+ recordEventArgArray(Level.WARN, null, format, arguments);
+ }
+
+ public void warn(String msg, Throwable t) {
+ recordEvent_0Args(Level.WARN, null, msg, t);
+ }
+
+ public boolean isWarnEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void warn(Marker marker, String msg) {
+ recordEvent_0Args(Level.WARN, marker, msg, null);
+ }
+
+ public void warn(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.WARN, marker, format, arg);
+ }
+
+ public void warn(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.WARN, marker, format, arg1, arg2);
+ }
+
+ public void warn(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.WARN, marker, format, arguments);
+ }
+
+ public void warn(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.ERROR, marker, msg, t);
+ }
+
+ public boolean isErrorEnabled() {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(String msg) {
+ recordEvent_0Args(Level.ERROR, null, msg, null);
+ }
+
+ public void error(String format, Object arg) {
+ recordEvent_1Args(Level.ERROR, null, format, arg);
+ }
+
+ public void error(String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.ERROR, null, format, arg1, arg2);
+ }
+
+ public void error(String format, Object... arguments) {
+ recordEventArgArray(Level.ERROR, null, format, arguments);
+ }
+
+ public void error(String msg, Throwable t) {
+ recordEvent_0Args(Level.ERROR, null, msg, t);
+ }
+
+ public boolean isErrorEnabled(Marker marker) {
+ return RECORD_ALL_EVENTS;
+ }
+
+ public void error(Marker marker, String msg) {
+ recordEvent_0Args(Level.ERROR, marker, msg, null);
+ }
+
+ public void error(Marker marker, String format, Object arg) {
+ recordEvent_1Args(Level.ERROR, marker, format, arg);
+ }
+
+ public void error(Marker marker, String format, Object arg1, Object arg2) {
+ recordEvent2Args(Level.ERROR, marker, format, arg1, arg2);
+ }
+
+ public void error(Marker marker, String format, Object... arguments) {
+ recordEventArgArray(Level.ERROR, marker, format, arguments);
+ }
+
+ public void error(Marker marker, String msg, Throwable t) {
+ recordEvent_0Args(Level.ERROR, marker, msg, t);
+ }
+
+ private void recordEvent_0Args(Level level, Marker marker, String msg, Throwable t) {
+ recordEvent(level, marker, msg, null, t);
+ }
+
+ private void recordEvent_1Args(Level level, Marker marker, String msg, Object arg1) {
+ recordEvent(level, marker, msg, new Object[] { arg1 }, null);
+ }
+
+ private void recordEvent2Args(Level level, Marker marker, String msg, Object arg1, Object arg2) {
+ if (arg2 instanceof Throwable) {
+ recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
+ } else {
+ recordEvent(level, marker, msg, new Object[] { arg1, arg2 }, null);
+ }
+ }
+
+ private void recordEventArgArray(Level level, Marker marker, String msg, Object[] args) {
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
+ if (throwableCandidate != null) {
+ Object[] trimmedCopy = MessageFormatter.trimmedCopy(args);
+ recordEvent(level, marker, msg, trimmedCopy, throwableCandidate);
+ } else {
+ recordEvent(level, marker, msg, args, null);
+ }
+ }
+
+
+ // WARNING: this method assumes that any throwable is priperly extracted
+ private void recordEvent(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
+ SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
+ loggingEvent.setTimeStamp(System.currentTimeMillis());
+ loggingEvent.setLevel(level);
+ loggingEvent.setLogger(logger);
+ loggingEvent.setLoggerName(name);
+ loggingEvent.addMarker(marker);
+ loggingEvent.setMessage(msg);
+ loggingEvent.setThreadName(Thread.currentThread().getName());
+
+ loggingEvent.setArgumentArray(args);
+ loggingEvent.setThrowable(throwable);
+
+ eventQueue.add(loggingEvent);
+ }
}
diff --git a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
index 68abff0e..e0cd6b04 100644
--- a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
@@ -13,785 +13,513 @@ import java.util.concurrent.LinkedBlockingQueue;
import static org.junit.Assert.*;
public class EventRecodingLoggerTest {
- private Queue queue;
- private EventRecodingLogger logger;
- private String message;
- private Object param1;
- private Object param2;
- private Object param3;
- private Object[] oneParam;
- private Object[] twoParams;
- private Object[] threeParams;
- private Throwable exception;
- private Marker marker;
-
- @Before
- public void setUp() {
- queue = new LinkedBlockingQueue<>();
- logger = new EventRecodingLogger(new SubstituteLogger("testLogger", queue, true), queue);
- message = "Test message with 3 parameters {} {} {} {}";
- param1 = 1;
- param2 = 2;
- param3 = 3;
- oneParam = new Object[] { param1 };
- twoParams = new Object[] { param1, param2 };
- threeParams = new Object[] { param1, param2, param3 };
- exception = new IllegalStateException("We just need an exception");
- marker = new BasicMarkerFactory().getMarker("testMarker");
- }
-
- @After
- public void tearDown() {
- assertTrue(queue.isEmpty());
- }
-
- @Test
- public void traceMessage() {
- logger.trace(message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, null, null);
- }
-
- @Test
- public void traceMessageOneParameter() {
- logger.trace(message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, oneParam, null);
- }
-
- @Test
- public void traceMessageTwoParameters() {
- logger.trace(message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, twoParams, null);
- }
-
- @Test
- public void traceMessageThreeParameters() {
- logger.trace(message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, threeParams, null);
- }
-
- @Test
- public void traceMessageThrowable() {
- logger.trace(message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, null, exception);
- }
-
- @Test
- public void traceMessageOneParameterThrowable() {
- logger.trace(message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, oneParam, exception);
- }
-
- @Test
- public void traceMessageTwoParametersThrowable() {
- logger.trace(message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, twoParams, exception);
- }
-
- @Test
- public void traceMessageThreeParametersThrowable() {
- logger.trace(message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, threeParams, exception);
- }
-
- @Test
- public void traceMarkerMessage() {
- logger.trace(marker, message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, null, null);
- }
-
- @Test
- public void traceMarkerMessageOneParameter() {
- logger.trace(marker, message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, oneParam, null);
- }
-
- @Test
- public void traceMarkerMessageTwoParameters() {
- logger.trace(marker, message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, twoParams, null);
- }
-
- @Test
- public void traceMarkerMessageThreeParameters() {
- logger.trace(marker, message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, threeParams, null);
- }
-
- @Test
- public void traceMarkerMessageThrowable() {
- logger.trace(marker, message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, null, exception);
- }
-
- @Test
- public void traceMarkerMessageOneParameterThrowable() {
- logger.trace(marker, message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, oneParam, exception);
- }
-
- @Test
- public void traceMarkerMessageTwoParametersThrowable() {
- logger.trace(marker, message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, twoParams, exception);
- }
-
- @Test
- public void traceMarkerMessageThreeParametersThrowable() {
- logger.trace(marker, message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.TRACE, marker, threeParams, exception);
- }
-
- @Test
- public void debugMessage() {
- logger.debug(message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, null, null);
- }
-
- @Test
- public void debugMessageOneParameter() {
- logger.debug(message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, oneParam, null);
- }
-
- @Test
- public void debugMessageTwoParameters() {
- logger.debug(message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, twoParams, null);
- }
-
- @Test
- public void debugMessageThreeParameters() {
- logger.debug(message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, threeParams, null);
- }
-
- @Test
- public void debugMessageThrowable() {
- logger.debug(message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, null, exception);
- }
-
- @Test
- public void debugMessageOneParameterThrowable() {
- logger.debug(message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, oneParam, exception);
- }
-
- @Test
- public void debugMessageTwoParametersThrowable() {
- logger.debug(message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, twoParams, exception);
- }
-
- @Test
- public void debugMessageThreeParametersThrowable() {
- logger.debug(message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, threeParams, exception);
- }
-
- @Test
- public void debugMarkerMessage() {
- logger.debug(marker, message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, null, null);
- }
-
- @Test
- public void debugMarkerMessageOneParameter() {
- logger.debug(marker, message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, oneParam, null);
- }
-
- @Test
- public void debugMarkerMessageTwoParameters() {
- logger.debug(marker, message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, twoParams, null);
- }
-
- @Test
- public void debugMarkerMessageThreeParameters() {
- logger.debug(marker, message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, threeParams, null);
- }
-
- @Test
- public void debugMarkerMessageThrowable() {
- logger.debug(marker, message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, null, exception);
- }
-
- @Test
- public void debugMarkerMessageOneParameterThrowable() {
- logger.debug(marker, message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, oneParam, exception);
- }
-
- @Test
- public void debugMarkerMessageTwoParametersThrowable() {
- logger.debug(marker, message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, twoParams, exception);
- }
-
- @Test
- public void debugMarkerMessageThreeParametersThrowable() {
- logger.debug(marker, message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.DEBUG, marker, threeParams, exception);
- }
-
- @Test
- public void infoMessage() {
- logger.info(message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, null, null);
- }
-
- @Test
- public void infoMessageOneParameter() {
- logger.info(message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, oneParam, null);
- }
-
- @Test
- public void infoMessageTwoParameters() {
- logger.info(message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, twoParams, null);
- }
-
- @Test
- public void infoMessageThreeParameters() {
- logger.info(message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, threeParams, null);
- }
-
- @Test
- public void infoMessageThrowable() {
- logger.info(message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, null, exception);
- }
-
- @Test
- public void infoMessageOneParameterThrowable() {
- logger.info(message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, oneParam, exception);
- }
-
- @Test
- public void infoMessageTwoParametersThrowable() {
- logger.info(message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, twoParams, exception);
- }
-
- @Test
- public void infoMessageThreeParametersThrowable() {
- logger.info(message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, threeParams, exception);
- }
-
- @Test
- public void infoMarkerMessage() {
- logger.info(marker, message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, null, null);
- }
-
- @Test
- public void infoMarkerMessageOneParameter() {
- logger.info(marker, message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, oneParam, null);
- }
-
- @Test
- public void infoMarkerMessageTwoParameters() {
- logger.info(marker, message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, twoParams, null);
- }
-
- @Test
- public void infoMarkerMessageThreeParameters() {
- logger.info(marker, message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, threeParams, null);
- }
-
- @Test
- public void infoMarkerMessageThrowable() {
- logger.info(marker, message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, null, exception);
- }
-
- @Test
- public void infoMarkerMessageOneParameterThrowable() {
- logger.info(marker, message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, oneParam, exception);
- }
-
- @Test
- public void infoMarkerMessageTwoParametersThrowable() {
- logger.info(marker, message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, twoParams, exception);
- }
-
- @Test
- public void infoMarkerMessageThreeParametersThrowable() {
- logger.info(marker, message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.INFO, marker, threeParams, exception);
- }
-
- @Test
- public void warnMessage() {
- logger.warn(message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, null, null);
- }
-
- @Test
- public void warnMessageOneParameter() {
- logger.warn(message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, oneParam, null);
- }
-
- @Test
- public void warnMessageTwoParameters() {
- logger.warn(message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, twoParams, null);
- }
-
- @Test
- public void warnMessageThreeParameters() {
- logger.warn(message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, threeParams, null);
- }
-
- @Test
- public void warnMessageThrowable() {
- logger.warn(message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, null, exception);
- }
-
- @Test
- public void warnMessageOneParameterThrowable() {
- logger.warn(message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, oneParam, exception);
- }
-
- @Test
- public void warnMessageTwoParametersThrowable() {
- logger.warn(message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, twoParams, exception);
- }
-
- @Test
- public void warnMessageThreeParametersThrowable() {
- logger.warn(message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, threeParams, exception);
- }
-
- @Test
- public void warnMarkerMessage() {
- logger.warn(marker, message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, null, null);
- }
-
- @Test
- public void warnMarkerMessageOneParameter() {
- logger.warn(marker, message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, oneParam, null);
- }
-
- @Test
- public void warnMarkerMessageTwoParameters() {
- logger.warn(marker, message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, twoParams, null);
- }
-
- @Test
- public void warnMarkerMessageThreeParameters() {
- logger.warn(marker, message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, threeParams, null);
- }
-
- @Test
- public void warnMarkerMessageThrowable() {
- logger.warn(marker, message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, null, exception);
- }
-
- @Test
- public void warnMarkerMessageOneParameterThrowable() {
- logger.warn(marker, message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, oneParam, exception);
- }
-
- @Test
- public void warnMarkerMessageTwoParametersThrowable() {
- logger.warn(marker, message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, twoParams, exception);
- }
-
- @Test
- public void warnMarkerMessageThreeParametersThrowable() {
- logger.warn(marker, message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.WARN, marker, threeParams, exception);
- }
-
- @Test
- public void errorMessage() {
- logger.error(message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, null, null);
- }
-
- @Test
- public void errorMessageOneParameter() {
- logger.error(message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, oneParam, null);
- }
-
- @Test
- public void errorMessageTwoParameters() {
- logger.error(message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, twoParams, null);
- }
-
- @Test
- public void errorMessageThreeParameters() {
- logger.error(message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, threeParams, null);
- }
-
- @Test
- public void errorMessageThrowable() {
- logger.error(message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, null, exception);
- }
-
- @Test
- public void errorMessageOneParameterThrowable() {
- logger.error(message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, oneParam, exception);
- }
-
- @Test
- public void errorMessageTwoParametersThrowable() {
- logger.error(message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, twoParams, exception);
- }
-
- @Test
- public void errorMessageThreeParametersThrowable() {
- logger.error(message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, threeParams, exception);
- }
-
- @Test
- public void errorMarkerMessage() {
- logger.error(marker, message);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, null, null);
- }
-
- @Test
- public void errorMarkerMessageOneParameter() {
- logger.error(marker, message, param1);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, oneParam, null);
- }
-
- @Test
- public void errorMarkerMessageTwoParameters() {
- logger.error(marker, message, param1, param2);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, twoParams, null);
- }
-
- @Test
- public void errorMarkerMessageThreeParameters() {
- logger.error(marker, message, param1, param2, param3);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, threeParams, null);
- }
-
- @Test
- public void errorMarkerMessageThrowable() {
- logger.error(marker, message, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, null, exception);
- }
-
- @Test
- public void errorMarkerMessageOneParameterThrowable() {
- logger.error(marker, message, param1, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, oneParam, exception);
- }
-
- @Test
- public void errorMarkerMessageTwoParametersThrowable() {
- logger.error(marker, message, param1, param2, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, twoParams, exception);
- }
-
- @Test
- public void errorMarkerMessageThreeParametersThrowable() {
- logger.error(marker, message, param1, param2, param3, exception);
-
- SubstituteLoggingEvent event = queue.poll();
-
- verifyMessage(event, Level.ERROR, marker, threeParams, exception);
- }
-
- private void verifyMessage(SubstituteLoggingEvent event, Level level, Object[] arguments, Throwable exception) {
- verifyMessage(event, level, null, arguments, exception);
- }
-
- private void verifyMessage(SubstituteLoggingEvent event, Level level, Marker marker, Object[] arguments, Throwable exception) {
- assertNotNull(event);
-
- if (marker == null) {
- assertNull(event.getMarkers().get(0));
- } else {
- assertEquals(marker, event.getMarkers().get(0));
- }
-
- assertEquals(message, event.getMessage());
-
- if (arguments == null) {
- assertNull(event.getArgumentArray());
- } else {
- assertArrayEquals(arguments, event.getArgumentArray());
- }
-
- assertEquals(level, event.getLevel());
-
- if (exception == null) {
- assertNull(event.getThrowable());
- } else {
- assertEquals(exception, event.getThrowable());
- }
- }
+ private Queue queue;
+ private EventRecodingLogger logger;
+ private String message;
+ private Object param1;
+ private Object param2;
+ private Object param3;
+ private Object[] oneParam;
+ private Object[] twoParams;
+ private Object[] threeParams;
+ private Throwable exception;
+ private Marker marker;
+
+ @Before
+ public void setUp() {
+ queue = new LinkedBlockingQueue<>();
+ logger = new EventRecodingLogger(new SubstituteLogger("testLogger", queue, true), queue);
+ message = "Test message with 3 parameters {} {} {} {}";
+ param1 = 1;
+ param2 = 2;
+ param3 = 3;
+ oneParam = new Object[] { param1 };
+ twoParams = new Object[] { param1, param2 };
+ threeParams = new Object[] { param1, param2, param3 };
+ exception = new IllegalStateException("We just need an exception");
+ marker = new BasicMarkerFactory().getMarker("testMarker");
+ }
+
+ @After
+ public void tearDown() {
+ assertTrue(queue.isEmpty());
+ }
+
+ @Test
+ public void singleMessage() {
+ for (Level level : Level.values()) {
+ singleMessageCheck(level);
+ }
+ }
+
+ private void singleMessageCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message);
+ break;
+ case DEBUG:
+ logger.debug(message);
+ break;
+ case INFO:
+ logger.info(message);
+ break;
+ case WARN:
+ logger.warn(message);
+ break;
+ case ERROR:
+ logger.error(message);
+ break;
+ }
+ verifyMessageWithoutMarker(level, null, null);
+ }
+
+ @Test
+ public void oneParameter() {
+ for (Level level : Level.values()) {
+ oneParameterCheck(level);
+ }
+ }
+ private void oneParameterCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1);
+ break;
+ case DEBUG:
+ logger.debug(message, param1);
+ break;
+ case INFO:
+ logger.info(message, param1);
+ break;
+ case WARN:
+ logger.warn(message, param1);
+ break;
+ case ERROR:
+ logger.error(message, param1);
+ break;
+ }
+ verifyMessageWithoutMarker(level, oneParam, null);
+ }
+
+ @Test
+ public void messageTwoParameters() {
+ for (Level level : Level.values()) {
+ messageTwoParametersCheck(level);
+ }
+ }
+
+ private void messageTwoParametersCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2);
+ break;
+ case INFO:
+ logger.info(message, param1, param2);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2);
+ break;
+ }
+ verifyMessageWithoutMarker(level, twoParams, null);
+ }
+
+ @Test
+ public void traceMessageThreeParameters() {
+ for (Level level : Level.values()) {
+ threeParameterCheck(level);
+ }
+ }
+
+ private void threeParameterCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, param3);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, param3);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, param3);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, param3);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, param3);
+ break;
+ }
+ verifyMessageWithoutMarker(level, threeParams, null);
+ }
+
+ @Test
+ public void testMessageThrowable() {
+ for (Level level : Level.values()) {
+ throwableCheck(level);
+ }
+ }
+
+ private void throwableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, exception);
+ break;
+ case INFO:
+ logger.info(message, exception);
+ break;
+ case WARN:
+ logger.warn(message, exception);
+ break;
+ case ERROR:
+ logger.error(message, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, null, exception);
+ }
+
+ @Test
+ public void traceMessageOneParameterThrowable() {
+ for (Level level : Level.values()) {
+ oneParamThrowableCheck(level);
+ }
+ }
+
+ private void oneParamThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, oneParam, exception);
+ }
+
+ @Test
+ public void traceMessageTwoParametersThrowable() {
+ for (Level level : Level.values()) {
+ twoParamThrowableCheck(level);
+ }
+ }
+
+ private void twoParamThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, twoParams, exception);
+ }
+
+ @Test
+ public void testMessageThreeParametersThrowable() {
+ for (Level level : Level.values()) {
+ messageWith3ArgsPlusException(level);
+ }
+ }
+
+ private void messageWith3ArgsPlusException(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(message, param1, param2, param3, exception);
+ break;
+ case DEBUG:
+ logger.debug(message, param1, param2, param3, exception);
+ break;
+ case INFO:
+ logger.info(message, param1, param2, param3, exception);
+ break;
+ case WARN:
+ logger.warn(message, param1, param2, param3, exception);
+ break;
+ case ERROR:
+ logger.error(message, param1, param2, param3, exception);
+ break;
+ }
+ verifyMessageWithoutMarker(level, threeParams, exception);
+ }
+
+ @Test
+ public void markerMessage() {
+ for (Level level : Level.values()) {
+ markerMessageCheck(level);
+ }
+ }
+ private void markerMessageCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message);
+ break;
+ case DEBUG:
+ logger.debug(marker, message);
+ break;
+ case INFO:
+ logger.info(marker, message);
+ break;
+ case WARN:
+ logger.warn(marker, message);
+ break;
+ case ERROR:
+ logger.error(marker, message);
+ break;
+ }
+ verifyMessage(level, marker, null, null);
+ }
+
+ @Test
+ public void markerMessageOneParameter() {
+ for (Level level : Level.values()) {
+ markerMessageOneParameter(level);
+ }
+ }
+ private void markerMessageOneParameter(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1);
+ break;
+ case INFO:
+ logger.info(marker, message, param1);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1);
+ break;
+ }
+ verifyMessage(level, marker, oneParam, null);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParameters() {
+ for (Level level : Level.values()) {
+ markerMessageTwoParameters(level);
+ }
+ }
+
+ private void markerMessageTwoParameters(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2);
+ break;
+ }
+ verifyMessage(level, marker, twoParams, null);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParameters() {
+ for (Level level : Level.values()) {
+ markerMessageThreeParameters(level);
+ }
+ }
+
+ private void markerMessageThreeParameters(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, param3);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, param3);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, param3);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, param3);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, param3);
+ break;
+ }
+ verifyMessage(level, marker, threeParams, null);
+ }
+
+ @Test
+ public void markerMessageThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageThrowable(level);
+ }
+ }
+
+ private void markerMessageThrowable(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, exception);
+ break;
+ }
+ verifyMessage(level, marker, null, exception);
+ }
+
+ @Test
+ public void markerMessageOneParameterThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageOneParameterThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageOneParameterThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, exception);
+ break;
+ }
+ verifyMessage(level, marker, oneParam, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageTwoParametersThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageTwoParametersThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageTwoParametersThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, exception);
+ break;
+ }
+ verifyMessage(level, marker, twoParams, exception);
+ }
+
+ @Test
+ public void traceMarkerMessageThreeParametersThrowable() {
+ for (Level level : Level.values()) {
+ markerMessageThreeParametersThrowableCheck(level);
+ }
+ }
+
+ private void markerMessageThreeParametersThrowableCheck(Level level) {
+ switch (level) {
+ case TRACE:
+ logger.trace(marker, message, param1, param2, param3, exception);
+ break;
+ case DEBUG:
+ logger.debug(marker, message, param1, param2, param3, exception);
+ break;
+ case INFO:
+ logger.info(marker, message, param1, param2, param3, exception);
+ break;
+ case WARN:
+ logger.warn(marker, message, param1, param2, param3, exception);
+ break;
+ case ERROR:
+ logger.error(marker, message, param1, param2, param3, exception);
+ break;
+ }
+ verifyMessage(level, marker, threeParams, exception);
+ }
+
+ private void verifyMessageWithoutMarker(Level level, Object[] arguments, Throwable exception) {
+ verifyMessage(level, null, arguments, exception);
+ }
+
+ private void verifyMessage(Level level, Marker marker, Object[] arguments, Throwable exception) {
+
+ assertEquals("missing event: ", 1, queue.size());
+ SubstituteLoggingEvent event = queue.poll();
+ assertNotNull(event);
+
+ if (marker == null) {
+ assertNull(event.getMarkers().get(0));
+ } else {
+ assertEquals(marker, event.getMarkers().get(0));
+ }
+
+ assertEquals(message, event.getMessage());
+
+ if (arguments == null) {
+ assertNull(event.getArgumentArray());
+ } else {
+ assertArrayEquals(arguments, event.getArgumentArray());
+ }
+
+ assertEquals("wrong level: ", level, event.getLevel());
+
+ if (exception == null) {
+ assertNull(event.getThrowable());
+ } else {
+ assertEquals(exception, event.getThrowable());
+ }
+ }
}
From e757c41a57f7d57f5889144ad09d77a8b57f92ac Mon Sep 17 00:00:00 2001
From: Wessel van Norel
Date: Wed, 14 Aug 2019 00:00:29 +0200
Subject: [PATCH 030/121] Fix the build and a typo
---
.../src/main/java/org/slf4j/event/EventRecodingLogger.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index c515034e..afcaf630 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -226,7 +226,7 @@ public class EventRecodingLogger implements Logger {
}
public void warn(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.ERROR, marker, msg, t);
+ recordEvent_0Args(Level.WARN, marker, msg, t);
}
public boolean isErrorEnabled() {
@@ -304,7 +304,7 @@ public class EventRecodingLogger implements Logger {
}
- // WARNING: this method assumes that any throwable is priperly extracted
+ // WARNING: this method assumes that any throwable is properly extracted
private void recordEvent(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
loggingEvent.setTimeStamp(System.currentTimeMillis());
From c025afe5361ed10d80c693e93dd928bf5934b82e Mon Sep 17 00:00:00 2001
From: Sebastian Schuberth
Date: Mon, 19 Jun 2017 22:07:53 +0200
Subject: [PATCH 031/121] Fix the SCM connection URL in pom.xml
The "connection" should be an URL valid for read-only access and has to follow
the syntax as described at https://maven.apache.org/pom.html#SCM.
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 53f6c408..d612737a 100755
--- a/pom.xml
+++ b/pom.xml
@@ -29,7 +29,7 @@
https://github.com/qos-ch/slf4j
- scm:git@github.com:qos-ch/slf4j.git
+ scm:git:https://github.com/qos-ch/slf4j.git
From 6f217bbf630596b27c4f8dd59ffba1985b2367b7 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Mon, 19 Aug 2019 22:01:52 +0200
Subject: [PATCH 032/121] minor edits
---
slf4j-site/src/site/pages/manual.html | 28 ++++++++++++++++++---------
1 file changed, 19 insertions(+), 9 deletions(-)
diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html
index 5c5c6a5b..a205e78a 100755
--- a/slf4j-site/src/site/pages/manual.html
+++ b/slf4j-site/src/site/pages/manual.html
@@ -168,12 +168,13 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
and to log once the event is fully built. The
atTrace(), atDebug(),
atInfo(), atWarn() and
- atError() methods new in the
- org.slf4j.Logger interface return an instance of
- LoggingEventBuilder.
- For disabled log levels, the
- returned LoggingEventBuilder instance does nothing,
- thus preserving the nano-second level performance of the traditional
+ atError() methods, all new in the
+ org.slf4j.Logger interface, return an instance of
+ LoggingEventBuilder.
+ For disabled log levels, the returned
+ LoggingEventBuilder instance does nothing, thus
+ preserving the nano-second level performance of the traditional
logging interface.
@@ -186,8 +187,10 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
logger.info("Hello world.");
-
The following statements are all equivalent:
-
+
+
The following log statements are equivalent in their output
+ (for the default implementation):
+
int newT = 15;
int oldT = 16;
@@ -210,7 +213,7 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
The fluent logging API allows the specification of many
- different type of data to a org.slf4j.Logger
+ different types of data to a org.slf4j.Logger
without a combinatorial explosion in the number of methods in
the Logger interface.
@@ -235,6 +238,13 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");
+
The key-value pair variant of the API stores the key-value
+ pairs as separates objects. The default implementation as
+ shipping in the org.slf4j.Logger class
+ prefixes key-value pairs to the message. Logging
+ backends are free to customize the output as they see fit.
+
+
Binding with a logging
framework at deployment time
From 93e9f097a10899df08a9ab5810322cb7129bfa28 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sat, 7 Sep 2019 10:57:35 +0200
Subject: [PATCH 033/121] API consolidation
---
.../org/slf4j/event/EventRecodingLogger.java | 233 +----
.../src/main/java/org/slf4j/event/Level.java | 50 +-
.../org/slf4j/helpers/AbstractLogger.java | 423 ++++++++
.../slf4j/helpers/LegacyAbstractLogger.java | 38 +
.../org/slf4j/helpers/MarkerIgnoringBase.java | 1 +
.../org/slf4j/helpers/MessageFormatter.java | 38 +-
.../org/slf4j/helpers/NamedLoggerBase.java | 1 +
.../slf4j/helpers/NormalizedParameters.java | 40 +
.../slf4j/helpers/ParameterNormalizer.java | 79 ++
.../org/slf4j/spi/LocationAwareLogger.java | 3 +
.../org/slf4j/jul/JDK14LoggerAdapter.java | 900 +++++-------------
.../org/slf4j/log4j12/Log4jLoggerAdapter.java | 525 ++--------
.../java/org/slf4j/simple/SimpleLogger.java | 758 ++++++---------
13 files changed, 1232 insertions(+), 1857 deletions(-)
create mode 100644 slf4j-api/src/main/java/org/slf4j/helpers/AbstractLogger.java
create mode 100644 slf4j-api/src/main/java/org/slf4j/helpers/LegacyAbstractLogger.java
create mode 100644 slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
create mode 100644 slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index afcaf630..575ca4fe 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -2,9 +2,8 @@ package org.slf4j.event;
import java.util.Queue;
-import org.slf4j.Logger;
import org.slf4j.Marker;
-import org.slf4j.helpers.MessageFormatter;
+import org.slf4j.helpers.AbstractLogger;
import org.slf4j.helpers.SubstituteLogger;
/**
@@ -17,7 +16,7 @@ import org.slf4j.helpers.SubstituteLogger;
* @author Wessel van Norel
*
*/
-public class EventRecodingLogger implements Logger {
+public class EventRecodingLogger extends AbstractLogger {
String name;
SubstituteLogger logger;
@@ -40,272 +39,46 @@ public class EventRecodingLogger implements Logger {
return RECORD_ALL_EVENTS;
}
- public void trace(String msg) {
- recordEvent_0Args(Level.TRACE, null, msg, null);
- }
-
- public void trace(String format, Object arg) {
- recordEvent_1Args(Level.TRACE, null, format, arg);
- }
-
- public void trace(String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.TRACE, null, format, arg1, arg2);
- }
-
- public void trace(String format, Object... arguments) {
- recordEventArgArray(Level.TRACE, null, format, arguments);
- }
-
- public void trace(String msg, Throwable t) {
- recordEvent_0Args(Level.TRACE, null, msg, t);
- }
-
public boolean isTraceEnabled(Marker marker) {
return RECORD_ALL_EVENTS;
}
- public void trace(Marker marker, String msg) {
- recordEvent_0Args(Level.TRACE, marker, msg, null);
- }
-
- public void trace(Marker marker, String format, Object arg) {
- recordEvent_1Args(Level.TRACE, marker, format, arg);
- }
-
- public void trace(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.TRACE, marker, format, arg1, arg2);
- }
-
- public void trace(Marker marker, String format, Object... argArray) {
- recordEventArgArray(Level.TRACE, marker, format, argArray);
- }
-
- public void trace(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.TRACE, marker, msg, t);
- }
public boolean isDebugEnabled() {
return RECORD_ALL_EVENTS;
}
- public void debug(String msg) {
- recordEvent_0Args(Level.DEBUG, null, msg, null);
- }
-
- public void debug(String format, Object arg) {
- recordEvent_1Args(Level.DEBUG, null, format, arg);
- }
-
- public void debug(String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.DEBUG, null, format, arg1, arg2);
- }
-
- public void debug(String format, Object... arguments) {
- recordEventArgArray(Level.DEBUG, null, format, arguments);
- }
-
- public void debug(String msg, Throwable t) {
- recordEvent_0Args(Level.DEBUG, null, msg, t);
- }
-
public boolean isDebugEnabled(Marker marker) {
return RECORD_ALL_EVENTS;
}
- public void debug(Marker marker, String msg) {
- recordEvent_0Args(Level.DEBUG, marker, msg, null);
- }
-
- public void debug(Marker marker, String format, Object arg) {
- recordEvent_1Args(Level.DEBUG, marker, format, arg);
- }
-
- public void debug(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.DEBUG, marker, format, arg1, arg2);
- }
-
- public void debug(Marker marker, String format, Object... arguments) {
- recordEventArgArray(Level.DEBUG, marker, format, arguments);
- }
-
- public void debug(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.DEBUG, marker, msg, t);
- }
-
public boolean isInfoEnabled() {
return RECORD_ALL_EVENTS;
}
- public void info(String msg) {
- recordEvent_0Args(Level.INFO, null, msg, null);
- }
-
- public void info(String format, Object arg) {
- recordEvent_1Args(Level.INFO, null, format, arg);
- }
-
- public void info(String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.INFO, null, format, arg1, arg2);
- }
-
- public void info(String format, Object... arguments) {
- recordEventArgArray(Level.INFO, null, format, arguments);
- }
-
- public void info(String msg, Throwable t) {
- recordEvent_0Args(Level.INFO, null, msg, t);
- }
-
public boolean isInfoEnabled(Marker marker) {
return RECORD_ALL_EVENTS;
}
- public void info(Marker marker, String msg) {
- recordEvent_0Args(Level.INFO, marker, msg, null);
- }
-
- public void info(Marker marker, String format, Object arg) {
- recordEvent_1Args(Level.INFO, marker, format, arg);
- }
-
- public void info(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.INFO, marker, format, arg1, arg2);
- }
-
- public void info(Marker marker, String format, Object... arguments) {
- recordEventArgArray(Level.INFO, marker, format, arguments);
- }
-
- public void info(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.INFO, marker, msg, t);
-
- }
-
public boolean isWarnEnabled() {
return RECORD_ALL_EVENTS;
}
- public void warn(String msg) {
- recordEvent_0Args(Level.WARN, null, msg, null);
- }
-
- public void warn(String format, Object arg) {
- recordEvent_1Args(Level.WARN, null, format, arg);
- }
-
- public void warn(String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.WARN, null, format, arg1, arg2);
- }
-
- public void warn(String format, Object... arguments) {
- recordEventArgArray(Level.WARN, null, format, arguments);
- }
-
- public void warn(String msg, Throwable t) {
- recordEvent_0Args(Level.WARN, null, msg, t);
- }
-
public boolean isWarnEnabled(Marker marker) {
return RECORD_ALL_EVENTS;
}
- public void warn(Marker marker, String msg) {
- recordEvent_0Args(Level.WARN, marker, msg, null);
- }
-
- public void warn(Marker marker, String format, Object arg) {
- recordEvent_1Args(Level.WARN, marker, format, arg);
- }
-
- public void warn(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.WARN, marker, format, arg1, arg2);
- }
-
- public void warn(Marker marker, String format, Object... arguments) {
- recordEventArgArray(Level.WARN, marker, format, arguments);
- }
-
- public void warn(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.WARN, marker, msg, t);
- }
public boolean isErrorEnabled() {
return RECORD_ALL_EVENTS;
}
- public void error(String msg) {
- recordEvent_0Args(Level.ERROR, null, msg, null);
- }
-
- public void error(String format, Object arg) {
- recordEvent_1Args(Level.ERROR, null, format, arg);
- }
-
- public void error(String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.ERROR, null, format, arg1, arg2);
- }
-
- public void error(String format, Object... arguments) {
- recordEventArgArray(Level.ERROR, null, format, arguments);
- }
-
- public void error(String msg, Throwable t) {
- recordEvent_0Args(Level.ERROR, null, msg, t);
- }
-
public boolean isErrorEnabled(Marker marker) {
return RECORD_ALL_EVENTS;
}
- public void error(Marker marker, String msg) {
- recordEvent_0Args(Level.ERROR, marker, msg, null);
- }
-
- public void error(Marker marker, String format, Object arg) {
- recordEvent_1Args(Level.ERROR, marker, format, arg);
- }
-
- public void error(Marker marker, String format, Object arg1, Object arg2) {
- recordEvent2Args(Level.ERROR, marker, format, arg1, arg2);
- }
-
- public void error(Marker marker, String format, Object... arguments) {
- recordEventArgArray(Level.ERROR, marker, format, arguments);
- }
-
- public void error(Marker marker, String msg, Throwable t) {
- recordEvent_0Args(Level.ERROR, marker, msg, t);
- }
-
- private void recordEvent_0Args(Level level, Marker marker, String msg, Throwable t) {
- recordEvent(level, marker, msg, null, t);
- }
-
- private void recordEvent_1Args(Level level, Marker marker, String msg, Object arg1) {
- recordEvent(level, marker, msg, new Object[] { arg1 }, null);
- }
-
- private void recordEvent2Args(Level level, Marker marker, String msg, Object arg1, Object arg2) {
- if (arg2 instanceof Throwable) {
- recordEvent(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
- } else {
- recordEvent(level, marker, msg, new Object[] { arg1, arg2 }, null);
- }
- }
-
- private void recordEventArgArray(Level level, Marker marker, String msg, Object[] args) {
- Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
- if (throwableCandidate != null) {
- Object[] trimmedCopy = MessageFormatter.trimmedCopy(args);
- recordEvent(level, marker, msg, trimmedCopy, throwableCandidate);
- } else {
- recordEvent(level, marker, msg, args, null);
- }
- }
-
-
// WARNING: this method assumes that any throwable is properly extracted
- private void recordEvent(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
+ protected void handleNormalizedLoggingCall(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
loggingEvent.setTimeStamp(System.currentTimeMillis());
loggingEvent.setLevel(level);
diff --git a/slf4j-api/src/main/java/org/slf4j/event/Level.java b/slf4j-api/src/main/java/org/slf4j/event/Level.java
index 2d200bd8..ba3299b7 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/Level.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/Level.java
@@ -15,25 +15,43 @@ import static org.slf4j.event.EventConstants.WARN_INT;
*/
public enum Level {
- ERROR(ERROR_INT, "ERROR"), WARN(WARN_INT, "WARN"), INFO(INFO_INT, "INFO"), DEBUG(DEBUG_INT, "DEBUG"), TRACE(TRACE_INT, "TRACE");
+ ERROR(ERROR_INT, "ERROR"), WARN(WARN_INT, "WARN"), INFO(INFO_INT, "INFO"), DEBUG(DEBUG_INT, "DEBUG"),
+ TRACE(TRACE_INT, "TRACE");
- private int levelInt;
- private String levelStr;
+ private int levelInt;
+ private String levelStr;
- Level(int i, String s) {
- levelInt = i;
- levelStr = s;
- }
+ Level(int i, String s) {
+ levelInt = i;
+ levelStr = s;
+ }
- public int toInt() {
- return levelInt;
- }
+ public int toInt() {
+ return levelInt;
+ }
- /**
- * Returns the string representation of this Level.
- */
- public String toString() {
- return levelStr;
- }
+ public static Level intToLevel(int levelInt) {
+ switch (levelInt) {
+ case (TRACE_INT):
+ return TRACE;
+ case (DEBUG_INT):
+ return DEBUG;
+ case (INFO_INT):
+ return INFO;
+ case (WARN_INT):
+ return WARN;
+ case (ERROR_INT):
+ return ERROR;
+ default:
+ throw new IllegalArgumentException("Level integer [" + levelInt + "] not recognized.");
+ }
+ }
+
+ /**
+ * Returns the string representation of this Level.
+ */
+ public String toString() {
+ return levelStr;
+ }
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/AbstractLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/AbstractLogger.java
new file mode 100644
index 00000000..a003b00b
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/AbstractLogger.java
@@ -0,0 +1,423 @@
+/**
+ * Copyright (c) 2004-2019 QOS.ch
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+package org.slf4j.helpers;
+
+import java.io.ObjectStreamException;
+import java.io.Serializable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.Marker;
+import org.slf4j.event.Level;
+
+/**
+ * An abstract implementation which delegates actual logging work to the
+ * {@link #handleNormalizedLoggingCall(Level, Marker, String, Object[], Throwable)} method.
+ *
+ * @author Ceki Gülcü
+ * @since 2.0
+ */
+public abstract class AbstractLogger implements Logger, Serializable {
+
+ private static final long serialVersionUID = -2529255052481744503L;
+
+ protected String name;
+
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Replace this instance with a homonymous (same name) logger returned
+ * by LoggerFactory. Note that this method is only called during
+ * deserialization.
+ *
+ *
+ * This approach will work well if the desired ILoggerFactory is the one
+ * references by LoggerFactory. However, if the user manages its logger hierarchy
+ * through a different (non-static) mechanism, e.g. dependency injection, then
+ * this approach would be mostly counterproductive.
+ *
+ * @return logger with same name as returned by LoggerFactory
+ * @throws ObjectStreamException
+ */
+ protected Object readResolve() throws ObjectStreamException {
+ // using getName() instead of this.name works even for
+ // NOPLogger
+ return LoggerFactory.getLogger(getName());
+ }
+
+ @Override
+ public void trace(String msg) {
+ if (isTraceEnabled()) {
+ handle_0ArgsCall(Level.TRACE, null, msg, null);
+ }
+ }
+
+ @Override
+ public void trace(String format, Object arg) {
+ if (isTraceEnabled()) {
+ handle_1ArgsCall(Level.TRACE, null, format, arg);
+ }
+ }
+
+ @Override
+ public void trace(String format, Object arg1, Object arg2) {
+ if (isTraceEnabled()) {
+ handle2ArgsCall(Level.TRACE, null, format, arg1, arg2);
+ }
+ }
+
+ @Override
+ public void trace(String format, Object... arguments) {
+ if (isTraceEnabled()) {
+ handleArgArrayCall(Level.TRACE, null, format, arguments);
+ }
+ }
+
+ @Override
+ public void trace(String msg, Throwable t) {
+ if (isTraceEnabled()) {
+ handle_0ArgsCall(Level.TRACE, null, msg, t);
+ }
+ }
+
+ @Override
+ public void trace(Marker marker, String msg) {
+ if (isTraceEnabled(marker)) {
+ handle_0ArgsCall(Level.TRACE, marker, msg, null);
+ }
+ }
+
+ @Override
+ public void trace(Marker marker, String format, Object arg) {
+ if (isTraceEnabled(marker)) {
+ handle_1ArgsCall(Level.TRACE, marker, format, arg);
+ }
+ }
+
+ @Override
+ public void trace(Marker marker, String format, Object arg1, Object arg2) {
+ if (isTraceEnabled(marker)) {
+ handle2ArgsCall(Level.TRACE, marker, format, arg1, arg2);
+ }
+ }
+
+ @Override
+ public void trace(Marker marker, String format, Object... argArray) {
+ if (isTraceEnabled(marker)) {
+ handleArgArrayCall(Level.TRACE, marker, format, argArray);
+ }
+ }
+
+ public void trace(Marker marker, String msg, Throwable t) {
+ if (isTraceEnabled(marker)) {
+ handle_0ArgsCall(Level.TRACE, marker, msg, t);
+ }
+ }
+
+ public void debug(String msg) {
+ if (isDebugEnabled()) {
+ handle_0ArgsCall(Level.DEBUG, null, msg, null);
+ }
+ }
+
+ public void debug(String format, Object arg) {
+ if (isDebugEnabled()) {
+ handle_1ArgsCall(Level.DEBUG, null, format, arg);
+ }
+ }
+
+ public void debug(String format, Object arg1, Object arg2) {
+ if (isDebugEnabled()) {
+ handle2ArgsCall(Level.DEBUG, null, format, arg1, arg2);
+ }
+ }
+
+ public void debug(String format, Object... arguments) {
+ if (isDebugEnabled()) {
+ handleArgArrayCall(Level.DEBUG, null, format, arguments);
+ }
+ }
+
+ public void debug(String msg, Throwable t) {
+ if (isDebugEnabled()) {
+ handle_0ArgsCall(Level.DEBUG, null, msg, t);
+ }
+ }
+
+ public void debug(Marker marker, String msg) {
+ if (isDebugEnabled(marker)) {
+ handle_0ArgsCall(Level.DEBUG, marker, msg, null);
+ }
+ }
+
+ public void debug(Marker marker, String format, Object arg) {
+ if (isDebugEnabled(marker)) {
+ handle_1ArgsCall(Level.DEBUG, marker, format, arg);
+ }
+ }
+
+ public void debug(Marker marker, String format, Object arg1, Object arg2) {
+ if (isDebugEnabled(marker)) {
+ handle2ArgsCall(Level.DEBUG, marker, format, arg1, arg2);
+ }
+ }
+
+ public void debug(Marker marker, String format, Object... arguments) {
+ if (isDebugEnabled(marker)) {
+ handleArgArrayCall(Level.DEBUG, marker, format, arguments);
+ }
+ }
+
+ public void debug(Marker marker, String msg, Throwable t) {
+ if (isDebugEnabled(marker)) {
+ handle_0ArgsCall(Level.DEBUG, marker, msg, t);
+ }
+ }
+
+ public void info(String msg) {
+ if (isInfoEnabled()) {
+ handle_0ArgsCall(Level.INFO, null, msg, null);
+ }
+ }
+
+ public void info(String format, Object arg) {
+ if (isInfoEnabled()) {
+ handle_1ArgsCall(Level.INFO, null, format, arg);
+ }
+ }
+
+ public void info(String format, Object arg1, Object arg2) {
+ if (isInfoEnabled()) {
+ handle2ArgsCall(Level.INFO, null, format, arg1, arg2);
+ }
+ }
+
+ public void info(String format, Object... arguments) {
+ if (isInfoEnabled()) {
+ handleArgArrayCall(Level.INFO, null, format, arguments);
+ }
+ }
+
+ public void info(String msg, Throwable t) {
+ if (isInfoEnabled()) {
+ handle_0ArgsCall(Level.INFO, null, msg, t);
+ }
+ }
+
+ public void info(Marker marker, String msg) {
+ if (isInfoEnabled(marker)) {
+ handle_0ArgsCall(Level.INFO, marker, msg, null);
+ }
+ }
+
+ public void info(Marker marker, String format, Object arg) {
+ if (isInfoEnabled(marker)) {
+ handle_1ArgsCall(Level.INFO, marker, format, arg);
+ }
+ }
+
+ public void info(Marker marker, String format, Object arg1, Object arg2) {
+ if (isInfoEnabled(marker)) {
+ handle2ArgsCall(Level.INFO, marker, format, arg1, arg2);
+ }
+ }
+
+ public void info(Marker marker, String format, Object... arguments) {
+ if (isInfoEnabled(marker)) {
+ handleArgArrayCall(Level.INFO, marker, format, arguments);
+ }
+ }
+
+ public void info(Marker marker, String msg, Throwable t) {
+ if (isInfoEnabled(marker)) {
+ handle_0ArgsCall(Level.INFO, marker, msg, t);
+ }
+ }
+
+ public void warn(String msg) {
+ if (isWarnEnabled()) {
+ handle_0ArgsCall(Level.WARN, null, msg, null);
+ }
+ }
+
+ public void warn(String format, Object arg) {
+ if (isWarnEnabled()) {
+ handle_1ArgsCall(Level.WARN, null, format, arg);
+ }
+ }
+
+ public void warn(String format, Object arg1, Object arg2) {
+ if (isWarnEnabled()) {
+ handle2ArgsCall(Level.WARN, null, format, arg1, arg2);
+ }
+ }
+
+ public void warn(String format, Object... arguments) {
+ if (isWarnEnabled()) {
+ handleArgArrayCall(Level.WARN, null, format, arguments);
+ }
+ }
+
+ public void warn(String msg, Throwable t) {
+ if (isWarnEnabled()) {
+ handle_0ArgsCall(Level.WARN, null, msg, t);
+ }
+ }
+
+ public void warn(Marker marker, String msg) {
+ if (isWarnEnabled(marker)) {
+ handle_0ArgsCall(Level.WARN, marker, msg, null);
+ }
+ }
+
+ public void warn(Marker marker, String format, Object arg) {
+ if (isWarnEnabled(marker)) {
+ handle_1ArgsCall(Level.WARN, marker, format, arg);
+ }
+ }
+
+ public void warn(Marker marker, String format, Object arg1, Object arg2) {
+ if (isWarnEnabled(marker)) {
+ handle2ArgsCall(Level.WARN, marker, format, arg1, arg2);
+ }
+ }
+
+ public void warn(Marker marker, String format, Object... arguments) {
+ if (isWarnEnabled(marker)) {
+ handleArgArrayCall(Level.WARN, marker, format, arguments);
+ }
+ }
+
+ public void warn(Marker marker, String msg, Throwable t) {
+ if (isWarnEnabled(marker)) {
+ handle_0ArgsCall(Level.WARN, marker, msg, t);
+ }
+ }
+
+ public void error(String msg) {
+ if (isErrorEnabled()) {
+ handle_0ArgsCall(Level.ERROR, null, msg, null);
+ }
+ }
+
+ public void error(String format, Object arg) {
+ if (isErrorEnabled()) {
+ handle_1ArgsCall(Level.ERROR, null, format, arg);
+ }
+ }
+
+ public void error(String format, Object arg1, Object arg2) {
+ if (isErrorEnabled()) {
+ handle2ArgsCall(Level.ERROR, null, format, arg1, arg2);
+ }
+ }
+
+ public void error(String format, Object... arguments) {
+ if (isErrorEnabled()) {
+ handleArgArrayCall(Level.ERROR, null, format, arguments);
+ }
+ }
+
+ public void error(String msg, Throwable t) {
+ if (isErrorEnabled()) {
+ handle_0ArgsCall(Level.ERROR, null, msg, t);
+ }
+ }
+
+ public void error(Marker marker, String msg) {
+ if (isErrorEnabled(marker)) {
+ handle_0ArgsCall(Level.ERROR, marker, msg, null);
+ }
+ }
+
+ public void error(Marker marker, String format, Object arg) {
+ if (isErrorEnabled(marker)) {
+ handle_1ArgsCall(Level.ERROR, marker, format, arg);
+ }
+ }
+
+ public void error(Marker marker, String format, Object arg1, Object arg2) {
+ if (isErrorEnabled(marker)) {
+ handle2ArgsCall(Level.ERROR, marker, format, arg1, arg2);
+ }
+ }
+
+ public void error(Marker marker, String format, Object... arguments) {
+ if (isErrorEnabled(marker)) {
+ handleArgArrayCall(Level.ERROR, marker, format, arguments);
+ }
+ }
+
+ public void error(Marker marker, String msg, Throwable t) {
+ if (isErrorEnabled(marker)) {
+ handle_0ArgsCall(Level.ERROR, marker, msg, t);
+ }
+ }
+
+ private void handle_0ArgsCall(Level level, Marker marker, String msg, Throwable t) {
+ handleNormalizedLoggingCall(level, marker, msg, null, t);
+ }
+
+ private void handle_1ArgsCall(Level level, Marker marker, String msg, Object arg1) {
+ handleNormalizedLoggingCall(level, marker, msg, new Object[] { arg1 }, null);
+ }
+
+ private void handle2ArgsCall(Level level, Marker marker, String msg, Object arg1, Object arg2) {
+ if (arg2 instanceof Throwable) {
+ handleNormalizedLoggingCall(level, marker, msg, new Object[] { arg1 }, (Throwable) arg2);
+ } else {
+ handleNormalizedLoggingCall(level, marker, msg, new Object[] { arg1, arg2 }, null);
+ }
+ }
+
+ private void handleArgArrayCall(Level level, Marker marker, String msg, Object[] args) {
+ Throwable throwableCandidate = MessageFormatter.getThrowableCandidate(args);
+ if (throwableCandidate != null) {
+ Object[] trimmedCopy = MessageFormatter.trimmedCopy(args);
+ handleNormalizedLoggingCall(level, marker, msg, trimmedCopy, throwableCandidate);
+ } else {
+ handleNormalizedLoggingCall(level, marker, msg, args, null);
+ }
+ }
+
+ abstract protected String getFullyQualifiedCallerName();
+
+ /**
+ * Given various arguments passed as parameters perform actual logging.
+ *
+ *
This method assumes that the separation of the args array into actual
+ * objects and a throwable has been already operated.
+ *
+ * @param level
+ * @param marker
+ * @param msg
+ * @param arguments
+ * @param throwable
+ */
+ abstract protected void handleNormalizedLoggingCall(Level level, Marker marker, String msg, Object[] arguments, Throwable throwable);
+
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/LegacyAbstractLogger.java b/slf4j-api/src/main/java/org/slf4j/helpers/LegacyAbstractLogger.java
new file mode 100644
index 00000000..7c8abf3c
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/LegacyAbstractLogger.java
@@ -0,0 +1,38 @@
+package org.slf4j.helpers;
+
+import org.slf4j.Marker;
+
+abstract public class LegacyAbstractLogger extends AbstractLogger {
+
+
+
+ private static final long serialVersionUID = -7041884104854048950L;
+
+ @Override
+ public boolean isTraceEnabled(Marker marker) {
+ return isTraceEnabled();
+ }
+
+
+ @Override
+ public boolean isDebugEnabled(Marker marker) {
+ return isDebugEnabled();
+ }
+
+ @Override
+ public boolean isInfoEnabled(Marker marker) {
+ return isInfoEnabled();
+ }
+
+ @Override
+ public boolean isWarnEnabled(Marker marker) {
+ return isWarnEnabled();
+ }
+
+ @Override
+ public boolean isErrorEnabled(Marker marker) {
+ return isErrorEnabled();
+ }
+
+
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MarkerIgnoringBase.java b/slf4j-api/src/main/java/org/slf4j/helpers/MarkerIgnoringBase.java
index dd765384..715cec75 100644
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MarkerIgnoringBase.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MarkerIgnoringBase.java
@@ -34,6 +34,7 @@ import org.slf4j.Marker;
* any marker data passed as argument.
*
* @author Ceki Gulcu
+ * @deprecated
*/
public abstract class MarkerIgnoringBase extends NamedLoggerBase implements Logger {
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
index 09a55f44..461bcb68 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
@@ -161,6 +161,17 @@ final public class MessageFormatter {
return arrayFormat(messagePattern, args, throwableCandidate);
}
+ /**
+ * Assumes that argArray only contains arguments with no throwable as last element.
+ *
+ * @param messagePattern
+ * @param argArray
+ */
+ final public static String basicArrayFormat(final String messagePattern, final Object[] argArray) {
+ FormattingTuple ft = arrayFormat(messagePattern, argArray, null);
+ return ft.getMessage();
+ }
+
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
if (messagePattern == null) {
@@ -398,18 +409,9 @@ final public class MessageFormatter {
* otherwise it returns null
*/
public static Throwable getThrowableCandidate(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- return null;
- }
+ return ParameterNormalizer.getThrowableCandidate(argArray);
+ }
- final Object lastEntry = argArray[argArray.length - 1];
- if (lastEntry instanceof Throwable) {
- return (Throwable) lastEntry;
- }
-
- return null;
- }
-
/**
* Helper method to get all but the last element of an array
*
@@ -419,19 +421,7 @@ final public class MessageFormatter {
* @return a copy of the array without the last element
*/
public static Object[] trimmedCopy(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- throw new IllegalStateException("non-sensical empty or null argument array");
- }
-
- final int trimmedLen = argArray.length - 1;
-
- Object[] trimmed = new Object[trimmedLen];
-
- if (trimmedLen > 0) {
- System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
- }
-
- return trimmed;
+ return ParameterNormalizer.trimmedCopy(argArray);
}
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/NamedLoggerBase.java b/slf4j-api/src/main/java/org/slf4j/helpers/NamedLoggerBase.java
index e2a1d068..326c07db 100644
--- a/slf4j-api/src/main/java/org/slf4j/helpers/NamedLoggerBase.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/NamedLoggerBase.java
@@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory;
* @author Ceki Gulcu
* @see #readResolve
* @since 1.5.3
+ * @deprecated
*/
abstract class NamedLoggerBase implements Logger, Serializable {
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java b/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
new file mode 100644
index 00000000..900e4e00
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
@@ -0,0 +1,40 @@
+package org.slf4j.helpers;
+
+/**
+ * Holds normalized calling call parameters.
+ *
+ * @author ceki
+ * @since 2.0
+ */
+public class NormalizedParameters {
+
+
+ final String message;
+ final Object[] arguments;
+ final Throwable throwable;
+
+ public NormalizedParameters(String message, Object[] arguments, Throwable throwable) {
+ this.message = message;
+ this.arguments = arguments;
+ this.throwable = throwable;
+ }
+
+ public NormalizedParameters(String message, Object[] arguments) {
+ this(message, arguments, null);
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public Object[] getArguments() {
+ return arguments;
+ }
+
+ public Throwable getThrowable() {
+ return throwable;
+ }
+
+
+
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java b/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
new file mode 100644
index 00000000..83a133c6
--- /dev/null
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
@@ -0,0 +1,79 @@
+package org.slf4j.helpers;
+
+/**
+ * This class serves to normalize logging call invocation parameters.
+ *
+ * More specifically, if a throwable argument is not supplied directly, it
+ * attempts to extract it from the argument array.
+ *
+ * @author ceki
+ * @since 2.0
+ */
+public class ParameterNormalizer {
+
+ public static NormalizedParameters normalize(String msg, Object[] arguments, Throwable t) {
+
+ if (t != null) {
+ return new NormalizedParameters(msg, arguments, t);
+ }
+
+ if (arguments == null || arguments.length == 0) {
+ return new NormalizedParameters(msg, arguments, t);
+ }
+
+ Throwable throwableCandidate = getThrowableCandidate(arguments);
+ if (throwableCandidate != null) {
+ Object[] trimmedArguments = MessageFormatter.trimmedCopy(arguments);
+ return new NormalizedParameters(msg, trimmedArguments, throwableCandidate);
+ } else {
+ return new NormalizedParameters(msg, arguments);
+ }
+
+ }
+
+ /**
+ * Helper method to determine if an {@link Object} array contains a
+ * {@link Throwable} as last element
+ *
+ * @param argArray The arguments off which we want to know if it contains a
+ * {@link Throwable} as last element
+ * @return if the last {@link Object} in argArray is a {@link Throwable} this
+ * method will return it, otherwise it returns null
+ */
+ public static Throwable getThrowableCandidate(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ return null;
+ }
+
+ final Object lastEntry = argArray[argArray.length - 1];
+ if (lastEntry instanceof Throwable) {
+ return (Throwable) lastEntry;
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method to get all but the last element of an array
+ *
+ * @param argArray The arguments from which we want to remove the last element
+ *
+ * @return a copy of the array without the last element
+ */
+ public static Object[] trimmedCopy(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ throw new IllegalStateException("non-sensical empty or null argument array");
+ }
+
+ final int trimmedLen = argArray.length - 1;
+
+ Object[] trimmed = new Object[trimmedLen];
+
+ if (trimmedLen > 0) {
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+ }
+
+ return trimmed;
+ }
+
+}
diff --git a/slf4j-api/src/main/java/org/slf4j/spi/LocationAwareLogger.java b/slf4j-api/src/main/java/org/slf4j/spi/LocationAwareLogger.java
index 074d670a..c630e607 100644
--- a/slf4j-api/src/main/java/org/slf4j/spi/LocationAwareLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/spi/LocationAwareLogger.java
@@ -51,9 +51,12 @@ public interface LocationAwareLogger extends Logger {
* Printing method with support for location information.
*
* @param marker The marker to be used for this event, may be null.
+ *
* @param fqcn The fully qualified class name of the logger instance,
* typically the logger class, logger bridge or a logger wrapper.
+ *
* @param level One of the level integers defined in this interface
+ *
* @param message The message for the log event
* @param t Throwable associated with the log event, may be null.
*/
diff --git a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
index 32b5fb5f..92c76b8a 100755
--- a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
+++ b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
@@ -31,9 +31,12 @@ import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.EventConstants;
import org.slf4j.event.LoggingEvent;
+import org.slf4j.helpers.AbstractLogger;
import org.slf4j.helpers.FormattingTuple;
-import org.slf4j.helpers.MarkerIgnoringBase;
+import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
+import org.slf4j.helpers.NormalizedParameters;
+import org.slf4j.helpers.ParameterNormalizer;
import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.spi.LocationAwareLogger;
@@ -46,667 +49,258 @@ import org.slf4j.spi.LocationAwareLogger;
* @author Ceki Gülcü
* @author Peter Royal
*/
-public final class JDK14LoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger {
+public final class JDK14LoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger {
- private static final long serialVersionUID = -8053026990503422791L;
+ private static final long serialVersionUID = -8053026990503422791L;
- transient final java.util.logging.Logger logger;
+ transient final java.util.logging.Logger logger;
- // WARN: JDK14LoggerAdapter constructor should have only package access so
- // that only JDK14LoggerFactory be able to create one.
- JDK14LoggerAdapter(java.util.logging.Logger logger) {
- this.logger = logger;
- this.name = logger.getName();
- }
-
- /**
- * Is this logger instance enabled for the FINEST level?
- *
- * @return True if this Logger is enabled for level FINEST, false otherwise.
- */
- public boolean isTraceEnabled() {
- return logger.isLoggable(Level.FINEST);
- }
-
- /**
- * Log a message object at level FINEST.
- *
- * @param msg
- * - the message object to be logged
- */
- public void trace(String msg) {
- if (logger.isLoggable(Level.FINEST)) {
- log(SELF, Level.FINEST, msg, null);
- }
- }
-
- /**
- * Log a message at level FINEST according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for level FINEST.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void trace(String format, Object arg) {
- if (logger.isLoggable(Level.FINEST)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level FINEST according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the FINEST level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void trace(String format, Object arg1, Object arg2) {
- if (logger.isLoggable(Level.FINEST)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level FINEST according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the FINEST level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void trace(String format, Object... argArray) {
- if (logger.isLoggable(Level.FINEST)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- log(SELF, Level.FINEST, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at level FINEST with an accompanying message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void trace(String msg, Throwable t) {
- if (logger.isLoggable(Level.FINEST)) {
- log(SELF, Level.FINEST, msg, t);
- }
- }
-
- /**
- * Is this logger instance enabled for the FINE level?
- *
- * @return True if this Logger is enabled for level FINE, false otherwise.
- */
- public boolean isDebugEnabled() {
- return logger.isLoggable(Level.FINE);
- }
-
- /**
- * Log a message object at level FINE.
- *
- * @param msg
- * - the message object to be logged
- */
- public void debug(String msg) {
- if (logger.isLoggable(Level.FINE)) {
- log(SELF, Level.FINE, msg, null);
- }
- }
-
- /**
- * Log a message at level FINE according to the specified format and argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for level FINE.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void debug(String format, Object arg) {
- if (logger.isLoggable(Level.FINE)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level FINE according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the FINE level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void debug(String format, Object arg1, Object arg2) {
- if (logger.isLoggable(Level.FINE)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level FINE according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the FINE level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void debug(String format, Object... argArray) {
- if (logger.isLoggable(Level.FINE)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- log(SELF, Level.FINE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at level FINE with an accompanying message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void debug(String msg, Throwable t) {
- if (logger.isLoggable(Level.FINE)) {
- log(SELF, Level.FINE, msg, t);
- }
- }
-
- /**
- * Is this logger instance enabled for the INFO level?
- *
- * @return True if this Logger is enabled for the INFO level, false otherwise.
- */
- public boolean isInfoEnabled() {
- return logger.isLoggable(Level.INFO);
- }
-
- /**
- * Log a message object at the INFO level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void info(String msg) {
- if (logger.isLoggable(Level.INFO)) {
- log(SELF, Level.INFO, msg, null);
- }
- }
-
- /**
- * Log a message at level INFO according to the specified format and argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void info(String format, Object arg) {
- if (logger.isLoggable(Level.INFO)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the INFO level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void info(String format, Object arg1, Object arg2) {
- if (logger.isLoggable(Level.INFO)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level INFO according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void info(String format, Object... argArray) {
- if (logger.isLoggable(Level.INFO)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- log(SELF, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the INFO level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void info(String msg, Throwable t) {
- if (logger.isLoggable(Level.INFO)) {
- log(SELF, Level.INFO, msg, t);
- }
- }
-
- /**
- * Is this logger instance enabled for the WARNING level?
- *
- * @return True if this Logger is enabled for the WARNING level, false
- * otherwise.
- */
- public boolean isWarnEnabled() {
- return logger.isLoggable(Level.WARNING);
- }
-
- /**
- * Log a message object at the WARNING level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void warn(String msg) {
- if (logger.isLoggable(Level.WARNING)) {
- log(SELF, Level.WARNING, msg, null);
- }
- }
-
- /**
- * Log a message at the WARNING level according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARNING level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void warn(String format, Object arg) {
- if (logger.isLoggable(Level.WARNING)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the WARNING level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARNING level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void warn(String format, Object arg1, Object arg2) {
- if (logger.isLoggable(Level.WARNING)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level WARNING according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARNING level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void warn(String format, Object... argArray) {
- if (logger.isLoggable(Level.WARNING)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- log(SELF, Level.WARNING, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the WARNING level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void warn(String msg, Throwable t) {
- if (logger.isLoggable(Level.WARNING)) {
- log(SELF, Level.WARNING, msg, t);
- }
- }
-
- /**
- * Is this logger instance enabled for level SEVERE?
- *
- * @return True if this Logger is enabled for level SEVERE, false otherwise.
- */
- public boolean isErrorEnabled() {
- return logger.isLoggable(Level.SEVERE);
- }
-
- /**
- * Log a message object at the SEVERE level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void error(String msg) {
- if (logger.isLoggable(Level.SEVERE)) {
- log(SELF, Level.SEVERE, msg, null);
- }
- }
-
- /**
- * Log a message at the SEVERE level according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the SEVERE level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void error(String format, Object arg) {
- if (logger.isLoggable(Level.SEVERE)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the SEVERE level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the SEVERE level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void error(String format, Object arg1, Object arg2) {
- if (logger.isLoggable(Level.SEVERE)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level SEVERE according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the SEVERE level.
- *
- *
- * @param format
- * the format string
- * @param arguments
- * an array of arguments
- */
- public void error(String format, Object... arguments) {
- if (logger.isLoggable(Level.SEVERE)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
- log(SELF, Level.SEVERE, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the SEVERE level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void error(String msg, Throwable t) {
- if (logger.isLoggable(Level.SEVERE)) {
- log(SELF, Level.SEVERE, msg, t);
- }
- }
-
- /**
- * Log the message at the specified level with the specified throwable if any.
- * This method creates a LogRecord and fills in caller date before calling
- * this instance's JDK14 logger.
- *
- * See bug report #13 for more details.
- *
- * @param level
- * @param msg
- * @param t
- */
- private void log(String callerFQCN, Level level, String msg, Throwable t) {
- // millis and thread are filled by the constructor
- LogRecord record = new LogRecord(level, msg);
- record.setLoggerName(getName());
- record.setThrown(t);
- // Note: parameters in record are not set because SLF4J only
- // supports a single formatting style
- fillCallerData(callerFQCN, record);
- logger.log(record);
- }
-
- static String SELF = JDK14LoggerAdapter.class.getName();
- static String SUPER = MarkerIgnoringBase.class.getName();
- static String SUBSTITUE = SubstituteLogger.class.getName();
-
- static String BARRIER_CLASSES[] = new String[] {SELF, SUPER, SUBSTITUE};
-
- /**
- * Fill in caller data if possible.
- *
- * @param record
- * The record to update
- */
- final private void fillCallerData(String callerFQCN, LogRecord record) {
- StackTraceElement[] steArray = new Throwable().getStackTrace();
-
- int selfIndex = -1;
- for (int i = 0; i < steArray.length; i++) {
- final String className = steArray[i].getClassName();
-
- if (barrierMatch(callerFQCN, className)) {
- selfIndex = i;
- break;
- }
- }
-
- int found = -1;
- for (int i = selfIndex + 1; i < steArray.length; i++) {
- final String className = steArray[i].getClassName();
- if (!(barrierMatch(callerFQCN, className))) {
- found = i;
- break;
- }
- }
-
- if (found != -1) {
- StackTraceElement ste = steArray[found];
- // setting the class name has the side effect of setting
- // the needToInferCaller variable to false.
- record.setSourceClassName(ste.getClassName());
- record.setSourceMethodName(ste.getMethodName());
- }
- }
-
- private boolean barrierMatch(String callerFQCN, String candidateClassName) {
- if(candidateClassName.equals(callerFQCN))
- return true;
- for(String barrierClassName: BARRIER_CLASSES) {
- if(barrierClassName.equals(candidateClassName)) {
- return true;
- }
- }
- return false;
+ // WARN: JDK14LoggerAdapter constructor should have only package access so
+ // that only JDK14LoggerFactory be able to create one.
+ JDK14LoggerAdapter(java.util.logging.Logger logger) {
+ this.logger = logger;
+ this.name = logger.getName();
}
- public void log(Marker marker, String callerFQCN, int level, String message, Object[] argArray, Throwable t) {
- Level julLevel = slf4jLevelIntToJULLevel(level);
- // the logger.isLoggable check avoids the unconditional
- // construction of location data for disabled log
- // statements. As of 2008-07-31, callers of this method
- // do not perform this check. See also
- // http://jira.qos.ch/browse/SLF4J-81
- if (logger.isLoggable(julLevel)) {
- log(callerFQCN, julLevel, message, t);
- }
- }
+ /**
+ * Is this logger instance enabled for the FINEST level?
+ *
+ * @return True if this Logger is enabled for level FINEST, false otherwise.
+ */
+ public boolean isTraceEnabled() {
+ return logger.isLoggable(Level.FINEST);
+ }
- private Level slf4jLevelIntToJULLevel(int slf4jLevelInt) {
- Level julLevel;
- switch (slf4jLevelInt) {
- case LocationAwareLogger.TRACE_INT:
- julLevel = Level.FINEST;
- break;
- case LocationAwareLogger.DEBUG_INT:
- julLevel = Level.FINE;
- break;
- case LocationAwareLogger.INFO_INT:
- julLevel = Level.INFO;
- break;
- case LocationAwareLogger.WARN_INT:
- julLevel = Level.WARNING;
- break;
- case LocationAwareLogger.ERROR_INT:
- julLevel = Level.SEVERE;
- break;
- default:
- throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
- }
- return julLevel;
- }
+ /**
+ * Is this logger instance enabled for the FINE level?
+ *
+ * @return True if this Logger is enabled for level FINE, false otherwise.
+ */
+ public boolean isDebugEnabled() {
+ return logger.isLoggable(Level.FINE);
+ }
- /**
- * @since 1.7.15
- */
- public void log(LoggingEvent event) {
- // assumes that the invocation is made from a substitute logger
- // this assumption might change in the future with the advent of a fluent API
- Level julLevel = slf4jLevelIntToJULLevel(event.getLevel().toInt());
- if (logger.isLoggable(julLevel)) {
- LogRecord record = eventToRecord(event, julLevel);
- logger.log(record);
- }
- }
+ /**
+ * Is this logger instance enabled for the INFO level?
+ *
+ * @return True if this Logger is enabled for the INFO level, false otherwise.
+ */
+ public boolean isInfoEnabled() {
+ return logger.isLoggable(Level.INFO);
+ }
- private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
- String format = event.getMessage();
- Object[] arguments = event.getArgumentArray();
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
- if (ft.getThrowable() != null && event.getThrowable() != null) {
- throw new IllegalArgumentException("both last element in argument array and last argument are of type Throwable");
- }
+ /**
+ * Is this logger instance enabled for the WARNING level?
+ *
+ * @return True if this Logger is enabled for the WARNING level, false
+ * otherwise.
+ */
+ public boolean isWarnEnabled() {
+ return logger.isLoggable(Level.WARNING);
+ }
- Throwable t = event.getThrowable();
- if (ft.getThrowable() != null) {
- t = ft.getThrowable();
- throw new IllegalStateException("fix above code");
- }
+ /**
+ * Is this logger instance enabled for level SEVERE?
+ *
+ * @return True if this Logger is enabled for level SEVERE, false otherwise.
+ */
+ public boolean isErrorEnabled() {
+ return logger.isLoggable(Level.SEVERE);
+ }
- LogRecord record = new LogRecord(julLevel, ft.getMessage());
- record.setLoggerName(event.getLoggerName());
- record.setMillis(event.getTimeStamp());
- record.setSourceClassName(EventConstants.NA_SUBST);
- record.setSourceMethodName(EventConstants.NA_SUBST);
+// /**
+// * Log the message at the specified level with the specified throwable if any.
+// * This method creates a LogRecord and fills in caller date before calling
+// * this instance's JDK14 logger.
+// *
+// * See bug report #13 for more details.
+// *
+// * @param level
+// * @param msg
+// * @param t
+// */
+// private void log(String callerFQCN, Level level, String msg, Throwable t) {
+// // millis and thread are filled by the constructor
+// LogRecord record = new LogRecord(level, msg);
+// record.setLoggerName(getName());
+// record.setThrown(t);
+// // Note: parameters in record are not set because SLF4J only
+// // supports a single formatting style
+// fillCallerData(callerFQCN, record);
+// logger.log(record);
+// }
+
+ /**
+ * Log the message at the specified level with the specified throwable if any.
+ * This method creates a LogRecord and fills in caller date before calling this
+ * instance's JDK14 logger.
+ */
+ @Override
+ protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] args,
+ Throwable throwable) {
+ innerNormalizedLoggingCallHandler(getFullyQualifiedCallerName(), level, marker, msg, args, throwable);
+ }
+
+
+ private void innerNormalizedLoggingCallHandler(String fqcn, org.slf4j.event.Level level, Marker marker, String msg, Object[] args,
+ Throwable throwable) {
+ // millis and thread are filled by the constructor
+ Level julLevel = slf4jLevelToJULLevel(level);
+ String formattedMessage = MessageFormatter.basicArrayFormat(msg, args);
+ LogRecord record = new LogRecord(julLevel, formattedMessage);
+
+ // https://jira.qos.ch/browse/SLF4J-13
+ record.setLoggerName(getName());
+ record.setThrown(throwable);
+ // Note: parameters in record are not set because SLF4J only
+ // supports a single formatting style
+ // See also https://jira.qos.ch/browse/SLF4J-10
+ fillCallerData(fqcn, record);
+ logger.log(record);
+ }
+
+
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return SELF;
+ }
+
+
+ @Override
+ public void log(Marker marker, String callerFQCN, int slf4jLevelInt, String message, Object[] arguments,
+ Throwable throwable) {
+
+ org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(slf4jLevelInt);
+ Level julLevel = slf4jLevelIntToJULLevel(slf4jLevelInt);
+
+ if (logger.isLoggable(julLevel)) {
+ NormalizedParameters np = ParameterNormalizer.normalize(message, arguments, throwable);
+ innerNormalizedLoggingCallHandler(callerFQCN, slf4jLevel, marker, np.getMessage(), np.getArguments(), np.getThrowable());
+ }
+ }
+
+
+ /**
+ * Fill in caller data if possible.
+ *
+ * @param record The record to update
+ */
+ final private void fillCallerData(String callerFQCN, LogRecord record) {
+ StackTraceElement[] steArray = new Throwable().getStackTrace();
+
+ int selfIndex = -1;
+ for (int i = 0; i < steArray.length; i++) {
+ final String className = steArray[i].getClassName();
+
+ if (barrierMatch(callerFQCN, className)) {
+ selfIndex = i;
+ break;
+ }
+ }
+
+ int found = -1;
+ for (int i = selfIndex + 1; i < steArray.length; i++) {
+ final String className = steArray[i].getClassName();
+ if (!(barrierMatch(callerFQCN, className))) {
+ found = i;
+ break;
+ }
+ }
+
+ if (found != -1) {
+ StackTraceElement ste = steArray[found];
+ // setting the class name has the side effect of setting
+ // the needToInferCaller variable to false.
+ record.setSourceClassName(ste.getClassName());
+ record.setSourceMethodName(ste.getMethodName());
+ }
+ }
+
+ static String SELF = JDK14LoggerAdapter.class.getName();
+
+ static String SUPER = LegacyAbstractLogger.class.getName();
+ static String SUPER_OF_SUPER = AbstractLogger.class.getName();
+ static String SUBSTITUE = SubstituteLogger.class.getName();
+
+ static String BARRIER_CLASSES[] = new String[] { SUPER_OF_SUPER, SUPER, SELF, SUBSTITUE };
+
+ private boolean barrierMatch(String callerFQCN, String candidateClassName) {
+ if (candidateClassName.equals(callerFQCN))
+ return true;
+ for (String barrierClassName : BARRIER_CLASSES) {
+ if (barrierClassName.equals(candidateClassName)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+
+ private static Level slf4jLevelIntToJULLevel(int levelInt) {
+ org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(levelInt);
+ return slf4jLevelToJULLevel(slf4jLevel);
+ }
+
+ private static Level slf4jLevelToJULLevel(org.slf4j.event.Level slf4jLevel) {
+ Level julLevel;
+ switch (slf4jLevel) {
+ case TRACE:
+ julLevel = Level.FINEST;
+ break;
+ case DEBUG:
+ julLevel = Level.FINE;
+ break;
+ case INFO:
+ julLevel = Level.INFO;
+ break;
+ case WARN:
+ julLevel = Level.WARNING;
+ break;
+ case ERROR:
+ julLevel = Level.SEVERE;
+ break;
+ default:
+ throw new IllegalStateException("Level " + slf4jLevel + " is not recognized.");
+ }
+ return julLevel;
+ }
+
+ /**
+ * @since 1.7.15
+ */
+ public void log(LoggingEvent event) {
+ // assumes that the invocation is made from a substitute logger
+ // this assumption might change in the future with the advent of a fluent API
+ Level julLevel = slf4jLevelToJULLevel(event.getLevel());
+ if (logger.isLoggable(julLevel)) {
+ LogRecord record = eventToRecord(event, julLevel);
+ logger.log(record);
+ }
+ }
+
+ private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
+ String format = event.getMessage();
+ Object[] arguments = event.getArgumentArray();
+ FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
+ if (ft.getThrowable() != null && event.getThrowable() != null) {
+ throw new IllegalArgumentException(
+ "both last element in argument array and last argument are of type Throwable");
+ }
+
+ Throwable t = event.getThrowable();
+ if (ft.getThrowable() != null) {
+ t = ft.getThrowable();
+ throw new IllegalStateException("fix above code");
+ }
+
+ LogRecord record = new LogRecord(julLevel, ft.getMessage());
+ record.setLoggerName(event.getLoggerName());
+ record.setMillis(event.getTimeStamp());
+ record.setSourceClassName(EventConstants.NA_SUBST);
+ record.setSourceMethodName(EventConstants.NA_SUBST);
+
+ record.setThrown(t);
+ return record;
+ }
- record.setThrown(t);
- return record;
- }
}
diff --git a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
index 9fb1ba75..dbe72628 100755
--- a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
+++ b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
@@ -34,9 +34,11 @@ import org.apache.log4j.spi.ThrowableInformation;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.LoggingEvent;
-import org.slf4j.helpers.FormattingTuple;
-import org.slf4j.helpers.MarkerIgnoringBase;
+import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
+import org.slf4j.helpers.NormalizedParameters;
+import org.slf4j.helpers.ParameterNormalizer;
+import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.spi.LocationAwareLogger;
/**
@@ -57,7 +59,7 @@ import org.slf4j.spi.LocationAwareLogger;
*
* @author Ceki Gülcü
*/
-public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements LocationAwareLogger, Serializable {
+public final class Log4jLoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger, Serializable {
private static final long serialVersionUID = 6182834493563598289L;
@@ -104,93 +106,6 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
}
}
- /**
- * Log a message object at level TRACE.
- *
- * @param msg
- * - the message object to be logged
- */
- public void trace(String msg) {
- logger.log(FQCN, traceCapable ? Level.TRACE : Level.DEBUG, msg, null);
- }
-
- /**
- * Log a message at level TRACE according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for level TRACE.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void trace(String format, Object arg) {
- if (isTraceEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- logger.log(FQCN, traceCapable ? Level.TRACE : Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level TRACE according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the TRACE level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void trace(String format, Object arg1, Object arg2) {
- if (isTraceEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- logger.log(FQCN, traceCapable ? Level.TRACE : Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level TRACE according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the TRACE level.
- *
- *
- * @param format
- * the format string
- * @param arguments
- * an array of arguments
- */
- public void trace(String format, Object... arguments) {
- if (isTraceEnabled()) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
- logger.log(FQCN, traceCapable ? Level.TRACE : Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at level TRACE with an accompanying message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void trace(String msg, Throwable t) {
- logger.log(FQCN, traceCapable ? Level.TRACE : Level.DEBUG, msg, t);
- }
-
/**
* Is this logger instance enabled for the DEBUG level?
*
@@ -200,91 +115,6 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
return logger.isDebugEnabled();
}
- /**
- * Log a message object at level DEBUG.
- *
- * @param msg
- * - the message object to be logged
- */
- public void debug(String msg) {
- logger.log(FQCN, Level.DEBUG, msg, null);
- }
-
- /**
- * Log a message at level DEBUG according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for level DEBUG.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void debug(String format, Object arg) {
- if (logger.isDebugEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level DEBUG according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the DEBUG level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void debug(String format, Object arg1, Object arg2) {
- if (logger.isDebugEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level DEBUG according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the DEBUG level.
- *
- *
- * @param format
- * the format string
- * @param arguments an array of arguments
- */
- public void debug(String format, Object... arguments) {
- if (logger.isDebugEnabled()) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
- logger.log(FQCN, Level.DEBUG, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at level DEBUG with an accompanying message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void debug(String msg, Throwable t) {
- logger.log(FQCN, Level.DEBUG, msg, t);
- }
/**
* Is this logger instance enabled for the INFO level?
@@ -295,93 +125,6 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
return logger.isInfoEnabled();
}
- /**
- * Log a message object at the INFO level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void info(String msg) {
- logger.log(FQCN, Level.INFO, msg, null);
- }
-
- /**
- * Log a message at level INFO according to the specified format and argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void info(String format, Object arg) {
- if (logger.isInfoEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- logger.log(FQCN, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the INFO level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void info(String format, Object arg1, Object arg2) {
- if (logger.isInfoEnabled()) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- logger.log(FQCN, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level INFO according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the INFO level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void info(String format, Object... argArray) {
- if (logger.isInfoEnabled()) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- logger.log(FQCN, Level.INFO, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the INFO level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void info(String msg, Throwable t) {
- logger.log(FQCN, Level.INFO, msg, t);
- }
-
/**
* Is this logger instance enabled for the WARN level?
*
@@ -391,93 +134,6 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
return logger.isEnabledFor(Level.WARN);
}
- /**
- * Log a message object at the WARN level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void warn(String msg) {
- logger.log(FQCN, Level.WARN, msg, null);
- }
-
- /**
- * Log a message at the WARN level according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARN level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void warn(String format, Object arg) {
- if (logger.isEnabledFor(Level.WARN)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- logger.log(FQCN, Level.WARN, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the WARN level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARN level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void warn(String format, Object arg1, Object arg2) {
- if (logger.isEnabledFor(Level.WARN)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- logger.log(FQCN, Level.WARN, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level WARN according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the WARN level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void warn(String format, Object... argArray) {
- if (logger.isEnabledFor(Level.WARN)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- logger.log(FQCN, Level.WARN, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the WARN level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void warn(String msg, Throwable t) {
- logger.log(FQCN, Level.WARN, msg, t);
- }
/**
* Is this logger instance enabled for level ERROR?
@@ -488,102 +144,59 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
return logger.isEnabledFor(Level.ERROR);
}
- /**
- * Log a message object at the ERROR level.
- *
- * @param msg
- * - the message object to be logged
- */
- public void error(String msg) {
- logger.log(FQCN, Level.ERROR, msg, null);
- }
- /**
- * Log a message at the ERROR level according to the specified format and
- * argument.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the ERROR level.
- *
- *
- * @param format
- * the format string
- * @param arg
- * the argument
- */
- public void error(String format, Object arg) {
- if (logger.isEnabledFor(Level.ERROR)) {
- FormattingTuple ft = MessageFormatter.format(format, arg);
- logger.log(FQCN, Level.ERROR, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at the ERROR level according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the ERROR level.
- *
- *
- * @param format
- * the format string
- * @param arg1
- * the first argument
- * @param arg2
- * the second argument
- */
- public void error(String format, Object arg1, Object arg2) {
- if (logger.isEnabledFor(Level.ERROR)) {
- FormattingTuple ft = MessageFormatter.format(format, arg1, arg2);
- logger.log(FQCN, Level.ERROR, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log a message at level ERROR according to the specified format and
- * arguments.
- *
- *
- * This form avoids superfluous object creation when the logger is disabled
- * for the ERROR level.
- *
- *
- * @param format
- * the format string
- * @param argArray
- * an array of arguments
- */
- public void error(String format, Object... argArray) {
- if (logger.isEnabledFor(Level.ERROR)) {
- FormattingTuple ft = MessageFormatter.arrayFormat(format, argArray);
- logger.log(FQCN, Level.ERROR, ft.getMessage(), ft.getThrowable());
- }
- }
-
- /**
- * Log an exception (throwable) at the ERROR level with an accompanying
- * message.
- *
- * @param msg
- * the message accompanying the exception
- * @param t
- * the exception (throwable) to log
- */
- public void error(String msg, Throwable t) {
- logger.log(FQCN, Level.ERROR, msg, t);
- }
-
- public void log(Marker marker, String callerFQCN, int level, String msg, Object[] argArray, Throwable t) {
+ @Override
+ public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
Level log4jLevel = toLog4jLevel(level);
- logger.log(callerFQCN, log4jLevel, msg, t);
+ NormalizedParameters np = ParameterNormalizer.normalize(msg, arguments, t);
+ String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
+ logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
}
- private Level toLog4jLevel(int level) {
+ @Override
+ protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] arguments,
+ Throwable throwable) {
+ Level log4jLevel = toLog4jLevel(level.toInt());
+ String formattedMessage = MessageFormatter.basicArrayFormat(msg, arguments);
+ logger.log(getFullyQualifiedCallerName(), log4jLevel, formattedMessage, throwable);
+ }
+
+ /**
+ * Called by {@link SubstituteLogger}
+ * @param event
+ */
+ public void log(LoggingEvent event) {
+ Level log4jLevel = toLog4jLevel(event.getLevel().toInt());
+ if (!logger.isEnabledFor(log4jLevel))
+ return;
+
+ org.apache.log4j.spi.LoggingEvent log4jevent = toLog4jEvent(event, log4jLevel);
+ logger.callAppenders(log4jevent);
+
+ }
+
+ private org.apache.log4j.spi.LoggingEvent toLog4jEvent(LoggingEvent event, Level log4jLevel) {
+
+ String formattedMessage = MessageFormatter.basicArrayFormat(event.getMessage(), event.getArgumentArray());
+
+ LocationInfo locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
+
+ ThrowableInformation ti = null;
+ Throwable t = event.getThrowable();
+ if (t != null)
+ ti = new ThrowableInformation(t);
+
+ org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(FQCN, logger, event.getTimeStamp(), log4jLevel, formattedMessage,
+ event.getThreadName(), ti, null, locationInfo, null);
+
+ return log4jEvent;
+ }
+
+
+
+ private Level toLog4jLevel(int slf4jLevelInt) {
Level log4jLevel;
- switch (level) {
+ switch (slf4jLevelInt) {
case LocationAwareLogger.TRACE_INT:
log4jLevel = traceCapable ? Level.TRACE : Level.DEBUG;
break;
@@ -600,36 +213,14 @@ public final class Log4jLoggerAdapter extends MarkerIgnoringBase implements Loca
log4jLevel = Level.ERROR;
break;
default:
- throw new IllegalStateException("Level number " + level + " is not recognized.");
+ throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
}
return log4jLevel;
}
- public void log(LoggingEvent event) {
- Level log4jLevel = toLog4jLevel(event.getLevel().toInt());
- if (!logger.isEnabledFor(log4jLevel))
- return;
-
- org.apache.log4j.spi.LoggingEvent log4jevent = toLog4jEvent(event, log4jLevel);
- logger.callAppenders(log4jevent);
-
- }
-
- private org.apache.log4j.spi.LoggingEvent toLog4jEvent(LoggingEvent event, Level log4jLevel) {
-
- FormattingTuple ft = MessageFormatter.format(event.getMessage(), event.getArgumentArray(), event.getThrowable());
-
- LocationInfo locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
-
- ThrowableInformation ti = null;
- Throwable t = ft.getThrowable();
- if (t != null)
- ti = new ThrowableInformation(t);
-
- org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(FQCN, logger, event.getTimeStamp(), log4jLevel, ft.getMessage(),
- event.getThreadName(), ti, null, locationInfo, null);
-
- return log4jEvent;
- }
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return FQCN;
+ }
}
diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
index cce8c86a..d2c49396 100644
--- a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
+++ b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
@@ -28,10 +28,15 @@ import java.io.PrintStream;
import java.util.Date;
import org.slf4j.Logger;
+import org.slf4j.Marker;
+import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
+import org.slf4j.helpers.AbstractLogger;
import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.MarkerIgnoringBase;
import org.slf4j.helpers.MessageFormatter;
+import org.slf4j.helpers.NormalizedParameters;
+import org.slf4j.helpers.ParameterNormalizer;
import org.slf4j.spi.LocationAwareLogger;
/**
@@ -49,11 +54,10 @@ import org.slf4j.spi.LocationAwareLogger;
*
org.slf4j.simpleLogger.cacheOutputStream - If the output
* target is set to "System.out" or "System.err" (see preceding entry), by
* default, logs will be output to the latest value referenced by
- * System.out/err variables. By setting this
- * parameter to true, the output stream will be cached, i.e. assigned once at
- * initialization time and re-used independently of the current value referenced by
- * System.out/err.
- *
+ * System.out/err variables. By setting this parameter to true, the
+ * output stream will be cached, i.e. assigned once at initialization time and
+ * re-used independently of the current value referenced by
+ * System.out/err.
*
*
org.slf4j.simpleLogger.defaultLogLevel - Default log level
* for all instances of SimpleLogger. Must be one of ("trace", "debug", "info",
@@ -140,467 +144,287 @@ import org.slf4j.spi.LocationAwareLogger;
* @author Robert Burrell Donkin
* @author Cédrik LIME
*/
-public class SimpleLogger extends MarkerIgnoringBase {
-
- private static final long serialVersionUID = -632788891211436180L;
-
- private static long START_TIME = System.currentTimeMillis();
-
- protected static final int LOG_LEVEL_TRACE = LocationAwareLogger.TRACE_INT;
- protected static final int LOG_LEVEL_DEBUG = LocationAwareLogger.DEBUG_INT;
- protected static final int LOG_LEVEL_INFO = LocationAwareLogger.INFO_INT;
- protected static final int LOG_LEVEL_WARN = LocationAwareLogger.WARN_INT;
- protected static final int LOG_LEVEL_ERROR = LocationAwareLogger.ERROR_INT;
- // The OFF level can only be used in configuration files to disable logging.
- // It has
- // no printing method associated with it in o.s.Logger interface.
- protected static final int LOG_LEVEL_OFF = LOG_LEVEL_ERROR + 10;
-
- private static boolean INITIALIZED = false;
- static SimpleLoggerConfiguration CONFIG_PARAMS = null;
-
- static void lazyInit() {
- if (INITIALIZED) {
- return;
- }
- INITIALIZED = true;
- init();
- }
-
- // external software might be invoking this method directly. Do not rename
- // or change its semantics.
- static void init() {
- CONFIG_PARAMS = new SimpleLoggerConfiguration();
- CONFIG_PARAMS.init();
- }
-
- /** The current log level */
- protected int currentLogLevel = LOG_LEVEL_INFO;
- /** The short name of this simple log instance */
- private transient String shortLogName = null;
-
- /**
- * All system properties used by SimpleLogger start with this
- * prefix
- */
- public static final String SYSTEM_PREFIX = "org.slf4j.simpleLogger.";
-
- public static final String LOG_KEY_PREFIX = SimpleLogger.SYSTEM_PREFIX + "log.";
-
- public static final String CACHE_OUTPUT_STREAM_STRING_KEY = SimpleLogger.SYSTEM_PREFIX + "cacheOutputStream";
-
- public static final String WARN_LEVEL_STRING_KEY = SimpleLogger.SYSTEM_PREFIX + "warnLevelString";
-
- public static final String LEVEL_IN_BRACKETS_KEY = SimpleLogger.SYSTEM_PREFIX + "levelInBrackets";
-
- public static final String LOG_FILE_KEY = SimpleLogger.SYSTEM_PREFIX + "logFile";
-
- public static final String SHOW_SHORT_LOG_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showShortLogName";
-
- public static final String SHOW_LOG_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showLogName";
-
- public static final String SHOW_THREAD_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showThreadName";
-
- public static final String DATE_TIME_FORMAT_KEY = SimpleLogger.SYSTEM_PREFIX + "dateTimeFormat";
-
- public static final String SHOW_DATE_TIME_KEY = SimpleLogger.SYSTEM_PREFIX + "showDateTime";
-
- public static final String DEFAULT_LOG_LEVEL_KEY = SimpleLogger.SYSTEM_PREFIX + "defaultLogLevel";
-
- /**
- * Package access allows only {@link SimpleLoggerFactory} to instantiate
- * SimpleLogger instances.
- */
- SimpleLogger(String name) {
- this.name = name;
-
- String levelString = recursivelyComputeLevelString();
- if (levelString != null) {
- this.currentLogLevel = SimpleLoggerConfiguration.stringToLevel(levelString);
- } else {
- this.currentLogLevel = CONFIG_PARAMS.defaultLogLevel;
- }
- }
-
- String recursivelyComputeLevelString() {
- String tempName = name;
- String levelString = null;
- int indexOfLastDot = tempName.length();
- while ((levelString == null) && (indexOfLastDot > -1)) {
- tempName = tempName.substring(0, indexOfLastDot);
- levelString = CONFIG_PARAMS.getStringProperty(SimpleLogger.LOG_KEY_PREFIX + tempName, null);
- indexOfLastDot = String.valueOf(tempName).lastIndexOf(".");
- }
- return levelString;
- }
-
- /**
- * This is our internal implementation for logging regular
- * (non-parameterized) log messages.
- *
- * @param level
- * One of the LOG_LEVEL_XXX constants defining the log level
- * @param message
- * The message itself
- * @param t
- * The exception whose stack trace should be logged
- */
- private void log(int level, String message, Throwable t) {
- if (!isLevelEnabled(level)) {
- return;
- }
-
- StringBuilder buf = new StringBuilder(32);
-
- // Append date-time if so configured
- if (CONFIG_PARAMS.showDateTime) {
- if (CONFIG_PARAMS.dateFormatter != null) {
- buf.append(getFormattedDate());
- buf.append(' ');
- } else {
- buf.append(System.currentTimeMillis() - START_TIME);
- buf.append(' ');
- }
- }
-
- // Append current thread name if so configured
- if (CONFIG_PARAMS.showThreadName) {
- buf.append('[');
- buf.append(Thread.currentThread().getName());
- buf.append("] ");
- }
-
- if (CONFIG_PARAMS.levelInBrackets)
- buf.append('[');
-
- // Append a readable representation of the log level
- String levelStr = renderLevel(level);
- buf.append(levelStr);
- if (CONFIG_PARAMS.levelInBrackets)
- buf.append(']');
- buf.append(' ');
-
- // Append the name of the log instance if so configured
- if (CONFIG_PARAMS.showShortLogName) {
- if (shortLogName == null)
- shortLogName = computeShortName();
- buf.append(String.valueOf(shortLogName)).append(" - ");
- } else if (CONFIG_PARAMS.showLogName) {
- buf.append(String.valueOf(name)).append(" - ");
- }
-
- // Append the message
- buf.append(message);
-
- write(buf, t);
-
- }
-
- protected String renderLevel(int level) {
- switch (level) {
- case LOG_LEVEL_TRACE:
- return "TRACE";
- case LOG_LEVEL_DEBUG:
- return ("DEBUG");
- case LOG_LEVEL_INFO:
- return "INFO";
- case LOG_LEVEL_WARN:
- return CONFIG_PARAMS.warnLevelString;
- case LOG_LEVEL_ERROR:
- return "ERROR";
- }
- throw new IllegalStateException("Unrecognized level [" + level + "]");
- }
-
- void write(StringBuilder buf, Throwable t) {
- PrintStream targetStream = CONFIG_PARAMS.outputChoice.getTargetPrintStream();
-
- targetStream.println(buf.toString());
- writeThrowable(t, targetStream);
- targetStream.flush();
- }
-
- protected void writeThrowable(Throwable t, PrintStream targetStream) {
- if (t != null) {
- t.printStackTrace(targetStream);
- }
- }
-
- private String getFormattedDate() {
- Date now = new Date();
- String dateText;
- synchronized (CONFIG_PARAMS.dateFormatter) {
- dateText = CONFIG_PARAMS.dateFormatter.format(now);
- }
- return dateText;
- }
-
- private String computeShortName() {
- return name.substring(name.lastIndexOf(".") + 1);
- }
-
- /**
- * For formatted messages, first substitute arguments and then log.
- *
- * @param level
- * @param format
- * @param arg1
- * @param arg2
- */
- private void formatAndLog(int level, String format, Object arg1, Object arg2) {
- if (!isLevelEnabled(level)) {
- return;
- }
- FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
- log(level, tp.getMessage(), tp.getThrowable());
- }
-
- /**
- * For formatted messages, first substitute arguments and then log.
- *
- * @param level
- * @param format
- * @param arguments
- * a list of 3 ore more arguments
- */
- private void formatAndLog(int level, String format, Object... arguments) {
- if (!isLevelEnabled(level)) {
- return;
- }
- FormattingTuple tp = MessageFormatter.arrayFormat(format, arguments);
- log(level, tp.getMessage(), tp.getThrowable());
- }
-
- /**
- * Is the given log level currently enabled?
- *
- * @param logLevel is this level enabled?
- * @return whether the logger is enabled for the given level
- */
- protected boolean isLevelEnabled(int logLevel) {
- // log level are numerically ordered so can use simple numeric
- // comparison
- return (logLevel >= currentLogLevel);
- }
-
- /** Are {@code trace} messages currently enabled? */
- public boolean isTraceEnabled() {
- return isLevelEnabled(LOG_LEVEL_TRACE);
- }
-
- /**
- * A simple implementation which logs messages of level TRACE according to
- * the format outlined above.
- */
- public void trace(String msg) {
- log(LOG_LEVEL_TRACE, msg, null);
- }
-
- /**
- * Perform single parameter substitution before logging the message of level
- * TRACE according to the format outlined above.
- */
- public void trace(String format, Object param1) {
- formatAndLog(LOG_LEVEL_TRACE, format, param1, null);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * TRACE according to the format outlined above.
- */
- public void trace(String format, Object param1, Object param2) {
- formatAndLog(LOG_LEVEL_TRACE, format, param1, param2);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * TRACE according to the format outlined above.
- */
- public void trace(String format, Object... argArray) {
- formatAndLog(LOG_LEVEL_TRACE, format, argArray);
- }
-
- /** Log a message of level TRACE, including an exception. */
- public void trace(String msg, Throwable t) {
- log(LOG_LEVEL_TRACE, msg, t);
- }
-
- /** Are {@code debug} messages currently enabled? */
- public boolean isDebugEnabled() {
- return isLevelEnabled(LOG_LEVEL_DEBUG);
- }
-
- /**
- * A simple implementation which logs messages of level DEBUG according to
- * the format outlined above.
- */
- public void debug(String msg) {
- log(LOG_LEVEL_DEBUG, msg, null);
- }
-
- /**
- * Perform single parameter substitution before logging the message of level
- * DEBUG according to the format outlined above.
- */
- public void debug(String format, Object param1) {
- formatAndLog(LOG_LEVEL_DEBUG, format, param1, null);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * DEBUG according to the format outlined above.
- */
- public void debug(String format, Object param1, Object param2) {
- formatAndLog(LOG_LEVEL_DEBUG, format, param1, param2);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * DEBUG according to the format outlined above.
- */
- public void debug(String format, Object... argArray) {
- formatAndLog(LOG_LEVEL_DEBUG, format, argArray);
- }
-
- /** Log a message of level DEBUG, including an exception. */
- public void debug(String msg, Throwable t) {
- log(LOG_LEVEL_DEBUG, msg, t);
- }
-
- /** Are {@code info} messages currently enabled? */
- public boolean isInfoEnabled() {
- return isLevelEnabled(LOG_LEVEL_INFO);
- }
-
- /**
- * A simple implementation which logs messages of level INFO according to
- * the format outlined above.
- */
- public void info(String msg) {
- log(LOG_LEVEL_INFO, msg, null);
- }
-
- /**
- * Perform single parameter substitution before logging the message of level
- * INFO according to the format outlined above.
- */
- public void info(String format, Object arg) {
- formatAndLog(LOG_LEVEL_INFO, format, arg, null);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * INFO according to the format outlined above.
- */
- public void info(String format, Object arg1, Object arg2) {
- formatAndLog(LOG_LEVEL_INFO, format, arg1, arg2);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * INFO according to the format outlined above.
- */
- public void info(String format, Object... argArray) {
- formatAndLog(LOG_LEVEL_INFO, format, argArray);
- }
-
- /** Log a message of level INFO, including an exception. */
- public void info(String msg, Throwable t) {
- log(LOG_LEVEL_INFO, msg, t);
- }
-
- /** Are {@code warn} messages currently enabled? */
- public boolean isWarnEnabled() {
- return isLevelEnabled(LOG_LEVEL_WARN);
- }
-
- /**
- * A simple implementation which always logs messages of level WARN
- * according to the format outlined above.
- */
- public void warn(String msg) {
- log(LOG_LEVEL_WARN, msg, null);
- }
-
- /**
- * Perform single parameter substitution before logging the message of level
- * WARN according to the format outlined above.
- */
- public void warn(String format, Object arg) {
- formatAndLog(LOG_LEVEL_WARN, format, arg, null);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * WARN according to the format outlined above.
- */
- public void warn(String format, Object arg1, Object arg2) {
- formatAndLog(LOG_LEVEL_WARN, format, arg1, arg2);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * WARN according to the format outlined above.
- */
- public void warn(String format, Object... argArray) {
- formatAndLog(LOG_LEVEL_WARN, format, argArray);
- }
-
- /** Log a message of level WARN, including an exception. */
- public void warn(String msg, Throwable t) {
- log(LOG_LEVEL_WARN, msg, t);
- }
-
- /** Are {@code error} messages currently enabled? */
- public boolean isErrorEnabled() {
- return isLevelEnabled(LOG_LEVEL_ERROR);
- }
-
- /**
- * A simple implementation which always logs messages of level ERROR
- * according to the format outlined above.
- */
- public void error(String msg) {
- log(LOG_LEVEL_ERROR, msg, null);
- }
-
- /**
- * Perform single parameter substitution before logging the message of level
- * ERROR according to the format outlined above.
- */
- public void error(String format, Object arg) {
- formatAndLog(LOG_LEVEL_ERROR, format, arg, null);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * ERROR according to the format outlined above.
- */
- public void error(String format, Object arg1, Object arg2) {
- formatAndLog(LOG_LEVEL_ERROR, format, arg1, arg2);
- }
-
- /**
- * Perform double parameter substitution before logging the message of level
- * ERROR according to the format outlined above.
- */
- public void error(String format, Object... argArray) {
- formatAndLog(LOG_LEVEL_ERROR, format, argArray);
- }
-
- /** Log a message of level ERROR, including an exception. */
- public void error(String msg, Throwable t) {
- log(LOG_LEVEL_ERROR, msg, t);
- }
-
- public void log(LoggingEvent event) {
- int levelInt = event.getLevel().toInt();
-
- if (!isLevelEnabled(levelInt)) {
- return;
- }
- FormattingTuple tp = MessageFormatter.arrayFormat(event.getMessage(), event.getArgumentArray(), event.getThrowable());
- log(levelInt, tp.getMessage(), event.getThrowable());
- }
+public class SimpleLogger extends AbstractLogger {
+
+ private static final long serialVersionUID = -632788891211436180L;
+
+ private static long START_TIME = System.currentTimeMillis();
+
+ protected static final int LOG_LEVEL_TRACE = LocationAwareLogger.TRACE_INT;
+ protected static final int LOG_LEVEL_DEBUG = LocationAwareLogger.DEBUG_INT;
+ protected static final int LOG_LEVEL_INFO = LocationAwareLogger.INFO_INT;
+ protected static final int LOG_LEVEL_WARN = LocationAwareLogger.WARN_INT;
+ protected static final int LOG_LEVEL_ERROR = LocationAwareLogger.ERROR_INT;
+
+ static char SP = ' ';
+
+ // The OFF level can only be used in configuration files to disable logging.
+ // It has
+ // no printing method associated with it in o.s.Logger interface.
+ protected static final int LOG_LEVEL_OFF = LOG_LEVEL_ERROR + 10;
+
+ private static boolean INITIALIZED = false;
+ static SimpleLoggerConfiguration CONFIG_PARAMS = null;
+
+ static void lazyInit() {
+ if (INITIALIZED) {
+ return;
+ }
+ INITIALIZED = true;
+ init();
+ }
+
+ // external software might be invoking this method directly. Do not rename
+ // or change its semantics.
+ static void init() {
+ CONFIG_PARAMS = new SimpleLoggerConfiguration();
+ CONFIG_PARAMS.init();
+ }
+
+ /** The current log level */
+ protected int currentLogLevel = LOG_LEVEL_INFO;
+ /** The short name of this simple log instance */
+ private transient String shortLogName = null;
+
+ /**
+ * All system properties used by SimpleLogger start with this
+ * prefix
+ */
+ public static final String SYSTEM_PREFIX = "org.slf4j.simpleLogger.";
+
+ public static final String LOG_KEY_PREFIX = SimpleLogger.SYSTEM_PREFIX + "log.";
+
+ public static final String CACHE_OUTPUT_STREAM_STRING_KEY = SimpleLogger.SYSTEM_PREFIX + "cacheOutputStream";
+
+ public static final String WARN_LEVEL_STRING_KEY = SimpleLogger.SYSTEM_PREFIX + "warnLevelString";
+
+ public static final String LEVEL_IN_BRACKETS_KEY = SimpleLogger.SYSTEM_PREFIX + "levelInBrackets";
+
+ public static final String LOG_FILE_KEY = SimpleLogger.SYSTEM_PREFIX + "logFile";
+
+ public static final String SHOW_SHORT_LOG_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showShortLogName";
+
+ public static final String SHOW_LOG_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showLogName";
+
+ public static final String SHOW_THREAD_NAME_KEY = SimpleLogger.SYSTEM_PREFIX + "showThreadName";
+
+ public static final String DATE_TIME_FORMAT_KEY = SimpleLogger.SYSTEM_PREFIX + "dateTimeFormat";
+
+ public static final String SHOW_DATE_TIME_KEY = SimpleLogger.SYSTEM_PREFIX + "showDateTime";
+
+ public static final String DEFAULT_LOG_LEVEL_KEY = SimpleLogger.SYSTEM_PREFIX + "defaultLogLevel";
+
+ /**
+ * Package access allows only {@link SimpleLoggerFactory} to instantiate
+ * SimpleLogger instances.
+ */
+ SimpleLogger(String name) {
+ this.name = name;
+
+ String levelString = recursivelyComputeLevelString();
+ if (levelString != null) {
+ this.currentLogLevel = SimpleLoggerConfiguration.stringToLevel(levelString);
+ } else {
+ this.currentLogLevel = CONFIG_PARAMS.defaultLogLevel;
+ }
+ }
+
+ String recursivelyComputeLevelString() {
+ String tempName = name;
+ String levelString = null;
+ int indexOfLastDot = tempName.length();
+ while ((levelString == null) && (indexOfLastDot > -1)) {
+ tempName = tempName.substring(0, indexOfLastDot);
+ levelString = CONFIG_PARAMS.getStringProperty(SimpleLogger.LOG_KEY_PREFIX + tempName, null);
+ indexOfLastDot = String.valueOf(tempName).lastIndexOf(".");
+ }
+ return levelString;
+ }
+
+
+
+
+ void write(StringBuilder buf, Throwable t) {
+ PrintStream targetStream = CONFIG_PARAMS.outputChoice.getTargetPrintStream();
+
+ targetStream.println(buf.toString());
+ writeThrowable(t, targetStream);
+ targetStream.flush();
+ }
+
+ protected void writeThrowable(Throwable t, PrintStream targetStream) {
+ if (t != null) {
+ t.printStackTrace(targetStream);
+ }
+ }
+
+ private String getFormattedDate() {
+ Date now = new Date();
+ String dateText;
+ synchronized (CONFIG_PARAMS.dateFormatter) {
+ dateText = CONFIG_PARAMS.dateFormatter.format(now);
+ }
+ return dateText;
+ }
+
+ private String computeShortName() {
+ return name.substring(name.lastIndexOf(".") + 1);
+ }
+
+// /**
+// * For formatted messages, first substitute arguments and then log.
+// *
+// * @param level
+// * @param format
+// * @param arg1
+// * @param arg2
+// */
+// private void formatAndLog(int level, String format, Object arg1, Object arg2) {
+// if (!isLevelEnabled(level)) {
+// return;
+// }
+// FormattingTuple tp = MessageFormatter.format(format, arg1, arg2);
+// log(level, tp.getMessage(), tp.getThrowable());
+// }
+
+// /**
+// * For formatted messages, first substitute arguments and then log.
+// *
+// * @param level
+// * @param format
+// * @param arguments
+// * a list of 3 ore more arguments
+// */
+// private void formatAndLog(int level, String format, Object... arguments) {
+// if (!isLevelEnabled(level)) {
+// return;
+// }
+// FormattingTuple tp = MessageFormatter.arrayFormat(format, arguments);
+// log(level, tp.getMessage(), tp.getThrowable());
+// }
+
+ /**
+ * Is the given log level currently enabled?
+ *
+ * @param logLevel is this level enabled?
+ * @return whether the logger is enabled for the given level
+ */
+ protected boolean isLevelEnabled(int logLevel) {
+ // log level are numerically ordered so can use simple numeric
+ // comparison
+ return (logLevel >= currentLogLevel);
+ }
+
+ /** Are {@code trace} messages currently enabled? */
+ public boolean isTraceEnabled() {
+ return isLevelEnabled(LOG_LEVEL_TRACE);
+ }
+
+ /** Are {@code debug} messages currently enabled? */
+ public boolean isDebugEnabled() {
+ return isLevelEnabled(LOG_LEVEL_DEBUG);
+ }
+
+ /** Are {@code info} messages currently enabled? */
+ public boolean isInfoEnabled() {
+ return isLevelEnabled(LOG_LEVEL_INFO);
+ }
+
+ /** Are {@code warn} messages currently enabled? */
+ public boolean isWarnEnabled() {
+ return isLevelEnabled(LOG_LEVEL_WARN);
+ }
+
+ /** Are {@code error} messages currently enabled? */
+ public boolean isErrorEnabled() {
+ return isLevelEnabled(LOG_LEVEL_ERROR);
+ }
+
+ /**
+ * This is our internal implementation for logging regular (non-parameterized)
+ * log messages.
+ *
+ * @param level One of the LOG_LEVEL_XXX constants defining the log level
+ * @param message The message itself
+ * @param t The exception whose stack trace should be logged
+ */
+ @Override
+ protected void handleNormalizedLoggingCall(Level level, Marker marker, String messagePattern, Object[] arguments,
+ Throwable t) {
+
+ first convert to an event and then log
+
+ StringBuilder buf = new StringBuilder(32);
+
+ // Append date-time if so configured
+ if (CONFIG_PARAMS.showDateTime) {
+ if (CONFIG_PARAMS.dateFormatter != null) {
+ buf.append(getFormattedDate());
+ buf.append(' ');
+ } else {
+ buf.append(System.currentTimeMillis() - START_TIME);
+ buf.append(' ');
+ }
+ }
+
+ // Append current thread name if so configured
+ if (CONFIG_PARAMS.showThreadName) {
+ buf.append('[');
+ buf.append(Thread.currentThread().getName());
+ buf.append("] ");
+ }
+
+ if (CONFIG_PARAMS.levelInBrackets)
+ buf.append('[');
+
+ // Append a readable representation of the log level
+ String levelStr = level.name();
+ buf.append(levelStr);
+ if (CONFIG_PARAMS.levelInBrackets)
+ buf.append(']');
+ buf.append(' ');
+
+ // Append the name of the log instance if so configured
+ if (CONFIG_PARAMS.showShortLogName) {
+ if (shortLogName == null)
+ shortLogName = computeShortName();
+ buf.append(String.valueOf(shortLogName)).append(" - ");
+ } else if (CONFIG_PARAMS.showLogName) {
+ buf.append(String.valueOf(name)).append(" - ");
+ }
+
+ buf.append(SP).append(marker.getName()).append(SP);
+
+ String formattedMessage = MessageFormatter.basicArrayFormat(messagePattern, arguments);
+
+ // Append the message
+ buf.append(formattedMessage);
+
+ write(buf, t);
+ }
+
+
+ public void log(LoggingEvent event) {
+ int levelInt = event.getLevel().toInt();
+
+ if (!isLevelEnabled(levelInt)) {
+ return;
+ }
+
+ NormalizedParameters np = ParameterNormalizer.normalize(event);
+
+
+
+ FormattingTuple tp = MessageFormatter.arrayFormat(event.getMessage(), event.getArgumentArray(),
+ event.getThrowable());
+
+ handleNormalizedLoggingCall(level, event.getMarkers(), messagePattern, arguments, t);
+ log(event.getLevel(), tp.getMessage(), event.getThrowable());
+ }
+
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return null;
+ }
}
From 112271b8f6d0542f8d34c7d90885ab1afae1e536 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 8 Sep 2019 15:42:29 +0200
Subject: [PATCH 034/121] 'fix build, other changes
---
.../org/slf4j/event/DefaultLoggingEvent.java | 8 +-
.../org/slf4j/event/EventRecodingLogger.java | 42 ++++------
.../slf4j/event/SubstituteLoggingEvent.java | 12 ++-
.../org/slf4j/helpers/MessageFormatter.java | 10 ++-
.../slf4j/helpers/NormalizedParameters.java | 82 ++++++++++++++++++-
.../slf4j/helpers/ParameterNormalizer.java | 79 ------------------
.../org/slf4j/jul/JDK14LoggerAdapter.java | 3 +-
.../org/slf4j/log4j12/Log4jLoggerAdapter.java | 3 +-
.../java/org/slf4j/simple/SimpleLogger.java | 42 ++++++----
...LoggerMultithreadedInitializationTest.java | 2 +-
10 files changed, 144 insertions(+), 139 deletions(-)
delete mode 100644 slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
diff --git a/slf4j-api/src/main/java/org/slf4j/event/DefaultLoggingEvent.java b/slf4j-api/src/main/java/org/slf4j/event/DefaultLoggingEvent.java
index 16f17ac2..a32b7a15 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/DefaultLoggingEvent.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/DefaultLoggingEvent.java
@@ -35,14 +35,14 @@ public class DefaultLoggingEvent implements LoggingEvent {
}
public void addMarker(Marker marker) {
- getMarkers().add(marker);
+ if(markers == null) {
+ markers = new ArrayList<>(2);
+ }
+ markers.add(marker);
}
@Override
public List getMarkers() {
- if (markers == null) {
- markers = new ArrayList<>(5);
- }
return markers;
}
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index 575ca4fe..aae0af50 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -1,9 +1,10 @@
package org.slf4j.event;
import java.util.Queue;
+import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Marker;
-import org.slf4j.helpers.AbstractLogger;
+import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.SubstituteLogger;
/**
@@ -16,7 +17,9 @@ import org.slf4j.helpers.SubstituteLogger;
* @author Wessel van Norel
*
*/
-public class EventRecodingLogger extends AbstractLogger {
+public class EventRecodingLogger extends LegacyAbstractLogger {
+
+ private static final long serialVersionUID = -176083308134819629L;
String name;
SubstituteLogger logger;
@@ -39,52 +42,33 @@ public class EventRecodingLogger extends AbstractLogger {
return RECORD_ALL_EVENTS;
}
- public boolean isTraceEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
-
public boolean isDebugEnabled() {
return RECORD_ALL_EVENTS;
}
- public boolean isDebugEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
public boolean isInfoEnabled() {
return RECORD_ALL_EVENTS;
}
- public boolean isInfoEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
public boolean isWarnEnabled() {
return RECORD_ALL_EVENTS;
}
- public boolean isWarnEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
-
public boolean isErrorEnabled() {
return RECORD_ALL_EVENTS;
}
- public boolean isErrorEnabled(Marker marker) {
- return RECORD_ALL_EVENTS;
- }
-
// WARNING: this method assumes that any throwable is properly extracted
- protected void handleNormalizedLoggingCall(Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
+ protected void handleNormalizedLoggingCall(Level level, Marker marker, String msg, Object[] args,
+ Throwable throwable) {
SubstituteLoggingEvent loggingEvent = new SubstituteLoggingEvent();
loggingEvent.setTimeStamp(System.currentTimeMillis());
loggingEvent.setLevel(level);
loggingEvent.setLogger(logger);
loggingEvent.setLoggerName(name);
- loggingEvent.addMarker(marker);
+ if (marker != null) {
+ loggingEvent.addMarker(marker);
+ }
loggingEvent.setMessage(msg);
loggingEvent.setThreadName(Thread.currentThread().getName());
@@ -92,5 +76,11 @@ public class EventRecodingLogger extends AbstractLogger {
loggingEvent.setThrowable(throwable);
eventQueue.add(loggingEvent);
+
+ }
+
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return null;
}
}
diff --git a/slf4j-api/src/main/java/org/slf4j/event/SubstituteLoggingEvent.java b/slf4j-api/src/main/java/org/slf4j/event/SubstituteLoggingEvent.java
index 6f3c1443..45bfbfd3 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/SubstituteLoggingEvent.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/SubstituteLoggingEvent.java
@@ -30,14 +30,18 @@ public class SubstituteLoggingEvent implements LoggingEvent {
}
public List getMarkers() {
- if(markers == null) {
- markers = new ArrayList<>(5);
- }
return markers;
}
public void addMarker(Marker marker) {
- getMarkers().add(marker);
+ if(marker == null)
+ return;
+
+ if(markers == null) {
+ markers = new ArrayList<>(2);
+ }
+
+ markers.add(marker);
}
public String getLoggerName() {
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
index 461bcb68..0f72b8ca 100755
--- a/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/MessageFormatter.java
@@ -172,6 +172,10 @@ final public class MessageFormatter {
return ft.getMessage();
}
+ public static String basicArrayFormat(NormalizedParameters np) {
+ return basicArrayFormat(np.getMessage(), np.getArguments());
+ }
+
final public static FormattingTuple arrayFormat(final String messagePattern, final Object[] argArray, Throwable throwable) {
if (messagePattern == null) {
@@ -409,7 +413,7 @@ final public class MessageFormatter {
* otherwise it returns null
*/
public static Throwable getThrowableCandidate(final Object[] argArray) {
- return ParameterNormalizer.getThrowableCandidate(argArray);
+ return NormalizedParameters.getThrowableCandidate(argArray);
}
/**
@@ -421,7 +425,9 @@ final public class MessageFormatter {
* @return a copy of the array without the last element
*/
public static Object[] trimmedCopy(final Object[] argArray) {
- return ParameterNormalizer.trimmedCopy(argArray);
+ return NormalizedParameters.trimmedCopy(argArray);
}
+
+
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java b/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
index 900e4e00..19e7ed78 100644
--- a/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
+++ b/slf4j-api/src/main/java/org/slf4j/helpers/NormalizedParameters.java
@@ -1,18 +1,21 @@
package org.slf4j.helpers;
+import org.slf4j.event.LoggingEvent;
+
/**
* Holds normalized calling call parameters.
*
+ * Includes utility methods such as {@link #normalize(String, Object[], Throwable)} to help the normalization of parameters.
+ *
* @author ceki
* @since 2.0
*/
public class NormalizedParameters {
-
final String message;
final Object[] arguments;
final Throwable throwable;
-
+
public NormalizedParameters(String message, Object[] arguments, Throwable throwable) {
this.message = message;
this.arguments = arguments;
@@ -35,6 +38,79 @@ public class NormalizedParameters {
return throwable;
}
+ /**
+ * Helper method to determine if an {@link Object} array contains a
+ * {@link Throwable} as last element
+ *
+ * @param argArray The arguments off which we want to know if it contains a
+ * {@link Throwable} as last element
+ * @return if the last {@link Object} in argArray is a {@link Throwable} this
+ * method will return it, otherwise it returns null
+ */
+ public static Throwable getThrowableCandidate(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ return null;
+ }
+
+ final Object lastEntry = argArray[argArray.length - 1];
+ if (lastEntry instanceof Throwable) {
+ return (Throwable) lastEntry;
+ }
+
+ return null;
+ }
+
+ /**
+ * Helper method to get all but the last element of an array
+ *
+ * @param argArray The arguments from which we want to remove the last element
+ *
+ * @return a copy of the array without the last element
+ */
+ public static Object[] trimmedCopy(final Object[] argArray) {
+ if (argArray == null || argArray.length == 0) {
+ throw new IllegalStateException("non-sensical empty or null argument array");
+ }
+
+ final int trimmedLen = argArray.length - 1;
+
+ Object[] trimmed = new Object[trimmedLen];
+
+ if (trimmedLen > 0) {
+ System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
+ }
+
+ return trimmed;
+ }
+
+ /**
+ * This method serves to normalize logging call invocation parameters.
+ *
+ * More specifically, if a throwable argument is not supplied directly, it
+ * attempts to extract it from the argument array.
+ */
+ public static NormalizedParameters normalize(String msg, Object[] arguments, Throwable t) {
+
+ if (t != null) {
+ return new NormalizedParameters(msg, arguments, t);
+ }
+
+ if (arguments == null || arguments.length == 0) {
+ return new NormalizedParameters(msg, arguments, t);
+ }
+
+ Throwable throwableCandidate = NormalizedParameters.getThrowableCandidate(arguments);
+ if (throwableCandidate != null) {
+ Object[] trimmedArguments = MessageFormatter.trimmedCopy(arguments);
+ return new NormalizedParameters(msg, trimmedArguments, throwableCandidate);
+ } else {
+ return new NormalizedParameters(msg, arguments);
+ }
+
+ }
+
+ public static NormalizedParameters normalize(LoggingEvent event) {
+ return normalize(event.getMessage(), event.getArgumentArray(), event.getThrowable());
+ }
-
}
diff --git a/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java b/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
deleted file mode 100644
index 83a133c6..00000000
--- a/slf4j-api/src/main/java/org/slf4j/helpers/ParameterNormalizer.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package org.slf4j.helpers;
-
-/**
- * This class serves to normalize logging call invocation parameters.
- *
- * More specifically, if a throwable argument is not supplied directly, it
- * attempts to extract it from the argument array.
- *
- * @author ceki
- * @since 2.0
- */
-public class ParameterNormalizer {
-
- public static NormalizedParameters normalize(String msg, Object[] arguments, Throwable t) {
-
- if (t != null) {
- return new NormalizedParameters(msg, arguments, t);
- }
-
- if (arguments == null || arguments.length == 0) {
- return new NormalizedParameters(msg, arguments, t);
- }
-
- Throwable throwableCandidate = getThrowableCandidate(arguments);
- if (throwableCandidate != null) {
- Object[] trimmedArguments = MessageFormatter.trimmedCopy(arguments);
- return new NormalizedParameters(msg, trimmedArguments, throwableCandidate);
- } else {
- return new NormalizedParameters(msg, arguments);
- }
-
- }
-
- /**
- * Helper method to determine if an {@link Object} array contains a
- * {@link Throwable} as last element
- *
- * @param argArray The arguments off which we want to know if it contains a
- * {@link Throwable} as last element
- * @return if the last {@link Object} in argArray is a {@link Throwable} this
- * method will return it, otherwise it returns null
- */
- public static Throwable getThrowableCandidate(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- return null;
- }
-
- final Object lastEntry = argArray[argArray.length - 1];
- if (lastEntry instanceof Throwable) {
- return (Throwable) lastEntry;
- }
-
- return null;
- }
-
- /**
- * Helper method to get all but the last element of an array
- *
- * @param argArray The arguments from which we want to remove the last element
- *
- * @return a copy of the array without the last element
- */
- public static Object[] trimmedCopy(final Object[] argArray) {
- if (argArray == null || argArray.length == 0) {
- throw new IllegalStateException("non-sensical empty or null argument array");
- }
-
- final int trimmedLen = argArray.length - 1;
-
- Object[] trimmed = new Object[trimmedLen];
-
- if (trimmedLen > 0) {
- System.arraycopy(argArray, 0, trimmed, 0, trimmedLen);
- }
-
- return trimmed;
- }
-
-}
diff --git a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
index 92c76b8a..5654dce3 100755
--- a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
+++ b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
@@ -36,7 +36,6 @@ import org.slf4j.helpers.FormattingTuple;
import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.NormalizedParameters;
-import org.slf4j.helpers.ParameterNormalizer;
import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.spi.LocationAwareLogger;
@@ -174,7 +173,7 @@ public final class JDK14LoggerAdapter extends LegacyAbstractLogger implements Lo
Level julLevel = slf4jLevelIntToJULLevel(slf4jLevelInt);
if (logger.isLoggable(julLevel)) {
- NormalizedParameters np = ParameterNormalizer.normalize(message, arguments, throwable);
+ NormalizedParameters np = NormalizedParameters.normalize(message, arguments, throwable);
innerNormalizedLoggingCallHandler(callerFQCN, slf4jLevel, marker, np.getMessage(), np.getArguments(), np.getThrowable());
}
}
diff --git a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
index dbe72628..9f8d1660 100755
--- a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
+++ b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
@@ -37,7 +37,6 @@ import org.slf4j.event.LoggingEvent;
import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.NormalizedParameters;
-import org.slf4j.helpers.ParameterNormalizer;
import org.slf4j.helpers.SubstituteLogger;
import org.slf4j.spi.LocationAwareLogger;
@@ -148,7 +147,7 @@ public final class Log4jLoggerAdapter extends LegacyAbstractLogger implements Lo
@Override
public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
Level log4jLevel = toLog4jLevel(level);
- NormalizedParameters np = ParameterNormalizer.normalize(msg, arguments, t);
+ NormalizedParameters np = NormalizedParameters.normalize(msg, arguments, t);
String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
}
diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
index d2c49396..35da2905 100644
--- a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
+++ b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
@@ -25,18 +25,17 @@
package org.slf4j.simple;
import java.io.PrintStream;
+import java.util.ArrayList;
import java.util.Date;
+import java.util.List;
import org.slf4j.Logger;
import org.slf4j.Marker;
import org.slf4j.event.Level;
import org.slf4j.event.LoggingEvent;
-import org.slf4j.helpers.AbstractLogger;
-import org.slf4j.helpers.FormattingTuple;
-import org.slf4j.helpers.MarkerIgnoringBase;
+import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.NormalizedParameters;
-import org.slf4j.helpers.ParameterNormalizer;
import org.slf4j.spi.LocationAwareLogger;
/**
@@ -144,7 +143,7 @@ import org.slf4j.spi.LocationAwareLogger;
* @author Robert Burrell Donkin
* @author Cédrik LIME
*/
-public class SimpleLogger extends AbstractLogger {
+public class SimpleLogger extends LegacyAbstractLogger {
private static final long serialVersionUID = -632788891211436180L;
@@ -352,8 +351,19 @@ public class SimpleLogger extends AbstractLogger {
protected void handleNormalizedLoggingCall(Level level, Marker marker, String messagePattern, Object[] arguments,
Throwable t) {
- first convert to an event and then log
+ List markers = null;
+ if(marker != null) {
+ markers = new ArrayList();
+ markers.add(marker);
+ }
+
+ innerHandleNormalizedLoggingCall(level, markers, messagePattern, arguments, t);
+ }
+
+ private void innerHandleNormalizedLoggingCall(Level level, List markers, String messagePattern, Object[] arguments,
+ Throwable t) {
+
StringBuilder buf = new StringBuilder(32);
// Append date-time if so configured
@@ -393,8 +403,13 @@ public class SimpleLogger extends AbstractLogger {
buf.append(String.valueOf(name)).append(" - ");
}
- buf.append(SP).append(marker.getName()).append(SP);
-
+ if(markers != null) {
+ buf.append(SP);
+ for(Marker marker: markers) {
+ buf.append(marker.getName()).append(SP);
+ }
+ }
+
String formattedMessage = MessageFormatter.basicArrayFormat(messagePattern, arguments);
// Append the message
@@ -411,15 +426,9 @@ public class SimpleLogger extends AbstractLogger {
return;
}
- NormalizedParameters np = ParameterNormalizer.normalize(event);
+ NormalizedParameters np = NormalizedParameters.normalize(event);
-
-
- FormattingTuple tp = MessageFormatter.arrayFormat(event.getMessage(), event.getArgumentArray(),
- event.getThrowable());
-
- handleNormalizedLoggingCall(level, event.getMarkers(), messagePattern, arguments, t);
- log(event.getLevel(), tp.getMessage(), event.getThrowable());
+ innerHandleNormalizedLoggingCall(event.getLevel(), event.getMarkers(), np.getMessage(), np.getArguments(), event.getThrowable());
}
@Override
@@ -427,4 +436,5 @@ public class SimpleLogger extends AbstractLogger {
return null;
}
+
}
diff --git a/slf4j-simple/src/test/java/org/slf4j/simple/SimpleLoggerMultithreadedInitializationTest.java b/slf4j-simple/src/test/java/org/slf4j/simple/SimpleLoggerMultithreadedInitializationTest.java
index ece98c0b..ff3b49bb 100644
--- a/slf4j-simple/src/test/java/org/slf4j/simple/SimpleLoggerMultithreadedInitializationTest.java
+++ b/slf4j-simple/src/test/java/org/slf4j/simple/SimpleLoggerMultithreadedInitializationTest.java
@@ -46,7 +46,7 @@ public class SimpleLoggerMultithreadedInitializationTest extends MultithreadedIn
static int NUM_LINES_IN_SLF4J_REPLAY_WARNING = 3;
private final PrintStream oldErr = System.err;
final String loggerName = this.getClass().getName();
- StringPrintStream sps = new StringPrintStream(oldErr, true);
+ StringPrintStream sps = new StringPrintStream(oldErr, false);
@Before
public void setup() {
From 0ae60630b57aa5b174cbeeb304f9fa113dccefb1 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 8 Sep 2019 16:53:00 +0200
Subject: [PATCH 035/121] fix test
---
.../src/test/java/org/slf4j/event/EventRecodingLoggerTest.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
index e0cd6b04..8e6ed748 100644
--- a/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/event/EventRecodingLoggerTest.java
@@ -501,7 +501,7 @@ public class EventRecodingLoggerTest {
assertNotNull(event);
if (marker == null) {
- assertNull(event.getMarkers().get(0));
+ assertNull(event.getMarkers());
} else {
assertEquals(marker, event.getMarkers().get(0));
}
From 80b7d224e81e33eeba0415627b0af8cfa6f36bb6 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 8 Sep 2019 17:04:27 +0200
Subject: [PATCH 036/121] cosmetic changes
---
.../src/main/java/org/slf4j/event/EventRecodingLogger.java | 1 -
slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java | 2 --
2 files changed, 3 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
index aae0af50..dd4581f6 100755
--- a/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
+++ b/slf4j-api/src/main/java/org/slf4j/event/EventRecodingLogger.java
@@ -1,7 +1,6 @@
package org.slf4j.event;
import java.util.Queue;
-import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Marker;
import org.slf4j.helpers.LegacyAbstractLogger;
diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
index 35da2905..3dfacf32 100644
--- a/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
+++ b/slf4j-simple/src/main/java/org/slf4j/simple/SimpleLogger.java
@@ -241,8 +241,6 @@ public class SimpleLogger extends LegacyAbstractLogger {
}
-
-
void write(StringBuilder buf, Throwable t) {
PrintStream targetStream = CONFIG_PARAMS.outputChoice.getTargetPrintStream();
From b726801a9be39b78cd4f4cf98a7f95e9b0128ec6 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 8 Sep 2019 17:53:15 +0200
Subject: [PATCH 037/121] makeLoggingEventBuilder made public
---
slf4j-api/src/main/java/org/slf4j/Logger.java | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/Logger.java b/slf4j-api/src/main/java/org/slf4j/Logger.java
index 307dc1fc..81a9c340 100644
--- a/slf4j-api/src/main/java/org/slf4j/Logger.java
+++ b/slf4j-api/src/main/java/org/slf4j/Logger.java
@@ -98,11 +98,10 @@ public interface Logger {
* @return a new {@link LoggingEventBuilder} instance as appropriate for this logger
* @since 2.0
*/
- default LoggingEventBuilder makeLoggingEventBuilder(Level level) {
+ default public LoggingEventBuilder makeLoggingEventBuilder(Level level) {
return new DefaultLoggingEventBuilder(this, level);
}
-
/**
* Is the logger instance enabled for the TRACE level?
*
From a4010572cbe9810d184359e9944583c635f6446a Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 1 Oct 2019 20:06:40 +0200
Subject: [PATCH 038/121] have slf4j log markers and key-value pairs by default
---
.../slf4j/spi/DefaultLoggingEventBuilder.java | 29 ++++++++++++++++---
1 file changed, 25 insertions(+), 4 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
index 41a74af0..93c669b6 100755
--- a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
+++ b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
@@ -107,7 +107,7 @@ public class DefaultLoggingEventBuilder implements LoggingEventBuilder {
combinedArguments[argLen] = t;
}
- msg = mergeKeyValuePairs(logggingEvent, msg);
+ msg = mergeMarkersAndKeyValuePairs(logggingEvent, msg);
switch (logggingEvent.getLevel()) {
case TRACE:
@@ -129,21 +129,42 @@ public class DefaultLoggingEventBuilder implements LoggingEventBuilder {
}
- private String mergeKeyValuePairs(LoggingEvent logggingEvent, String msg) {
+ /**
+ * Prepend markers and key-value pairs to the message.
+ *
+ * @param logggingEvent
+ * @param msg
+ * @return
+ */
+ private String mergeMarkersAndKeyValuePairs(LoggingEvent logggingEvent, String msg) {
+ StringBuilder sb = null;
+
+ if(loggingEvent.getMarkers() != null) {
+ sb = new StringBuilder();
+ for(Marker marker: logggingEvent.getMarkers()) {
+ sb.append(marker);
+ sb.append(' ');
+ }
+ }
+
if(logggingEvent.getKeyValuePairs() != null) {
- StringBuilder sb = new StringBuilder();
+ if(sb == null) {
+ sb = new StringBuilder();
+ }
for(KeyValuePair kvp: logggingEvent.getKeyValuePairs()) {
sb.append(kvp.key);
sb.append('=');
sb.append(kvp.value);
sb.append(' ');
}
+ }
+
+ if(sb != null) {
sb.append(msg);
return sb.toString();
} else {
return msg;
-
}
}
From 0c1d72b602da6599e1637c92e9ecb3292afdc3b7 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 1 Oct 2019 21:22:21 +0200
Subject: [PATCH 039/121] version 2.0.0-alpha1
---
integration/pom.xml | 2 +-
jcl-over-slf4j/pom.xml | 2 +-
jul-to-slf4j/pom.xml | 2 +-
log4j-over-slf4j/pom.xml | 2 +-
osgi-over-slf4j/pom.xml | 2 +-
pom.xml | 2 +-
slf4j-api/pom.xml | 2 +-
slf4j-ext/pom.xml | 2 +-
slf4j-jdk14/pom.xml | 2 +-
slf4j-log4j12/pom.xml | 2 +-
slf4j-nop/pom.xml | 2 +-
slf4j-simple/pom.xml | 2 +-
slf4j-site/pom.xml | 2 +-
13 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/integration/pom.xml b/integration/pom.xml
index 3cc73735..4e19a3b6 100755
--- a/integration/pom.xml
+++ b/integration/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1integration
diff --git a/jcl-over-slf4j/pom.xml b/jcl-over-slf4j/pom.xml
index e1d07e53..fefeacca 100755
--- a/jcl-over-slf4j/pom.xml
+++ b/jcl-over-slf4j/pom.xml
@@ -5,7 +5,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha14.0.0
diff --git a/jul-to-slf4j/pom.xml b/jul-to-slf4j/pom.xml
index 1e0e3d2f..1209fdf4 100755
--- a/jul-to-slf4j/pom.xml
+++ b/jul-to-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1jul-to-slf4j
diff --git a/log4j-over-slf4j/pom.xml b/log4j-over-slf4j/pom.xml
index 4b4c8c30..b6c54387 100755
--- a/log4j-over-slf4j/pom.xml
+++ b/log4j-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1
diff --git a/osgi-over-slf4j/pom.xml b/osgi-over-slf4j/pom.xml
index e3f8fe1e..9e642dac 100755
--- a/osgi-over-slf4j/pom.xml
+++ b/osgi-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1osgi-over-slf4j
diff --git a/pom.xml b/pom.xml
index d612737a..dd6caf85 100755
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1pomSLF4J
diff --git a/slf4j-api/pom.xml b/slf4j-api/pom.xml
index 56f7e24e..d1c9a26c 100755
--- a/slf4j-api/pom.xml
+++ b/slf4j-api/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-api
diff --git a/slf4j-ext/pom.xml b/slf4j-ext/pom.xml
index c85962ac..6871c371 100755
--- a/slf4j-ext/pom.xml
+++ b/slf4j-ext/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-ext
diff --git a/slf4j-jdk14/pom.xml b/slf4j-jdk14/pom.xml
index 049c425c..3e2ecf8d 100755
--- a/slf4j-jdk14/pom.xml
+++ b/slf4j-jdk14/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-jdk14
diff --git a/slf4j-log4j12/pom.xml b/slf4j-log4j12/pom.xml
index 94192ec0..f92833c5 100755
--- a/slf4j-log4j12/pom.xml
+++ b/slf4j-log4j12/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-log4j12
diff --git a/slf4j-nop/pom.xml b/slf4j-nop/pom.xml
index 7fe33ff3..fb25add5 100755
--- a/slf4j-nop/pom.xml
+++ b/slf4j-nop/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-nop
diff --git a/slf4j-simple/pom.xml b/slf4j-simple/pom.xml
index e7d7eb9d..9e61d01a 100755
--- a/slf4j-simple/pom.xml
+++ b/slf4j-simple/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-simple
diff --git a/slf4j-site/pom.xml b/slf4j-site/pom.xml
index ea9cdaf9..8b828d93 100755
--- a/slf4j-site/pom.xml
+++ b/slf4j-site/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1-SNAPSHOT
+ 2.0.0-alpha1slf4j-site
From 233803688a809fa8ea599306a058351d4c4246a4 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 1 Oct 2019 21:25:16 +0200
Subject: [PATCH 040/121] start work on 2.0.0-alpha2-SNAPSHOT
---
integration/pom.xml | 2 +-
jcl-over-slf4j/pom.xml | 2 +-
jul-to-slf4j/pom.xml | 2 +-
log4j-over-slf4j/pom.xml | 2 +-
osgi-over-slf4j/pom.xml | 2 +-
pom.xml | 2 +-
slf4j-api/pom.xml | 2 +-
slf4j-ext/pom.xml | 2 +-
slf4j-jdk14/pom.xml | 2 +-
slf4j-log4j12/pom.xml | 2 +-
slf4j-nop/pom.xml | 2 +-
slf4j-simple/pom.xml | 2 +-
slf4j-site/pom.xml | 2 +-
13 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/integration/pom.xml b/integration/pom.xml
index 4e19a3b6..5ba9cf5b 100755
--- a/integration/pom.xml
+++ b/integration/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTintegration
diff --git a/jcl-over-slf4j/pom.xml b/jcl-over-slf4j/pom.xml
index fefeacca..6ee35396 100755
--- a/jcl-over-slf4j/pom.xml
+++ b/jcl-over-slf4j/pom.xml
@@ -5,7 +5,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOT4.0.0
diff --git a/jul-to-slf4j/pom.xml b/jul-to-slf4j/pom.xml
index 1209fdf4..ce2856f1 100755
--- a/jul-to-slf4j/pom.xml
+++ b/jul-to-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTjul-to-slf4j
diff --git a/log4j-over-slf4j/pom.xml b/log4j-over-slf4j/pom.xml
index b6c54387..19144dab 100755
--- a/log4j-over-slf4j/pom.xml
+++ b/log4j-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOT
diff --git a/osgi-over-slf4j/pom.xml b/osgi-over-slf4j/pom.xml
index 9e642dac..2ab6e7c9 100755
--- a/osgi-over-slf4j/pom.xml
+++ b/osgi-over-slf4j/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTosgi-over-slf4j
diff --git a/pom.xml b/pom.xml
index dd6caf85..8db94df9 100755
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTpomSLF4J
diff --git a/slf4j-api/pom.xml b/slf4j-api/pom.xml
index d1c9a26c..fe4b0264 100755
--- a/slf4j-api/pom.xml
+++ b/slf4j-api/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-api
diff --git a/slf4j-ext/pom.xml b/slf4j-ext/pom.xml
index 6871c371..b0cea701 100755
--- a/slf4j-ext/pom.xml
+++ b/slf4j-ext/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-ext
diff --git a/slf4j-jdk14/pom.xml b/slf4j-jdk14/pom.xml
index 3e2ecf8d..4163f3f9 100755
--- a/slf4j-jdk14/pom.xml
+++ b/slf4j-jdk14/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-jdk14
diff --git a/slf4j-log4j12/pom.xml b/slf4j-log4j12/pom.xml
index f92833c5..787990e8 100755
--- a/slf4j-log4j12/pom.xml
+++ b/slf4j-log4j12/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-log4j12
diff --git a/slf4j-nop/pom.xml b/slf4j-nop/pom.xml
index fb25add5..7f15bb12 100755
--- a/slf4j-nop/pom.xml
+++ b/slf4j-nop/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-nop
diff --git a/slf4j-simple/pom.xml b/slf4j-simple/pom.xml
index 9e61d01a..7a199382 100755
--- a/slf4j-simple/pom.xml
+++ b/slf4j-simple/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-simple
diff --git a/slf4j-site/pom.xml b/slf4j-site/pom.xml
index 8b828d93..d7043698 100755
--- a/slf4j-site/pom.xml
+++ b/slf4j-site/pom.xml
@@ -7,7 +7,7 @@
org.slf4jslf4j-parent
- 2.0.0-alpha1
+ 2.0.0-alpha2-SNAPSHOTslf4j-site
From 8756e69497cb70d4311762a813672fe74867eb58 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 4 Oct 2019 20:28:51 +0200
Subject: [PATCH 041/121] document release info for 2.0-alpha1
---
slf4j-site/src/site/pages/faq.html | 5 ++++
slf4j-site/src/site/pages/news.html | 40 ++++++++++++++++++++++++++---
2 files changed, 41 insertions(+), 4 deletions(-)
diff --git a/slf4j-site/src/site/pages/faq.html b/slf4j-site/src/site/pages/faq.html
index 3b2ecf08..1aa32223 100755
--- a/slf4j-site/src/site/pages/faq.html
+++ b/slf4j-site/src/site/pages/faq.html
@@ -357,10 +357,15 @@
+
Applicable to 2.x Note that the
+ 2.0.x series builds upon the 1.8.x series, as such the remarks
+ below are applicable to SLF4J 2.x as well.
+
There are no client facing API changes in 1.8.x. For most
users upgrading to version 1.8.x should be a drop-in replacement
as long as the logging provider is updated as well.
+
In version 1.8.0, SLF4J has been modularized per JPMS/Jigsaw
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 85635ff0..f0c22030 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -37,17 +37,49 @@
class names in
-->
-
+
+
• Fixed incorrect handling of Throwable as
+ last parameter in SLF4J-466.
+
+
From 33dc75073058265fcd53d3e36ce3780b4ed9a6d7 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 11 Oct 2019 12:33:53 +0200
Subject: [PATCH 042/121] remove link to tar.gz or zip distributions
---
slf4j-site/src/site/pages/download.html | 39 +++++++------------------
1 file changed, 10 insertions(+), 29 deletions(-)
diff --git a/slf4j-site/src/site/pages/download.html b/slf4j-site/src/site/pages/download.html
index 2516436c..7033b43b 100755
--- a/slf4j-site/src/site/pages/download.html
+++ b/slf4j-site/src/site/pages/download.html
@@ -43,39 +43,20 @@
Latest STABLE version
-
Download version ${latest.stable.version} including full source code,
- class files and documentation in ZIP or TAR.GZ format:
The "host" server will stop supporting SSL connections.
-
-
Please update your links.
+
The "host" server will
+ eventually stop supporting incoming SSL connections. Please
+ update your links accordingly.
-
Redirecting you to TARGET in 15 seconds
+
Redirecting you to TARGET in 15
+ seconds.
+
+
+
+
+
+
Why is SSL is being turned off?
+
+
+
Even if letsencrypt certificates are free, renewing these
+ certificates every three months takes time and effort. Given
+ that "host" is load-balanced
+ over several machines, the effort involved in renewing the
+ certificates is non-negligible and could not be fully automated.
+
+
+
+
There is a bigger reason though. We think that mindless
+ security procedures are detrimental to all organizations. When
+ security becomes an overriding concern above all else, it makes
+ organizations wither slowly but surely. Security needs should be
+ applied with intelligence and measure. In larger organizations,
+ the current trend is to apply security-motivated organizational
+ changes first and think later.
+
+
But what about security risks?
+
+
Admittedly, turning off SSL can have adverse affects. An
+ attacker could eavesdrop and steal user credentials. However,
+ the site "host" does not
+ store user credentials. Incidentally, it does not track users
+ nor store cookies either.
+
+
+
In a more severe case, an attacker could intercept the HTTP
+ connection and serve hacked binaries. To eliminate this risk
+ altogether, the site "host"
+ will no longer directly serve downloadable binaries but
+ indirectly delegate this task to Maven Central where 99% of
+ users download the binaries anyhow.
+
+
+
+
-
-
Would you like to subscribe to the QOS.CH announcements mailing
- list?
-
-
-
The list is reserved for announcements related to QOS.CH
- projects such as cal10n, logback, mistletoe and SLF4J.
Note that slf4j-api versions 2.0.x and later use the ServiceLoader
+ mechanism. Backends such as logback 1.3 and later which target
+ slf4j-api 2.x, do not ship with
+ org.slf4j.impl.StaticLoggerBinder. If you place a
+ logging backend which targets slf4j-api 2.0.x, you need
+ slf4j-api-2.x.jar on the classpath. See also relevant faq entry.
+
+
since 1.6.0 As of SLF4J version 1.6,
in the absence of a binding, SLF4J will default to a no-operation
(NOP) logger implementation.
@@ -351,7 +362,7 @@ class B extends A {
declare a dependency on any SLF4J binding but only depend on
slf4j-api. When a library declares a compile-time dependency on a
SLF4J binding, it imposes that binding on the end-user, thus
- negating SLF4J's purpose. When you come across an embedded
+ negating SLF4J’s purpose. When you come across an embedded
component declaring a compile-time dependency on any SLF4J binding,
please take the time to contact the authors of said
component/library and kindly ask them to mend their ways.
@@ -373,16 +384,16 @@ class B extends A {
slf4j-simple-${project.version}.jar, using slf4j-simple-1.5.5.jar
will not work.
-
Note From the client's
+
Note From the client’s
perspective all versions of slf4j-api are compatible. Client code
compiled with slf4j-api-N.jar will run perfectly fine
with slf4j-api-M.jar for any N and M. You only need to
ensure that the version of your binding matches that of the
slf4j-api.jar. You do not have to worry about the version of
- slf4j-api.jar used by a given dependency in your project. You
- can always use any version of slf4j-api.jar, and as long
- as the version of slf4j-api.jar and its binding match,
- you should be fine.
+ slf4j-api.jar used by a given dependency in your project. You can
+ always use any version of slf4j-api.jar, and as long as
+ the version of slf4j-api.jar and its binding match, you
+ should be fine.
At initialization time, if SLF4J suspects that there may be a
From 7c56fe22ebdcadecca12db136c4535c25d9622b5 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Wed, 16 Oct 2019 20:32:17 +0200
Subject: [PATCH 050/121] minor edit
---
slf4j-site/src/site/pages/codes.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/slf4j-site/src/site/pages/codes.html b/slf4j-site/src/site/pages/codes.html
index 20279988..44a599c2 100755
--- a/slf4j-site/src/site/pages/codes.html
+++ b/slf4j-site/src/site/pages/codes.html
@@ -362,7 +362,7 @@ class B extends A {
declare a dependency on any SLF4J binding but only depend on
slf4j-api. When a library declares a compile-time dependency on a
SLF4J binding, it imposes that binding on the end-user, thus
- negating SLF4J’s purpose. When you come across an embedded
+ negating SLF4J's purpose. When you come across an embedded
component declaring a compile-time dependency on any SLF4J binding,
please take the time to contact the authors of said
component/library and kindly ask them to mend their ways.
@@ -384,7 +384,7 @@ class B extends A {
slf4j-simple-${project.version}.jar, using slf4j-simple-1.5.5.jar
will not work.
-
Note From the client’s
+
Note From the client's
perspective all versions of slf4j-api are compatible. Client code
compiled with slf4j-api-N.jar will run perfectly fine
with slf4j-api-M.jar for any N and M. You only need to
From 9a3f1f4928ab9d0e0f423e377bec9754507d9e8e Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Mon, 4 Nov 2019 19:15:33 +0100
Subject: [PATCH 051/121] latest stable is 1.7.29
---
pom.xml | 2 +-
slf4j-site/src/site/pages/download.html | 6 +++---
slf4j-site/src/site/pages/news.html | 8 ++++++++
3 files changed, 12 insertions(+), 4 deletions(-)
diff --git a/pom.xml b/pom.xml
index cdbcf857..b70495e5 100755
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
- 1.7.28
+ 1.7.298${jdk.version}
diff --git a/slf4j-site/src/site/pages/download.html b/slf4j-site/src/site/pages/download.html
index 3a5caf42..ba5fe063 100755
--- a/slf4j-site/src/site/pages/download.html
+++ b/slf4j-site/src/site/pages/download.html
@@ -26,12 +26,12 @@
Latest STABLE version
The latest stable SLF4J is version
- ${latest.stable.version}.
+ ${latest.stable.version}.
EXPERIMENTAL/UNSTABLE version
-
SLF4J version ${project.version} is the most recent but it is
- also experimental/unstable.
+
SLF4J version ${project.version} is
+ the most recent but it is also experimental/unstable.
Maven central
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index f0c22030..18ba5fce 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -37,7 +37,15 @@
class names in
-->
+
+
31st of October, 2019 - Release of SLF4J 1.7.29
+
+
In the pom file for jcl-over-slf4j module, the Apache
+ license is now explicitly mentioned. In previous versions, the
+ Apache license for the jcl-over-slf4j was mentioned in
+ java source code and the LICENSE.txt file.
+
October 1st, 2019 - Release of SLF4J 2.0.0-alpha1
From 27358d395c8b1f47a9c13ca47bbff33e75dd1fa3 Mon Sep 17 00:00:00 2001
From: David Harsha
Date: Mon, 9 Dec 2019 20:16:33 -0800
Subject: [PATCH 052/121] Fix NOP fallback memory leak
Substitute loggers are not getting "fixed" when no SLF4J provider is
found, which means `SUBST_PROVIDER` will add messages to its
`LinkedBlockingQueue` until the process runs out of memory.
`NoBindingMultithreadedInitializationTest` doesn't contain any
assertions of its own because `MultithreadedInitializationTest` already
asserts loggers are fixed in `assertAllSubstLoggersAreFixed`.
https://jira.qos.ch/browse/SLF4J-469
---
.../main/java/org/slf4j/LoggerFactory.java | 8 +--
...indingMultithreadedInitializationTest.java | 55 +++++++++++++++++++
.../MultithreadedInitializationTest.java | 2 +-
3 files changed, 60 insertions(+), 5 deletions(-)
create mode 100644 slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
index 2c6e0970..ab120508 100755
--- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
@@ -152,10 +152,6 @@ public final class LoggerFactory {
PROVIDER.initialize();
INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION;
reportActualBinding(providersList);
- fixSubstituteLoggers();
- replayEvents();
- // release all resources in SUBST_FACTORY
- SUBST_PROVIDER.getSubstituteLoggerFactory().clear();
} else {
INITIALIZATION_STATE = NOP_FALLBACK_INITIALIZATION;
Util.report("No SLF4J providers were found.");
@@ -165,6 +161,10 @@ public final class LoggerFactory {
Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
reportIgnoredStaticLoggerBinders(staticLoggerBinderPathSet);
}
+ fixSubstituteLoggers();
+ replayEvents();
+ // release all resources in SUBST_FACTORY
+ SUBST_PROVIDER.getSubstituteLoggerFactory().clear();
} catch (Exception e) {
failedBinding(e);
throw new IllegalStateException("Unexpected initialization failure", e);
diff --git a/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java b/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
new file mode 100644
index 00000000..4cf3ee42
--- /dev/null
+++ b/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
@@ -0,0 +1,55 @@
+/**
+ * Copyright (c) 2004-2016 QOS.ch
+ * All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining
+ * a copy of this software and associated documentation files (the
+ * "Software"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sublicense, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+ * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+ * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+ * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ */
+package org.slf4j;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.After;
+import org.junit.Before;
+
+import org.slf4j.testHarness.MultithreadedInitializationTest;
+
+public class NoBindingMultithreadedInitializationTest extends MultithreadedInitializationTest {
+ final String loggerName = this.getClass().getName();
+
+ @Before
+ public void setup() {
+ System.out.println("THREAD_COUNT=" + THREAD_COUNT);
+ LoggerFactoryFriend.reset();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ LoggerFactoryFriend.reset();
+ }
+
+ @Override
+ protected long getRecordedEventCount() {
+ return eventCount.get();
+ }
+}
diff --git a/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java b/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
index d2225c85..4767c7ac 100644
--- a/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
@@ -23,7 +23,7 @@ abstract public class MultithreadedInitializationTest {
private final List createdLoggers = Collections.synchronizedList(new ArrayList());
- final private AtomicLong eventCount = new AtomicLong(0);
+ final protected AtomicLong eventCount = new AtomicLong(0);
final private CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
int diff = new Random().nextInt(10000);
From 2ac2e807ea498524fc946baae1fde94b3552435c Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 10 Dec 2019 09:17:29 +0100
Subject: [PATCH 053/121] minor refactoring, docs
---
.../src/main/java/org/slf4j/LoggerFactory.java | 12 ++++++++----
.../NoBindingMultithreadedInitializationTest.java | 14 +++++++-------
.../MultithreadedInitializationTest.java | 3 ---
3 files changed, 15 insertions(+), 14 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
index ab120508..023b2351 100755
--- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
+++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java
@@ -161,10 +161,7 @@ public final class LoggerFactory {
Set staticLoggerBinderPathSet = findPossibleStaticLoggerBinderPathSet();
reportIgnoredStaticLoggerBinders(staticLoggerBinderPathSet);
}
- fixSubstituteLoggers();
- replayEvents();
- // release all resources in SUBST_FACTORY
- SUBST_PROVIDER.getSubstituteLoggerFactory().clear();
+ postBindCleanUp();
} catch (Exception e) {
failedBinding(e);
throw new IllegalStateException("Unexpected initialization failure", e);
@@ -211,6 +208,13 @@ public final class LoggerFactory {
return staticLoggerBinderPathSet;
}
+ private static void postBindCleanUp() {
+ fixSubstituteLoggers();
+ replayEvents();
+ // release all resources in SUBST_FACTORY
+ SUBST_PROVIDER.getSubstituteLoggerFactory().clear();
+ }
+
private static void fixSubstituteLoggers() {
synchronized (SUBST_PROVIDER) {
SUBST_PROVIDER.getSubstituteLoggerFactory().postInitialization();
diff --git a/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java b/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
index 4cf3ee42..d364997e 100644
--- a/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/NoBindingMultithreadedInitializationTest.java
@@ -24,22 +24,22 @@
*/
package org.slf4j;
-import java.io.PrintStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
import org.junit.After;
import org.junit.Before;
-
import org.slf4j.testHarness.MultithreadedInitializationTest;
+/**
+ * Checks that when no binding is present, proper clean up is performed by LoggerFactory.
+ *
+ * See SLF4J-469
+ *
+ * @author David Harsha
+ */
public class NoBindingMultithreadedInitializationTest extends MultithreadedInitializationTest {
final String loggerName = this.getClass().getName();
@Before
public void setup() {
- System.out.println("THREAD_COUNT=" + THREAD_COUNT);
LoggerFactoryFriend.reset();
}
diff --git a/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java b/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
index 4767c7ac..09d57a84 100644
--- a/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
+++ b/slf4j-api/src/test/java/org/slf4j/testHarness/MultithreadedInitializationTest.java
@@ -6,7 +6,6 @@ import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
-import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicLong;
@@ -26,8 +25,6 @@ abstract public class MultithreadedInitializationTest {
final protected AtomicLong eventCount = new AtomicLong(0);
final private CyclicBarrier barrier = new CyclicBarrier(THREAD_COUNT + 1);
- int diff = new Random().nextInt(10000);
-
@Test
public void multiThreadedInitialization() throws InterruptedException, BrokenBarrierException {
@SuppressWarnings("unused")
From 715b5911858b13a89e5fa9df13f4ca03d72850f7 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Fri, 20 Dec 2019 16:27:47 +0100
Subject: [PATCH 054/121] news about 1.7.30
---
pom.xml | 2 +-
slf4j-site/src/site/pages/news.html | 10 ++++++++++
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index b70495e5..0d1641d7 100755
--- a/pom.xml
+++ b/pom.xml
@@ -33,7 +33,7 @@
- 1.7.29
+ 1.7.308${jdk.version}
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index 18ba5fce..ec61f351 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -39,6 +39,15 @@
+
16th of December, 2019 - Release of SLF4J 1.7.30
+
+
Fixed a memory leak in case of no provided binding and
+ multi-threaded initialization as described in SLF4J-469. Many
+ thanks to David Harsha to providing the relevant PR.
+
+
+
31st of October, 2019 - Release of SLF4J 1.7.29
In the pom file for jcl-over-slf4j module, the Apache
@@ -47,6 +56,7 @@
java source code and the LICENSE.txt file.
+
October 1st, 2019 - Release of SLF4J 2.0.0-alpha1
The the 2.0.x series requires Java 8 and
From 76ee1112e5ec4d26227ba1f398e834d9ac51e2c4 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Sun, 19 Jan 2020 08:48:56 +0100
Subject: [PATCH 055/121] update link to Maven central
---
slf4j-site/src/site/pages/download.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/slf4j-site/src/site/pages/download.html b/slf4j-site/src/site/pages/download.html
index ba5fe063..6935669b 100755
--- a/slf4j-site/src/site/pages/download.html
+++ b/slf4j-site/src/site/pages/download.html
@@ -37,7 +37,7 @@
From e2c29c81df6fb405a3c5a6dfd1cf28ba26a7c1d6 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Mon, 24 Feb 2020 10:28:51 +0100
Subject: [PATCH 056/121] minor edit
---
slf4j-site/src/site/pages/migrator.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/slf4j-site/src/site/pages/migrator.html b/slf4j-site/src/site/pages/migrator.html
index 499b8835..ddc040ec 100755
--- a/slf4j-site/src/site/pages/migrator.html
+++ b/slf4j-site/src/site/pages/migrator.html
@@ -185,11 +185,11 @@ will be converted as
-
Calls to finest(), finer() or
+
Calls to fine(), finer() or
finest() methods of
java.util.logging.Logger are left as is.
-
Given that finest(), finer() or
+
Given that fine(), finer() or
finest() calls could map to both trace() or debug()
calls in SLF4J, it is impossible to guess how the user wants to
map these calls.
From 61e879fa3293b4cb6d946dbdbd8c99c344f14aac Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Mon, 14 Jun 2021 15:53:45 +0200
Subject: [PATCH 057/121] fix SLF4J-511 for j.u.l
---
.../java/org/slf4j/jul/JDK14LoggerAdapter.java | 6 ++++--
.../java/org/slf4j/issue/CallerInfoTest.java | 17 ++++++++++++++++-
2 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
index 5654dce3..a27fab49 100755
--- a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
+++ b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
@@ -37,6 +37,7 @@ import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.NormalizedParameters;
import org.slf4j.helpers.SubstituteLogger;
+import org.slf4j.spi.DefaultLoggingEventBuilder;
import org.slf4j.spi.LocationAwareLogger;
/**
@@ -220,8 +221,9 @@ public final class JDK14LoggerAdapter extends LegacyAbstractLogger implements Lo
static String SUPER = LegacyAbstractLogger.class.getName();
static String SUPER_OF_SUPER = AbstractLogger.class.getName();
static String SUBSTITUE = SubstituteLogger.class.getName();
-
- static String BARRIER_CLASSES[] = new String[] { SUPER_OF_SUPER, SUPER, SELF, SUBSTITUE };
+ static String FLUENT = DefaultLoggingEventBuilder.class.getName();
+
+ static String BARRIER_CLASSES[] = new String[] { SUPER_OF_SUPER, SUPER, SELF, SUBSTITUE, FLUENT };
private boolean barrierMatch(String callerFQCN, String candidateClassName) {
if (candidateClassName.equals(callerFQCN))
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java b/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
index 198a7a36..7d10a9f4 100755
--- a/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
@@ -58,9 +58,24 @@ public class CallerInfoTest {
assertEquals(1, recordList.size());
LogRecord logRecod = recordList.get(0);
- assertEquals(CallerInfoTest.class.getName(), logRecod.getSourceClassName());
+ assertEquals(this.getClass().getName(), logRecod.getSourceClassName());
}
+ @Test
+ public void testCallerInfoWithFluentAPI() {
+ Logger logger = LoggerFactory.getLogger("bla");
+ logger.atDebug().log("hello");
+
+ List recordList = listHandler.recordList;
+
+ assertEquals(1, recordList.size());
+
+ LogRecord logRecod = recordList.get(0);
+ assertEquals(this.getClass().getName(), logRecod.getSourceClassName());
+ }
+
+
+
@Test
public void testPostInitializationCallerInfoWithSubstituteLogger() {
Logger logger = LoggerFactory.getLogger("bla");
From 57a06aaa2c0f3a018006923a7da919e245bea359 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Mon, 14 Jun 2021 15:55:02 +0200
Subject: [PATCH 058/121] minor doc fix
---
slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java b/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
index 7d10a9f4..b711d97f 100755
--- a/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/issue/CallerInfoTest.java
@@ -61,6 +61,10 @@ public class CallerInfoTest {
assertEquals(this.getClass().getName(), logRecod.getSourceClassName());
}
+
+ // Do we preserve location info using fluent API?
+ // See https://jira.qos.ch/browse/SLF4J-511
+
@Test
public void testCallerInfoWithFluentAPI() {
Logger logger = LoggerFactory.getLogger("bla");
From 3e5110501cad3c77527d1c94eb6c6b5b67de892a Mon Sep 17 00:00:00 2001
From: Antonio Tomac
Date: Thu, 6 Aug 2020 16:15:33 +0200
Subject: [PATCH 059/121] Avoid potentially "expensive" rendering of message
Object to String when log level is disabled SLF4J-497
---
.../logging/impl/SLF4JLocationAwareLog.java | 48 ++++++++++++-----
.../commons/logging/test/InvokeJCLTest.java | 53 +++++++++++++++++++
2 files changed, 89 insertions(+), 12 deletions(-)
diff --git a/jcl-over-slf4j/src/main/java/org/apache/commons/logging/impl/SLF4JLocationAwareLog.java b/jcl-over-slf4j/src/main/java/org/apache/commons/logging/impl/SLF4JLocationAwareLog.java
index 6e856870..7c6dba57 100644
--- a/jcl-over-slf4j/src/main/java/org/apache/commons/logging/impl/SLF4JLocationAwareLog.java
+++ b/jcl-over-slf4j/src/main/java/org/apache/commons/logging/impl/SLF4JLocationAwareLog.java
@@ -104,7 +104,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void trace(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.TRACE_INT, String.valueOf(message), null, null);
+ if (isTraceEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.TRACE_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -117,7 +119,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void trace(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.TRACE_INT, String.valueOf(message), null, t);
+ if (isTraceEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.TRACE_INT, String.valueOf(message), null, t);
+ }
}
/**
@@ -128,7 +132,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void debug(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.DEBUG_INT, String.valueOf(message), null, null);
+ if (isDebugEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.DEBUG_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -141,7 +147,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void debug(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.DEBUG_INT, String.valueOf(message), null, t);
+ if (isDebugEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.DEBUG_INT, String.valueOf(message), null, t);
+ }
}
/**
@@ -152,7 +160,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void info(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.INFO_INT, String.valueOf(message), null, null);
+ if (isInfoEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.INFO_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -165,7 +175,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void info(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.INFO_INT, String.valueOf(message), null, t);
+ if (isInfoEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.INFO_INT, String.valueOf(message), null, t);
+ }
}
/**
@@ -176,7 +188,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void warn(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.WARN_INT, String.valueOf(message), null, null);
+ if (isWarnEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.WARN_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -189,7 +203,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void warn(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.WARN_INT, String.valueOf(message), null, t);
+ if (isWarnEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.WARN_INT, String.valueOf(message), null, t);
+ }
}
/**
@@ -200,7 +216,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void error(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, null);
+ if (isErrorEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -213,7 +231,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void error(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, t);
+ if (isErrorEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, t);
+ }
}
/**
@@ -224,7 +244,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the message to log. Converted to {@link String}
*/
public void fatal(Object message) {
- logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, null);
+ if (isErrorEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, null);
+ }
}
/**
@@ -237,7 +259,9 @@ public class SLF4JLocationAwareLog implements Log, Serializable {
* the exception to log
*/
public void fatal(Object message, Throwable t) {
- logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, t);
+ if (isErrorEnabled()) {
+ logger.log(null, FQCN, LocationAwareLogger.ERROR_INT, String.valueOf(message), null, t);
+ }
}
/**
diff --git a/jcl-over-slf4j/src/test/java/org/apache/commons/logging/test/InvokeJCLTest.java b/jcl-over-slf4j/src/test/java/org/apache/commons/logging/test/InvokeJCLTest.java
index ee9291f8..2ef2e3e3 100644
--- a/jcl-over-slf4j/src/test/java/org/apache/commons/logging/test/InvokeJCLTest.java
+++ b/jcl-over-slf4j/src/test/java/org/apache/commons/logging/test/InvokeJCLTest.java
@@ -27,6 +27,7 @@ package org.apache.commons.logging.test;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
@@ -88,4 +89,56 @@ public class InvokeJCLTest {
log.fatal(null, e);
log.fatal("fatal message", e);
}
+
+ @Test
+ public void testAvoidConvertingObjectToString() {
+ Log log = LogFactory.getLog(InvokeJCLTest.class);
+ Exception e = new Exception("just testing");
+
+ TestMessage fatalMsg = new TestMessage("fatal msg");
+ TestMessage errorMsg = new TestMessage("error msg");
+ TestMessage warnMsg = new TestMessage("warn msg");
+ TestMessage infoMsg = new TestMessage("info msg");
+ TestMessage debugMsg = new TestMessage("debug msg");
+ TestMessage traceMsg = new TestMessage("trace msg");
+
+ log.fatal(fatalMsg);
+ log.fatal(fatalMsg, e);
+ assertEquals(2, fatalMsg.invokedCount);
+
+ log.error(errorMsg);
+ log.error(errorMsg, e);
+ assertEquals(2, errorMsg.invokedCount);
+
+ log.warn(warnMsg);
+ log.warn(warnMsg, e);
+ assertEquals(2, warnMsg.invokedCount);
+
+ log.info(infoMsg);
+ log.info(infoMsg, e);
+ assertEquals(2, infoMsg.invokedCount);
+
+ log.debug(debugMsg);
+ log.debug(debugMsg, e);
+ assertEquals(0, debugMsg.invokedCount);
+
+ log.trace(traceMsg);
+ log.trace(traceMsg, e);
+ assertEquals(0, traceMsg.invokedCount);
+ }
+
+ static class TestMessage {
+
+ private final String msg;
+ int invokedCount = 0;
+
+ TestMessage(String msg) {this.msg = msg;}
+
+ @Override
+ public String toString() {
+ invokedCount++;
+ return msg;
+ }
+ }
+
}
From c34960912ac24aee60b62499210b1ee08c1f2f45 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Tue, 15 Jun 2021 23:03:21 +0200
Subject: [PATCH 060/121] rename private method
---
pom.xml | 27 ++
.../slf4j/spi/DefaultLoggingEventBuilder.java | 4 +-
.../org/slf4j/log4j12/Log4jLoggerAdapter.java | 2 +-
.../org/slf4j/log4j12/InvocationTest.java | 246 ++++++++++--------
slf4j-site/src/site/pages/news.html | 20 ++
5 files changed, 183 insertions(+), 116 deletions(-)
diff --git a/pom.xml b/pom.xml
index 0d1641d7..619a5099 100755
--- a/pom.xml
+++ b/pom.xml
@@ -155,6 +155,33 @@
${maven-deploy-plugin.version}
+
+
+ org.eclipse.m2e
+ lifecycle-mapping
+ 1.0.0
+
+
+
+
+
+ org.codehaus.mojo
+
+ build-helper-maven-plugin
+
+ [1.7,)
+
+ parse-version
+
+
+
+
+
+
+
+
+
+
diff --git a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
index 93c669b6..6c45ff20 100755
--- a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
+++ b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
@@ -85,11 +85,11 @@ public class DefaultLoggingEventBuilder implements LoggingEventBuilder {
if (logger instanceof LoggingEventAware) {
((LoggingEventAware) logger).log(logggingEvent);
} else {
- logViaPublicLoggerAPI(logggingEvent);
+ logViaPublicSLF4JLoggerAPI(logggingEvent);
}
}
- private void logViaPublicLoggerAPI(LoggingEvent logggingEvent) {
+ private void logViaPublicSLF4JLoggerAPI(LoggingEvent logggingEvent) {
Object[] argArray = logggingEvent.getArgumentArray();
int argLen = argArray == null ? 0 : argArray.length;
diff --git a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
index 9f8d1660..83134765 100755
--- a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
+++ b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
@@ -68,7 +68,7 @@ public final class Log4jLoggerAdapter extends LegacyAbstractLogger implements Lo
* Following the pattern discussed in pages 162 through 168 of "The complete
* log4j manual".
*/
- final static String FQCN = Log4jLoggerAdapter.class.getName();
+ final static String FQCN = org.slf4j.helpers.AbstractLogger.class.getName();
// Does the log4j version in use recognize the TRACE level?
// The trace level was introduced in log4j 1.2.12.
diff --git a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
index 6bcf2ee2..20c53e02 100644
--- a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
+++ b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
@@ -27,6 +27,7 @@ package org.slf4j.log4j12;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.util.HashMap;
@@ -50,141 +51,160 @@ import org.slf4j.MarkerFactory;
*/
public class InvocationTest {
- ListAppender listAppender = new ListAppender();
- org.apache.log4j.Logger root;
+ ListAppender listAppender = new ListAppender();
+ org.apache.log4j.Logger root;
- @Before
- public void setUp() throws Exception {
- root = org.apache.log4j.Logger.getRootLogger();
- root.addAppender(listAppender);
- }
+ @Before
+ public void setUp() throws Exception {
+ root = org.apache.log4j.Logger.getRootLogger();
+ root.addAppender(listAppender);
+ }
- @After
- public void tearDown() throws Exception {
- root.getLoggerRepository().resetConfiguration();
- }
+ @After
+ public void tearDown() throws Exception {
+ root.getLoggerRepository().resetConfiguration();
+ }
- @Test
- public void test1() {
- Logger logger = LoggerFactory.getLogger("test1");
- logger.debug("Hello world.");
- assertEquals(1, listAppender.list.size());
- }
+ @Test
+ public void test1() {
- @Test
- public void test2() {
- Integer i1 = Integer.valueOf(1);
- Integer i2 = Integer.valueOf(2);
- Integer i3 = Integer.valueOf(3);
- Exception e = new Exception("This is a test exception.");
- Logger logger = LoggerFactory.getLogger("test2");
+ Logger logger = LoggerFactory.getLogger("test1");
+ logger.debug("Hello world.");
+ assertEquals(1, listAppender.list.size());
+ }
- logger.trace("Hello trace.");
+ @Test
+ public void test2() {
+ Integer i1 = Integer.valueOf(1);
+ Integer i2 = Integer.valueOf(2);
+ Integer i3 = Integer.valueOf(3);
+ Exception e = new Exception("This is a test exception.");
+ Logger logger = LoggerFactory.getLogger("test2");
- logger.debug("Hello world 1.");
- logger.debug("Hello world {}", i1);
- logger.debug("val={} val={}", i1, i2);
- logger.debug("val={} val={} val={}", new Object[] { i1, i2, i3 });
+ logger.trace("Hello trace.");
- logger.debug("Hello world 2", e);
- logger.info("Hello world 2.");
+ logger.debug("Hello world 1.");
+ logger.debug("Hello world {}", i1);
+ logger.debug("val={} val={}", i1, i2);
+ logger.debug("val={} val={} val={}", new Object[] { i1, i2, i3 });
- logger.warn("Hello world 3.");
- logger.warn("Hello world 3", e);
+ logger.debug("Hello world 2", e);
+ logger.info("Hello world 2.");
- logger.error("Hello world 4.");
- logger.error("Hello world {}", Integer.valueOf(3));
- logger.error("Hello world 4.", e);
- assertEquals(11, listAppender.list.size());
- }
+ logger.warn("Hello world 3.");
+ logger.warn("Hello world 3", e);
- @Test
- public void testNull() {
- Logger logger = LoggerFactory.getLogger("testNull");
- logger.trace(null);
- logger.debug(null);
- logger.info(null);
- logger.warn(null);
- logger.error(null);
+ logger.error("Hello world 4.");
+ logger.error("Hello world {}", Integer.valueOf(3));
+ logger.error("Hello world 4.", e);
+ assertEquals(11, listAppender.list.size());
+ }
- Exception e = new Exception("This is a test exception.");
- logger.debug(null, e);
- logger.info(null, e);
- logger.warn(null, e);
- logger.error(null, e);
- assertEquals(8, listAppender.list.size());
- }
+ @Test
+ public void testNull() {
+ Logger logger = LoggerFactory.getLogger("testNull");
+ logger.trace(null);
+ logger.debug(null);
+ logger.info(null);
+ logger.warn(null);
+ logger.error(null);
- // http://jira.qos.ch/browse/SLF4J-69
- // formerly http://bugzilla.slf4j.org/show_bug.cgi?id=78
- @Test
- public void testNullParameter_BUG78() {
- Logger logger = LoggerFactory.getLogger("testNullParameter_BUG78");
- String[] parameters = null;
- String msg = "hello {}";
+ Exception e = new Exception("This is a test exception.");
+ logger.debug(null, e);
+ logger.info(null, e);
+ logger.warn(null, e);
+ logger.error(null, e);
+ assertEquals(8, listAppender.list.size());
+ }
- logger.debug(msg, (Object[]) parameters);
+ // http://jira.qos.ch/browse/SLF4J-69
+ // formerly http://bugzilla.slf4j.org/show_bug.cgi?id=78
+ @Test
+ public void testNullParameter_BUG78() {
+ Logger logger = LoggerFactory.getLogger("testNullParameter_BUG78");
+ String[] parameters = null;
+ String msg = "hello {}";
- assertEquals(1, listAppender.list.size());
- LoggingEvent e = (LoggingEvent) listAppender.list.get(0);
- assertEquals(msg, e.getMessage());
- }
+ logger.debug(msg, (Object[]) parameters);
- @Test
- public void testMarker() {
- Logger logger = LoggerFactory.getLogger("testMarker");
- Marker blue = MarkerFactory.getMarker("BLUE");
- logger.trace(blue, "hello");
- logger.debug(blue, "hello");
- logger.info(blue, "hello");
- logger.warn(blue, "hello");
- logger.error(blue, "hello");
+ assertEquals(1, listAppender.list.size());
+ LoggingEvent e = (LoggingEvent) listAppender.list.get(0);
+ assertEquals(msg, e.getMessage());
+ }
- logger.debug(blue, "hello {}", "world");
- logger.info(blue, "hello {}", "world");
- logger.warn(blue, "hello {}", "world");
- logger.error(blue, "hello {}", "world");
+ @Test
+ public void testMarker() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ Marker blue = MarkerFactory.getMarker("BLUE");
+ logger.trace(blue, "hello");
+ logger.debug(blue, "hello");
+ logger.info(blue, "hello");
+ logger.warn(blue, "hello");
+ logger.error(blue, "hello");
- logger.debug(blue, "hello {} and {} ", "world", "universe");
- logger.info(blue, "hello {} and {} ", "world", "universe");
- logger.warn(blue, "hello {} and {} ", "world", "universe");
- logger.error(blue, "hello {} and {} ", "world", "universe");
- assertEquals(12, listAppender.list.size());
- }
+ logger.debug(blue, "hello {}", "world");
+ logger.info(blue, "hello {}", "world");
+ logger.warn(blue, "hello {}", "world");
+ logger.error(blue, "hello {}", "world");
- @Test
- public void testMDC() {
- MDC.put("k", "v");
- assertNotNull(MDC.get("k"));
- assertEquals("v", MDC.get("k"));
+ logger.debug(blue, "hello {} and {} ", "world", "universe");
+ logger.info(blue, "hello {} and {} ", "world", "universe");
+ logger.warn(blue, "hello {} and {} ", "world", "universe");
+ logger.error(blue, "hello {} and {} ", "world", "universe");
+ assertEquals(12, listAppender.list.size());
+ }
- MDC.remove("k");
- assertNull(MDC.get("k"));
+ @Test
+ public void testMDC() {
+ MDC.put("k", "v");
+ assertNotNull(MDC.get("k"));
+ assertEquals("v", MDC.get("k"));
- MDC.put("k1", "v1");
- assertEquals("v1", MDC.get("k1"));
- MDC.clear();
- assertNull(MDC.get("k1"));
+ MDC.remove("k");
+ assertNull(MDC.get("k"));
- try {
- MDC.put(null, "x");
- fail("null keys are invalid");
- } catch (IllegalArgumentException e) {
- }
- }
+ MDC.put("k1", "v1");
+ assertEquals("v1", MDC.get("k1"));
+ MDC.clear();
+ assertNull(MDC.get("k1"));
- @Test
- public void testMDCContextMapValues() {
- Map map = new HashMap();
- map.put("ka", "va");
- map.put("kb", "vb");
+ try {
+ MDC.put(null, "x");
+ fail("null keys are invalid");
+ } catch (IllegalArgumentException e) {
+ }
+ }
- MDC.put("k", "v");
- assertEquals("v", MDC.get("k"));
- MDC.setContextMap(map);
- assertNull(MDC.get("k"));
- assertEquals("va", MDC.get("ka"));
- assertEquals("vb", MDC.get("kb"));
- }
+ @Test
+ public void testMDCContextMapValues() {
+ Map map = new HashMap();
+ map.put("ka", "va");
+ map.put("kb", "vb");
+
+ MDC.put("k", "v");
+ assertEquals("v", MDC.get("k"));
+ MDC.setContextMap(map);
+ assertNull(MDC.get("k"));
+ assertEquals("va", MDC.get("ka"));
+ assertEquals("vb", MDC.get("kb"));
+ }
+
+ @Test
+ public void testCallerInfo() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ listAppender.extractLocationInfo = true;
+ logger.debug("hello");
+ LoggingEvent event = listAppender.list.get(0);
+ assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
+ }
+
+ @Test
+ public void testCallerInfoWithFluentAPI() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ listAppender.extractLocationInfo = true;
+ logger.atDebug().log("hello");
+ LoggingEvent event = listAppender.list.get(0);
+ assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
+ }
}
diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html
index ec61f351..ce47cb3f 100755
--- a/slf4j-site/src/site/pages/news.html
+++ b/slf4j-site/src/site/pages/news.html
@@ -37,6 +37,26 @@
class names in
-->
+
+
+
16th of June, 2021 - Release of SLF4J 1.7.31
+
+
In the jcl-over-slf4j module Avoid Object to String Fixed a memory leak in case of no provided binding and
+ multi-threaded initialization as described in SLF4J-469. Many
+ thanks to David Harsha to providing the relevant PR.
From 44371046e0dcbd96f04c1326eeed26476ebcbd13 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Wed, 16 Jun 2021 00:02:24 +0200
Subject: [PATCH 063/121] formatting and minor cleanup
---
.../org/slf4j/log4j12/InvocationTest.java | 259 +++++++++---------
1 file changed, 129 insertions(+), 130 deletions(-)
diff --git a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
index 20c53e02..f5073381 100644
--- a/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
+++ b/slf4j-log4j12/src/test/java/org/slf4j/log4j12/InvocationTest.java
@@ -27,7 +27,6 @@ package org.slf4j.log4j12;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertFalse;
import static org.junit.Assert.fail;
import java.util.HashMap;
@@ -51,160 +50,160 @@ import org.slf4j.MarkerFactory;
*/
public class InvocationTest {
- ListAppender listAppender = new ListAppender();
- org.apache.log4j.Logger root;
+ ListAppender listAppender = new ListAppender();
+ org.apache.log4j.Logger root;
- @Before
- public void setUp() throws Exception {
- root = org.apache.log4j.Logger.getRootLogger();
- root.addAppender(listAppender);
- }
+ @Before
+ public void setUp() throws Exception {
+ root = org.apache.log4j.Logger.getRootLogger();
+ root.addAppender(listAppender);
+ }
- @After
- public void tearDown() throws Exception {
- root.getLoggerRepository().resetConfiguration();
- }
+ @After
+ public void tearDown() throws Exception {
+ root.getLoggerRepository().resetConfiguration();
+ }
- @Test
- public void test1() {
+ @Test
+ public void test1() {
- Logger logger = LoggerFactory.getLogger("test1");
- logger.debug("Hello world.");
- assertEquals(1, listAppender.list.size());
- }
+ Logger logger = LoggerFactory.getLogger("test1");
+ logger.debug("Hello world.");
+ assertEquals(1, listAppender.list.size());
+ }
- @Test
- public void test2() {
- Integer i1 = Integer.valueOf(1);
- Integer i2 = Integer.valueOf(2);
- Integer i3 = Integer.valueOf(3);
- Exception e = new Exception("This is a test exception.");
- Logger logger = LoggerFactory.getLogger("test2");
+ @Test
+ public void test2() {
+ Integer i1 = Integer.valueOf(1);
+ Integer i2 = Integer.valueOf(2);
+ Integer i3 = Integer.valueOf(3);
+ Exception e = new Exception("This is a test exception.");
+ Logger logger = LoggerFactory.getLogger("test2");
- logger.trace("Hello trace.");
+ logger.trace("Hello trace.");
- logger.debug("Hello world 1.");
- logger.debug("Hello world {}", i1);
- logger.debug("val={} val={}", i1, i2);
- logger.debug("val={} val={} val={}", new Object[] { i1, i2, i3 });
+ logger.debug("Hello world 1.");
+ logger.debug("Hello world {}", i1);
+ logger.debug("val={} val={}", i1, i2);
+ logger.debug("val={} val={} val={}", new Object[] { i1, i2, i3 });
- logger.debug("Hello world 2", e);
- logger.info("Hello world 2.");
+ logger.debug("Hello world 2", e);
+ logger.info("Hello world 2.");
- logger.warn("Hello world 3.");
- logger.warn("Hello world 3", e);
+ logger.warn("Hello world 3.");
+ logger.warn("Hello world 3", e);
- logger.error("Hello world 4.");
- logger.error("Hello world {}", Integer.valueOf(3));
- logger.error("Hello world 4.", e);
- assertEquals(11, listAppender.list.size());
- }
+ logger.error("Hello world 4.");
+ logger.error("Hello world {}", Integer.valueOf(3));
+ logger.error("Hello world 4.", e);
+ assertEquals(11, listAppender.list.size());
+ }
- @Test
- public void testNull() {
- Logger logger = LoggerFactory.getLogger("testNull");
- logger.trace(null);
- logger.debug(null);
- logger.info(null);
- logger.warn(null);
- logger.error(null);
+ @Test
+ public void testNull() {
+ Logger logger = LoggerFactory.getLogger("testNull");
+ logger.trace(null);
+ logger.debug(null);
+ logger.info(null);
+ logger.warn(null);
+ logger.error(null);
- Exception e = new Exception("This is a test exception.");
- logger.debug(null, e);
- logger.info(null, e);
- logger.warn(null, e);
- logger.error(null, e);
- assertEquals(8, listAppender.list.size());
- }
+ Exception e = new Exception("This is a test exception.");
+ logger.debug(null, e);
+ logger.info(null, e);
+ logger.warn(null, e);
+ logger.error(null, e);
+ assertEquals(8, listAppender.list.size());
+ }
- // http://jira.qos.ch/browse/SLF4J-69
- // formerly http://bugzilla.slf4j.org/show_bug.cgi?id=78
- @Test
- public void testNullParameter_BUG78() {
- Logger logger = LoggerFactory.getLogger("testNullParameter_BUG78");
- String[] parameters = null;
- String msg = "hello {}";
+ // http://jira.qos.ch/browse/SLF4J-69
+ // formerly http://bugzilla.slf4j.org/show_bug.cgi?id=78
+ @Test
+ public void testNullParameter_BUG78() {
+ Logger logger = LoggerFactory.getLogger("testNullParameter_BUG78");
+ String[] parameters = null;
+ String msg = "hello {}";
- logger.debug(msg, (Object[]) parameters);
+ logger.debug(msg, (Object[]) parameters);
- assertEquals(1, listAppender.list.size());
- LoggingEvent e = (LoggingEvent) listAppender.list.get(0);
- assertEquals(msg, e.getMessage());
- }
+ assertEquals(1, listAppender.list.size());
+ LoggingEvent e = (LoggingEvent) listAppender.list.get(0);
+ assertEquals(msg, e.getMessage());
+ }
- @Test
- public void testMarker() {
- Logger logger = LoggerFactory.getLogger("testMarker");
- Marker blue = MarkerFactory.getMarker("BLUE");
- logger.trace(blue, "hello");
- logger.debug(blue, "hello");
- logger.info(blue, "hello");
- logger.warn(blue, "hello");
- logger.error(blue, "hello");
+ @Test
+ public void testMarker() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ Marker blue = MarkerFactory.getMarker("BLUE");
+ logger.trace(blue, "hello");
+ logger.debug(blue, "hello");
+ logger.info(blue, "hello");
+ logger.warn(blue, "hello");
+ logger.error(blue, "hello");
- logger.debug(blue, "hello {}", "world");
- logger.info(blue, "hello {}", "world");
- logger.warn(blue, "hello {}", "world");
- logger.error(blue, "hello {}", "world");
+ logger.debug(blue, "hello {}", "world");
+ logger.info(blue, "hello {}", "world");
+ logger.warn(blue, "hello {}", "world");
+ logger.error(blue, "hello {}", "world");
- logger.debug(blue, "hello {} and {} ", "world", "universe");
- logger.info(blue, "hello {} and {} ", "world", "universe");
- logger.warn(blue, "hello {} and {} ", "world", "universe");
- logger.error(blue, "hello {} and {} ", "world", "universe");
- assertEquals(12, listAppender.list.size());
- }
+ logger.debug(blue, "hello {} and {} ", "world", "universe");
+ logger.info(blue, "hello {} and {} ", "world", "universe");
+ logger.warn(blue, "hello {} and {} ", "world", "universe");
+ logger.error(blue, "hello {} and {} ", "world", "universe");
+ assertEquals(12, listAppender.list.size());
+ }
- @Test
- public void testMDC() {
- MDC.put("k", "v");
- assertNotNull(MDC.get("k"));
- assertEquals("v", MDC.get("k"));
+ @Test
+ public void testMDC() {
+ MDC.put("k", "v");
+ assertNotNull(MDC.get("k"));
+ assertEquals("v", MDC.get("k"));
- MDC.remove("k");
- assertNull(MDC.get("k"));
+ MDC.remove("k");
+ assertNull(MDC.get("k"));
- MDC.put("k1", "v1");
- assertEquals("v1", MDC.get("k1"));
- MDC.clear();
- assertNull(MDC.get("k1"));
+ MDC.put("k1", "v1");
+ assertEquals("v1", MDC.get("k1"));
+ MDC.clear();
+ assertNull(MDC.get("k1"));
- try {
- MDC.put(null, "x");
- fail("null keys are invalid");
- } catch (IllegalArgumentException e) {
- }
- }
+ try {
+ MDC.put(null, "x");
+ fail("null keys are invalid");
+ } catch (IllegalArgumentException e) {
+ }
+ }
- @Test
- public void testMDCContextMapValues() {
- Map map = new HashMap();
- map.put("ka", "va");
- map.put("kb", "vb");
+ @Test
+ public void testMDCContextMapValues() {
+ Map map = new HashMap();
+ map.put("ka", "va");
+ map.put("kb", "vb");
- MDC.put("k", "v");
- assertEquals("v", MDC.get("k"));
- MDC.setContextMap(map);
- assertNull(MDC.get("k"));
- assertEquals("va", MDC.get("ka"));
- assertEquals("vb", MDC.get("kb"));
- }
+ MDC.put("k", "v");
+ assertEquals("v", MDC.get("k"));
+ MDC.setContextMap(map);
+ assertNull(MDC.get("k"));
+ assertEquals("va", MDC.get("ka"));
+ assertEquals("vb", MDC.get("kb"));
+ }
- @Test
- public void testCallerInfo() {
- Logger logger = LoggerFactory.getLogger("testMarker");
- listAppender.extractLocationInfo = true;
- logger.debug("hello");
- LoggingEvent event = listAppender.list.get(0);
- assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
- }
+ @Test
+ public void testCallerInfo() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ listAppender.extractLocationInfo = true;
+ logger.debug("hello");
+ LoggingEvent event = listAppender.list.get(0);
+ assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
+ }
- @Test
- public void testCallerInfoWithFluentAPI() {
- Logger logger = LoggerFactory.getLogger("testMarker");
- listAppender.extractLocationInfo = true;
- logger.atDebug().log("hello");
- LoggingEvent event = listAppender.list.get(0);
- assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
- }
+ @Test
+ public void testCallerInfoWithFluentAPI() {
+ Logger logger = LoggerFactory.getLogger("testMarker");
+ listAppender.extractLocationInfo = true;
+ logger.atDebug().log("hello");
+ LoggingEvent event = listAppender.list.get(0);
+ assertEquals(this.getClass().getName(), event.getLocationInformation().getClassName());
+ }
}
From ade6380f1af465862b7f4c897e2de3ac261a5579 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Wed, 16 Jun 2021 00:14:39 +0200
Subject: [PATCH 064/121] formatting changes only
---
.../org/slf4j/jul/JDK14LoggerAdapter.java | 439 +++++++++---------
.../org/slf4j/log4j12/Log4jLoggerAdapter.java | 280 ++++++-----
2 files changed, 351 insertions(+), 368 deletions(-)
diff --git a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
index a27fab49..45965b14 100755
--- a/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
+++ b/slf4j-jdk14/src/main/java/org/slf4j/jul/JDK14LoggerAdapter.java
@@ -51,257 +51,248 @@ import org.slf4j.spi.LocationAwareLogger;
*/
public final class JDK14LoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger {
- private static final long serialVersionUID = -8053026990503422791L;
+ private static final long serialVersionUID = -8053026990503422791L;
- transient final java.util.logging.Logger logger;
+ transient final java.util.logging.Logger logger;
- // WARN: JDK14LoggerAdapter constructor should have only package access so
- // that only JDK14LoggerFactory be able to create one.
- JDK14LoggerAdapter(java.util.logging.Logger logger) {
- this.logger = logger;
- this.name = logger.getName();
- }
+ // WARN: JDK14LoggerAdapter constructor should have only package access so
+ // that only JDK14LoggerFactory be able to create one.
+ JDK14LoggerAdapter(java.util.logging.Logger logger) {
+ this.logger = logger;
+ this.name = logger.getName();
+ }
- /**
- * Is this logger instance enabled for the FINEST level?
- *
- * @return True if this Logger is enabled for level FINEST, false otherwise.
- */
- public boolean isTraceEnabled() {
- return logger.isLoggable(Level.FINEST);
- }
+ /**
+ * Is this logger instance enabled for the FINEST level?
+ *
+ * @return True if this Logger is enabled for level FINEST, false otherwise.
+ */
+ public boolean isTraceEnabled() {
+ return logger.isLoggable(Level.FINEST);
+ }
- /**
- * Is this logger instance enabled for the FINE level?
- *
- * @return True if this Logger is enabled for level FINE, false otherwise.
- */
- public boolean isDebugEnabled() {
- return logger.isLoggable(Level.FINE);
- }
+ /**
+ * Is this logger instance enabled for the FINE level?
+ *
+ * @return True if this Logger is enabled for level FINE, false otherwise.
+ */
+ public boolean isDebugEnabled() {
+ return logger.isLoggable(Level.FINE);
+ }
- /**
- * Is this logger instance enabled for the INFO level?
- *
- * @return True if this Logger is enabled for the INFO level, false otherwise.
- */
- public boolean isInfoEnabled() {
- return logger.isLoggable(Level.INFO);
- }
+ /**
+ * Is this logger instance enabled for the INFO level?
+ *
+ * @return True if this Logger is enabled for the INFO level, false otherwise.
+ */
+ public boolean isInfoEnabled() {
+ return logger.isLoggable(Level.INFO);
+ }
- /**
- * Is this logger instance enabled for the WARNING level?
- *
- * @return True if this Logger is enabled for the WARNING level, false
- * otherwise.
- */
- public boolean isWarnEnabled() {
- return logger.isLoggable(Level.WARNING);
- }
+ /**
+ * Is this logger instance enabled for the WARNING level?
+ *
+ * @return True if this Logger is enabled for the WARNING level, false
+ * otherwise.
+ */
+ public boolean isWarnEnabled() {
+ return logger.isLoggable(Level.WARNING);
+ }
- /**
- * Is this logger instance enabled for level SEVERE?
- *
- * @return True if this Logger is enabled for level SEVERE, false otherwise.
- */
- public boolean isErrorEnabled() {
- return logger.isLoggable(Level.SEVERE);
- }
+ /**
+ * Is this logger instance enabled for level SEVERE?
+ *
+ * @return True if this Logger is enabled for level SEVERE, false otherwise.
+ */
+ public boolean isErrorEnabled() {
+ return logger.isLoggable(Level.SEVERE);
+ }
-// /**
-// * Log the message at the specified level with the specified throwable if any.
-// * This method creates a LogRecord and fills in caller date before calling
-// * this instance's JDK14 logger.
-// *
-// * See bug report #13 for more details.
-// *
-// * @param level
-// * @param msg
-// * @param t
-// */
-// private void log(String callerFQCN, Level level, String msg, Throwable t) {
-// // millis and thread are filled by the constructor
-// LogRecord record = new LogRecord(level, msg);
-// record.setLoggerName(getName());
-// record.setThrown(t);
-// // Note: parameters in record are not set because SLF4J only
-// // supports a single formatting style
-// fillCallerData(callerFQCN, record);
-// logger.log(record);
-// }
+ // /**
+ // * Log the message at the specified level with the specified throwable if any.
+ // * This method creates a LogRecord and fills in caller date before calling
+ // * this instance's JDK14 logger.
+ // *
+ // * See bug report #13 for more details.
+ // *
+ // * @param level
+ // * @param msg
+ // * @param t
+ // */
+ // private void log(String callerFQCN, Level level, String msg, Throwable t) {
+ // // millis and thread are filled by the constructor
+ // LogRecord record = new LogRecord(level, msg);
+ // record.setLoggerName(getName());
+ // record.setThrown(t);
+ // // Note: parameters in record are not set because SLF4J only
+ // // supports a single formatting style
+ // fillCallerData(callerFQCN, record);
+ // logger.log(record);
+ // }
- /**
- * Log the message at the specified level with the specified throwable if any.
- * This method creates a LogRecord and fills in caller date before calling this
- * instance's JDK14 logger.
- */
- @Override
- protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] args,
- Throwable throwable) {
- innerNormalizedLoggingCallHandler(getFullyQualifiedCallerName(), level, marker, msg, args, throwable);
- }
+ /**
+ * Log the message at the specified level with the specified throwable if any.
+ * This method creates a LogRecord and fills in caller date before calling this
+ * instance's JDK14 logger.
+ */
+ @Override
+ protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
+ innerNormalizedLoggingCallHandler(getFullyQualifiedCallerName(), level, marker, msg, args, throwable);
+ }
-
- private void innerNormalizedLoggingCallHandler(String fqcn, org.slf4j.event.Level level, Marker marker, String msg, Object[] args,
- Throwable throwable) {
- // millis and thread are filled by the constructor
- Level julLevel = slf4jLevelToJULLevel(level);
- String formattedMessage = MessageFormatter.basicArrayFormat(msg, args);
- LogRecord record = new LogRecord(julLevel, formattedMessage);
+ private void innerNormalizedLoggingCallHandler(String fqcn, org.slf4j.event.Level level, Marker marker, String msg, Object[] args, Throwable throwable) {
+ // millis and thread are filled by the constructor
+ Level julLevel = slf4jLevelToJULLevel(level);
+ String formattedMessage = MessageFormatter.basicArrayFormat(msg, args);
+ LogRecord record = new LogRecord(julLevel, formattedMessage);
- // https://jira.qos.ch/browse/SLF4J-13
- record.setLoggerName(getName());
- record.setThrown(throwable);
- // Note: parameters in record are not set because SLF4J only
- // supports a single formatting style
- // See also https://jira.qos.ch/browse/SLF4J-10
- fillCallerData(fqcn, record);
- logger.log(record);
- }
+ // https://jira.qos.ch/browse/SLF4J-13
+ record.setLoggerName(getName());
+ record.setThrown(throwable);
+ // Note: parameters in record are not set because SLF4J only
+ // supports a single formatting style
+ // See also https://jira.qos.ch/browse/SLF4J-10
+ fillCallerData(fqcn, record);
+ logger.log(record);
+ }
-
- @Override
- protected String getFullyQualifiedCallerName() {
- return SELF;
- }
-
-
- @Override
- public void log(Marker marker, String callerFQCN, int slf4jLevelInt, String message, Object[] arguments,
- Throwable throwable) {
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return SELF;
+ }
- org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(slf4jLevelInt);
- Level julLevel = slf4jLevelIntToJULLevel(slf4jLevelInt);
-
- if (logger.isLoggable(julLevel)) {
- NormalizedParameters np = NormalizedParameters.normalize(message, arguments, throwable);
- innerNormalizedLoggingCallHandler(callerFQCN, slf4jLevel, marker, np.getMessage(), np.getArguments(), np.getThrowable());
- }
- }
+ @Override
+ public void log(Marker marker, String callerFQCN, int slf4jLevelInt, String message, Object[] arguments, Throwable throwable) {
-
- /**
- * Fill in caller data if possible.
- *
- * @param record The record to update
- */
- final private void fillCallerData(String callerFQCN, LogRecord record) {
- StackTraceElement[] steArray = new Throwable().getStackTrace();
+ org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(slf4jLevelInt);
+ Level julLevel = slf4jLevelIntToJULLevel(slf4jLevelInt);
- int selfIndex = -1;
- for (int i = 0; i < steArray.length; i++) {
- final String className = steArray[i].getClassName();
+ if (logger.isLoggable(julLevel)) {
+ NormalizedParameters np = NormalizedParameters.normalize(message, arguments, throwable);
+ innerNormalizedLoggingCallHandler(callerFQCN, slf4jLevel, marker, np.getMessage(), np.getArguments(), np.getThrowable());
+ }
+ }
- if (barrierMatch(callerFQCN, className)) {
- selfIndex = i;
- break;
- }
- }
+ /**
+ * Fill in caller data if possible.
+ *
+ * @param record The record to update
+ */
+ final private void fillCallerData(String callerFQCN, LogRecord record) {
+ StackTraceElement[] steArray = new Throwable().getStackTrace();
- int found = -1;
- for (int i = selfIndex + 1; i < steArray.length; i++) {
- final String className = steArray[i].getClassName();
- if (!(barrierMatch(callerFQCN, className))) {
- found = i;
- break;
- }
- }
+ int selfIndex = -1;
+ for (int i = 0; i < steArray.length; i++) {
+ final String className = steArray[i].getClassName();
- if (found != -1) {
- StackTraceElement ste = steArray[found];
- // setting the class name has the side effect of setting
- // the needToInferCaller variable to false.
- record.setSourceClassName(ste.getClassName());
- record.setSourceMethodName(ste.getMethodName());
- }
- }
+ if (barrierMatch(callerFQCN, className)) {
+ selfIndex = i;
+ break;
+ }
+ }
- static String SELF = JDK14LoggerAdapter.class.getName();
-
- static String SUPER = LegacyAbstractLogger.class.getName();
- static String SUPER_OF_SUPER = AbstractLogger.class.getName();
- static String SUBSTITUE = SubstituteLogger.class.getName();
- static String FLUENT = DefaultLoggingEventBuilder.class.getName();
-
- static String BARRIER_CLASSES[] = new String[] { SUPER_OF_SUPER, SUPER, SELF, SUBSTITUE, FLUENT };
+ int found = -1;
+ for (int i = selfIndex + 1; i < steArray.length; i++) {
+ final String className = steArray[i].getClassName();
+ if (!(barrierMatch(callerFQCN, className))) {
+ found = i;
+ break;
+ }
+ }
- private boolean barrierMatch(String callerFQCN, String candidateClassName) {
- if (candidateClassName.equals(callerFQCN))
- return true;
- for (String barrierClassName : BARRIER_CLASSES) {
- if (barrierClassName.equals(candidateClassName)) {
- return true;
- }
- }
- return false;
- }
+ if (found != -1) {
+ StackTraceElement ste = steArray[found];
+ // setting the class name has the side effect of setting
+ // the needToInferCaller variable to false.
+ record.setSourceClassName(ste.getClassName());
+ record.setSourceMethodName(ste.getMethodName());
+ }
+ }
+ static String SELF = JDK14LoggerAdapter.class.getName();
- private static Level slf4jLevelIntToJULLevel(int levelInt) {
- org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(levelInt);
- return slf4jLevelToJULLevel(slf4jLevel);
- }
+ static String SUPER = LegacyAbstractLogger.class.getName();
+ static String SUPER_OF_SUPER = AbstractLogger.class.getName();
+ static String SUBSTITUE = SubstituteLogger.class.getName();
+ static String FLUENT = DefaultLoggingEventBuilder.class.getName();
- private static Level slf4jLevelToJULLevel(org.slf4j.event.Level slf4jLevel) {
- Level julLevel;
- switch (slf4jLevel) {
- case TRACE:
- julLevel = Level.FINEST;
- break;
- case DEBUG:
- julLevel = Level.FINE;
- break;
- case INFO:
- julLevel = Level.INFO;
- break;
- case WARN:
- julLevel = Level.WARNING;
- break;
- case ERROR:
- julLevel = Level.SEVERE;
- break;
- default:
- throw new IllegalStateException("Level " + slf4jLevel + " is not recognized.");
- }
- return julLevel;
- }
+ static String BARRIER_CLASSES[] = new String[] { SUPER_OF_SUPER, SUPER, SELF, SUBSTITUE, FLUENT };
- /**
- * @since 1.7.15
- */
- public void log(LoggingEvent event) {
- // assumes that the invocation is made from a substitute logger
- // this assumption might change in the future with the advent of a fluent API
- Level julLevel = slf4jLevelToJULLevel(event.getLevel());
- if (logger.isLoggable(julLevel)) {
- LogRecord record = eventToRecord(event, julLevel);
- logger.log(record);
- }
- }
+ private boolean barrierMatch(String callerFQCN, String candidateClassName) {
+ if (candidateClassName.equals(callerFQCN))
+ return true;
+ for (String barrierClassName : BARRIER_CLASSES) {
+ if (barrierClassName.equals(candidateClassName)) {
+ return true;
+ }
+ }
+ return false;
+ }
- private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
- String format = event.getMessage();
- Object[] arguments = event.getArgumentArray();
- FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
- if (ft.getThrowable() != null && event.getThrowable() != null) {
- throw new IllegalArgumentException(
- "both last element in argument array and last argument are of type Throwable");
- }
+ private static Level slf4jLevelIntToJULLevel(int levelInt) {
+ org.slf4j.event.Level slf4jLevel = org.slf4j.event.Level.intToLevel(levelInt);
+ return slf4jLevelToJULLevel(slf4jLevel);
+ }
- Throwable t = event.getThrowable();
- if (ft.getThrowable() != null) {
- t = ft.getThrowable();
- throw new IllegalStateException("fix above code");
- }
+ private static Level slf4jLevelToJULLevel(org.slf4j.event.Level slf4jLevel) {
+ Level julLevel;
+ switch (slf4jLevel) {
+ case TRACE:
+ julLevel = Level.FINEST;
+ break;
+ case DEBUG:
+ julLevel = Level.FINE;
+ break;
+ case INFO:
+ julLevel = Level.INFO;
+ break;
+ case WARN:
+ julLevel = Level.WARNING;
+ break;
+ case ERROR:
+ julLevel = Level.SEVERE;
+ break;
+ default:
+ throw new IllegalStateException("Level " + slf4jLevel + " is not recognized.");
+ }
+ return julLevel;
+ }
- LogRecord record = new LogRecord(julLevel, ft.getMessage());
- record.setLoggerName(event.getLoggerName());
- record.setMillis(event.getTimeStamp());
- record.setSourceClassName(EventConstants.NA_SUBST);
- record.setSourceMethodName(EventConstants.NA_SUBST);
+ /**
+ * @since 1.7.15
+ */
+ public void log(LoggingEvent event) {
+ // assumes that the invocation is made from a substitute logger
+ // this assumption might change in the future with the advent of a fluent API
+ Level julLevel = slf4jLevelToJULLevel(event.getLevel());
+ if (logger.isLoggable(julLevel)) {
+ LogRecord record = eventToRecord(event, julLevel);
+ logger.log(record);
+ }
+ }
- record.setThrown(t);
- return record;
- }
+ private LogRecord eventToRecord(LoggingEvent event, Level julLevel) {
+ String format = event.getMessage();
+ Object[] arguments = event.getArgumentArray();
+ FormattingTuple ft = MessageFormatter.arrayFormat(format, arguments);
+ if (ft.getThrowable() != null && event.getThrowable() != null) {
+ throw new IllegalArgumentException("both last element in argument array and last argument are of type Throwable");
+ }
+
+ Throwable t = event.getThrowable();
+ if (ft.getThrowable() != null) {
+ t = ft.getThrowable();
+ throw new IllegalStateException("fix above code");
+ }
+
+ LogRecord record = new LogRecord(julLevel, ft.getMessage());
+ record.setLoggerName(event.getLoggerName());
+ record.setMillis(event.getTimeStamp());
+ record.setSourceClassName(EventConstants.NA_SUBST);
+ record.setSourceMethodName(EventConstants.NA_SUBST);
+
+ record.setThrown(t);
+ return record;
+ }
}
diff --git a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
index 258bbae3..556868b8 100755
--- a/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
+++ b/slf4j-log4j12/src/main/java/org/slf4j/log4j12/Log4jLoggerAdapter.java
@@ -33,14 +33,12 @@ import org.apache.log4j.spi.LocationInfo;
import org.apache.log4j.spi.ThrowableInformation;
import org.slf4j.Logger;
import org.slf4j.Marker;
-import org.slf4j.event.DefaultLoggingEvent;
import org.slf4j.event.LoggingEvent;
import org.slf4j.event.SubstituteLoggingEvent;
import org.slf4j.helpers.LegacyAbstractLogger;
import org.slf4j.helpers.MessageFormatter;
import org.slf4j.helpers.NormalizedParameters;
import org.slf4j.helpers.SubstituteLogger;
-import org.slf4j.spi.DefaultLoggingEventBuilder;
import org.slf4j.spi.LocationAwareLogger;
import org.slf4j.spi.LoggingEventAware;
import org.slf4j.spi.LoggingEventBuilder;
@@ -63,114 +61,110 @@ import org.slf4j.spi.LoggingEventBuilder;
*
* @author Ceki Gülcü
*/
-public final class Log4jLoggerAdapter extends LegacyAbstractLogger
- implements LocationAwareLogger, LoggingEventAware, Serializable {
+public final class Log4jLoggerAdapter extends LegacyAbstractLogger implements LocationAwareLogger, LoggingEventAware, Serializable {
- private static final long serialVersionUID = 6182834493563598289L;
+ private static final long serialVersionUID = 6182834493563598289L;
- final transient org.apache.log4j.Logger logger;
+ final transient org.apache.log4j.Logger logger;
- /**
- * Following the pattern discussed in pages 162 through 168 of "The complete
- * log4j manual".
- */
+ /**
+ * Following the pattern discussed in pages 162 through 168 of "The complete
+ * log4j manual".
+ */
- final static String FQCN_NOMINAL = org.slf4j.helpers.AbstractLogger.class.getName();
- final static String FQCN_SUBSTITUE = FQCN_NOMINAL;
- final static String FQCN_FLUENT = org.slf4j.spi.DefaultLoggingEventBuilder.class.getName();
+ final static String FQCN_NOMINAL = org.slf4j.helpers.AbstractLogger.class.getName();
+ final static String FQCN_SUBSTITUE = FQCN_NOMINAL;
+ final static String FQCN_FLUENT = org.slf4j.spi.DefaultLoggingEventBuilder.class.getName();
-
- // Does the log4j version in use recognize the TRACE level?
- // The trace level was introduced in log4j 1.2.12.
- final boolean traceCapable;
+ // Does the log4j version in use recognize the TRACE level?
+ // The trace level was introduced in log4j 1.2.12.
+ final boolean traceCapable;
- // WARN: Log4jLoggerAdapter constructor should have only package access so
- // that only Log4jLoggerFactory be able to create one.
- Log4jLoggerAdapter(org.apache.log4j.Logger logger) {
- this.logger = logger;
- this.name = logger.getName();
- traceCapable = isTraceCapable();
- }
+ // WARN: Log4jLoggerAdapter constructor should have only package access so
+ // that only Log4jLoggerFactory be able to create one.
+ Log4jLoggerAdapter(org.apache.log4j.Logger logger) {
+ this.logger = logger;
+ this.name = logger.getName();
+ traceCapable = isTraceCapable();
+ }
- private boolean isTraceCapable() {
- try {
- logger.isTraceEnabled();
- return true;
- } catch (NoSuchMethodError e) {
- return false;
- }
- }
+ private boolean isTraceCapable() {
+ try {
+ logger.isTraceEnabled();
+ return true;
+ } catch (NoSuchMethodError e) {
+ return false;
+ }
+ }
+ /**
+ * Is this logger instance enabled for the TRACE level?
+ *
+ * @return True if this Logger is enabled for level TRACE, false otherwise.
+ */
+ public boolean isTraceEnabled() {
+ if (traceCapable) {
+ return logger.isTraceEnabled();
+ } else {
+ return logger.isDebugEnabled();
+ }
+ }
- /**
- * Is this logger instance enabled for the TRACE level?
- *
- * @return True if this Logger is enabled for level TRACE, false otherwise.
- */
- public boolean isTraceEnabled() {
- if (traceCapable) {
- return logger.isTraceEnabled();
- } else {
- return logger.isDebugEnabled();
- }
- }
+ /**
+ * Is this logger instance enabled for the DEBUG level?
+ *
+ * @return True if this Logger is enabled for level DEBUG, false otherwise.
+ */
+ public boolean isDebugEnabled() {
+ return logger.isDebugEnabled();
+ }
- /**
- * Is this logger instance enabled for the DEBUG level?
- *
- * @return True if this Logger is enabled for level DEBUG, false otherwise.
- */
- public boolean isDebugEnabled() {
- return logger.isDebugEnabled();
- }
+ /**
+ * Is this logger instance enabled for the INFO level?
+ *
+ * @return True if this Logger is enabled for the INFO level, false otherwise.
+ */
+ public boolean isInfoEnabled() {
+ return logger.isInfoEnabled();
+ }
- /**
- * Is this logger instance enabled for the INFO level?
- *
- * @return True if this Logger is enabled for the INFO level, false otherwise.
- */
- public boolean isInfoEnabled() {
- return logger.isInfoEnabled();
- }
+ /**
+ * Is this logger instance enabled for the WARN level?
+ *
+ * @return True if this Logger is enabled for the WARN level, false otherwise.
+ */
+ public boolean isWarnEnabled() {
+ return logger.isEnabledFor(Level.WARN);
+ }
- /**
- * Is this logger instance enabled for the WARN level?
- *
- * @return True if this Logger is enabled for the WARN level, false otherwise.
- */
- public boolean isWarnEnabled() {
- return logger.isEnabledFor(Level.WARN);
- }
+ /**
+ * Is this logger instance enabled for level ERROR?
+ *
+ * @return True if this Logger is enabled for level ERROR, false otherwise.
+ */
+ public boolean isErrorEnabled() {
+ return logger.isEnabledFor(Level.ERROR);
+ }
- /**
- * Is this logger instance enabled for level ERROR?
- *
- * @return True if this Logger is enabled for level ERROR, false otherwise.
- */
- public boolean isErrorEnabled() {
- return logger.isEnabledFor(Level.ERROR);
- }
+ @Override
+ public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
+ Level log4jLevel = toLog4jLevel(level);
+ NormalizedParameters np = NormalizedParameters.normalize(msg, arguments, t);
+ String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
+ logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
+ }
- @Override
- public void log(Marker marker, String callerFQCN, int level, String msg, Object[] arguments, Throwable t) {
- Level log4jLevel = toLog4jLevel(level);
- NormalizedParameters np = NormalizedParameters.normalize(msg, arguments, t);
- String formattedMessage = MessageFormatter.basicArrayFormat(np.getMessage(), np.getArguments());
- logger.log(callerFQCN, log4jLevel, formattedMessage, np.getThrowable());
- }
+ @Override
+ protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg, Object[] arguments, Throwable throwable) {
+ Level log4jLevel = toLog4jLevel(level.toInt());
+ String formattedMessage = MessageFormatter.basicArrayFormat(msg, arguments);
+ logger.log(getFullyQualifiedCallerName(), log4jLevel, formattedMessage, throwable);
+ }
- @Override
- protected void handleNormalizedLoggingCall(org.slf4j.event.Level level, Marker marker, String msg,
- Object[] arguments, Throwable throwable) {
- Level log4jLevel = toLog4jLevel(level.toInt());
- String formattedMessage = MessageFormatter.basicArrayFormat(msg, arguments);
- logger.log(getFullyQualifiedCallerName(), log4jLevel, formattedMessage, throwable);
- }
-
- /**
- * Called by {@link SubstituteLogger} or by {@link LoggingEventBuilder} instances
- * @param event
- */
+ /**
+ * Called by {@link SubstituteLogger} or by {@link LoggingEventBuilder} instances
+ * @param event
+ */
public void log(LoggingEvent event) {
Level log4jLevel = toLog4jLevel(event.getLevel().toInt());
if (!logger.isEnabledFor(log4jLevel))
@@ -181,60 +175,58 @@ public final class Log4jLoggerAdapter extends LegacyAbstractLogger
}
- private org.apache.log4j.spi.LoggingEvent event2Log4jEvent(LoggingEvent event, Level log4jLevel) {
+ private org.apache.log4j.spi.LoggingEvent event2Log4jEvent(LoggingEvent event, Level log4jLevel) {
- String formattedMessage = MessageFormatter.basicArrayFormat(event.getMessage(), event.getArgumentArray());
+ String formattedMessage = MessageFormatter.basicArrayFormat(event.getMessage(), event.getArgumentArray());
- LocationInfo locationInfo = null;
- String fcqn = null;
-
- if(event instanceof SubstituteLoggingEvent) {
- locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
- fcqn = FQCN_SUBSTITUE;
- } else {
- fcqn = FQCN_FLUENT;
- }
-
-
- ThrowableInformation ti = null;
- Throwable t = event.getThrowable();
- if (t != null)
- ti = new ThrowableInformation(t);
+ LocationInfo locationInfo = null;
+ String fcqn = null;
- org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(fcqn, logger,
- event.getTimeStamp(), log4jLevel, formattedMessage, event.getThreadName(), ti, null, locationInfo,
- null);
+ if (event instanceof SubstituteLoggingEvent) {
+ locationInfo = new LocationInfo(NA_SUBST, NA_SUBST, NA_SUBST, "0");
+ fcqn = FQCN_SUBSTITUE;
+ } else {
+ fcqn = FQCN_FLUENT;
+ }
- return log4jEvent;
- }
+ ThrowableInformation ti = null;
+ Throwable t = event.getThrowable();
+ if (t != null)
+ ti = new ThrowableInformation(t);
- private Level toLog4jLevel(int slf4jLevelInt) {
- Level log4jLevel;
- switch (slf4jLevelInt) {
- case LocationAwareLogger.TRACE_INT:
- log4jLevel = traceCapable ? Level.TRACE : Level.DEBUG;
- break;
- case LocationAwareLogger.DEBUG_INT:
- log4jLevel = Level.DEBUG;
- break;
- case LocationAwareLogger.INFO_INT:
- log4jLevel = Level.INFO;
- break;
- case LocationAwareLogger.WARN_INT:
- log4jLevel = Level.WARN;
- break;
- case LocationAwareLogger.ERROR_INT:
- log4jLevel = Level.ERROR;
- break;
- default:
- throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
- }
- return log4jLevel;
- }
+ org.apache.log4j.spi.LoggingEvent log4jEvent = new org.apache.log4j.spi.LoggingEvent(fcqn, logger, event.getTimeStamp(), log4jLevel, formattedMessage,
+ event.getThreadName(), ti, null, locationInfo, null);
- @Override
- protected String getFullyQualifiedCallerName() {
- return FQCN_NOMINAL;
- }
+ return log4jEvent;
+ }
+
+ private Level toLog4jLevel(int slf4jLevelInt) {
+ Level log4jLevel;
+ switch (slf4jLevelInt) {
+ case LocationAwareLogger.TRACE_INT:
+ log4jLevel = traceCapable ? Level.TRACE : Level.DEBUG;
+ break;
+ case LocationAwareLogger.DEBUG_INT:
+ log4jLevel = Level.DEBUG;
+ break;
+ case LocationAwareLogger.INFO_INT:
+ log4jLevel = Level.INFO;
+ break;
+ case LocationAwareLogger.WARN_INT:
+ log4jLevel = Level.WARN;
+ break;
+ case LocationAwareLogger.ERROR_INT:
+ log4jLevel = Level.ERROR;
+ break;
+ default:
+ throw new IllegalStateException("Level number " + slf4jLevelInt + " is not recognized.");
+ }
+ return log4jLevel;
+ }
+
+ @Override
+ protected String getFullyQualifiedCallerName() {
+ return FQCN_NOMINAL;
+ }
}
From 82aca890f0904d2d08c7d3271a1d62b7da6b4927 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Wed, 16 Jun 2021 00:17:16 +0200
Subject: [PATCH 065/121] formatting changes only
---
.../slf4j/jul/FluentApiInvocationTest.java | 205 +++++++++---------
1 file changed, 106 insertions(+), 99 deletions(-)
diff --git a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
index cd0f056e..5fb5d36a 100755
--- a/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
+++ b/slf4j-jdk14/src/test/java/org/slf4j/jul/FluentApiInvocationTest.java
@@ -2,6 +2,7 @@ package org.slf4j.jul;
import static org.junit.Assert.assertEquals;
+import java.util.function.Supplier;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogRecord;
@@ -15,122 +16,128 @@ import org.slf4j.LoggerFactory;
public class FluentApiInvocationTest {
- ListHandler listHandler = new ListHandler();
- java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
- Level oldLevel;
- Logger logger = LoggerFactory.getLogger(this.getClass());
+ ListHandler listHandler = new ListHandler();
+ java.util.logging.Logger root = java.util.logging.Logger.getLogger("");
+ Level oldLevel;
+ Logger logger = LoggerFactory.getLogger(this.getClass());
- @Before
- public void setUp() throws Exception {
- oldLevel = root.getLevel();
- root.setLevel(Level.FINE);
- // removeAllHandlers(root);
- root.addHandler(listHandler);
- }
+ @Before
+ public void setUp() throws Exception {
+ oldLevel = root.getLevel();
+ root.setLevel(Level.FINE);
+ // removeAllHandlers(root);
+ root.addHandler(listHandler);
+ }
- @After
- public void tearDown() throws Exception {
- root.setLevel(oldLevel);
- removeListHandlers(root);
- }
+ @After
+ public void tearDown() throws Exception {
+ root.setLevel(oldLevel);
+ removeListHandlers(root);
+ }
- void removeListHandlers(java.util.logging.Logger logger) {
- Handler[] handlers = logger.getHandlers();
- for (Handler h : handlers) {
- if (h instanceof ListHandler)
- logger.removeHandler(h);
- }
- }
+ void removeListHandlers(java.util.logging.Logger logger) {
+ Handler[] handlers = logger.getHandlers();
+ for (Handler h : handlers) {
+ if (h instanceof ListHandler)
+ logger.removeHandler(h);
+ }
+ }
- @Test
- public void singleMessage() {
- String msg = "Hello world.";
- logger.atDebug().log(msg);
- assertLogMessage(msg, 0);
- }
+ @Test
+ public void singleMessage() {
+ String msg = "Hello world.";
+ logger.atDebug().log(msg);
+ assertLogMessage(msg, 0);
+ }
- @Test
- public void messageWithArguments() {
- String msg = "Hello {}.";
- logger.atDebug().addArgument("world").log(msg);
- assertLogMessage("Hello world.", 0);
- }
+ @Test
+ public void messageWithArguments() {
+ String msg = "Hello {}.";
+ logger.atDebug().addArgument("world").log(msg);
+ assertLogMessage("Hello world.", 0);
+ }
- @Test
- public void messageWithTwoArguments() {
- int old = 15;
- int t = 16;
+ @Test
+ public void messageWithTwoArguments() {
+ int old = 15;
+ int t = 16;
- {
- String msg = "Temperature set to {}. Old temperature was {}.";
- logger.atDebug().addArgument(t).addArgument(old).log(msg);
- assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
- }
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(t).addArgument(old).log(msg);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
- {
- String msg = "Temperature set to {}. Old temperature was {}.";
- logger.atDebug().log(msg, t, old);
- assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
- }
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().log(msg, t, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
- {
- String msg = "Temperature set to {}. Old temperature was {}.";
- logger.atDebug().addArgument(t).log(msg, old);
- assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
- }
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(t).log(msg, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
- {
- String msg = "Temperature set to {}. Old temperature was {}.";
- logger.atDebug().addArgument(() -> t16()).log(msg, old);
- assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
- }
- }
+ {
+ String msg = "Temperature set to {}. Old temperature was {}.";
+ logger.atDebug().addArgument(() -> t16()).log(msg, old);
+ assertLogMessage("Temperature set to 16. Old temperature was 15.", 0);
+ }
+ }
- public int t16() {
- return 16;
- }
+ public void supplierArguments() {
+ Supplier stringSupplier = () -> "String";
+ logger.atDebug().addArgument(stringSupplier).log("hello");
- @Test
- public void messageWithThrowable() {
- String msg = "Hello world.";
- Throwable t = new IllegalStateException();
- logger.atDebug().setCause(t).log(msg);
- assertLogMessage("Hello world.", 0);
- assertThrowable(t, 0);
- }
+ }
- @Test
- public void messageWithArgumentsAndThrowable() {
- String msg = "Hello {}.";
- Throwable t = new IllegalStateException();
+ public int t16() {
+ return 16;
+ }
- logger.atDebug().setCause(t).addArgument("world").log(msg);
- assertLogMessage("Hello world.", 0);
- assertThrowable(t, 0);
- }
+ @Test
+ public void messageWithThrowable() {
+ String msg = "Hello world.";
+ Throwable t = new IllegalStateException();
+ logger.atDebug().setCause(t).log(msg);
+ assertLogMessage("Hello world.", 0);
+ assertThrowable(t, 0);
+ }
- @Test
- public void messageWithKeyValuePair() {
- String msg = "Hello world.";
- logger.atDebug().addKeyValue("k", "v").log(msg);
- assertLogMessage("k=v Hello world.", 0);
+ @Test
+ public void messageWithArgumentsAndThrowable() {
+ String msg = "Hello {}.";
+ Throwable t = new IllegalStateException();
- int oldT = 15;
- int newT = 16;
- logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");
- assertLogMessage("oldT=15 newT=16 Temperature changed.", 1);
+ logger.atDebug().setCause(t).addArgument("world").log(msg);
+ assertLogMessage("Hello world.", 0);
+ assertThrowable(t, 0);
+ }
- }
+ @Test
+ public void messageWithKeyValuePair() {
+ String msg = "Hello world.";
+ logger.atDebug().addKeyValue("k", "v").log(msg);
+ assertLogMessage("k=v Hello world.", 0);
- private void assertLogMessage(String expected, int index) {
- LogRecord logRecord = listHandler.recordList.get(index);
- Assert.assertNotNull(logRecord);
- assertEquals(expected, logRecord.getMessage());
- }
+ int oldT = 15;
+ int newT = 16;
+ logger.atDebug().addKeyValue("oldT", oldT).addKeyValue("newT", newT).log("Temperature changed.");
+ assertLogMessage("oldT=15 newT=16 Temperature changed.", 1);
- private void assertThrowable(Throwable expected, int index) {
- LogRecord logRecord = listHandler.recordList.get(index);
- Assert.assertNotNull(logRecord);
- assertEquals(expected, logRecord.getThrown());
- }
+ }
+
+ private void assertLogMessage(String expected, int index) {
+ LogRecord logRecord = listHandler.recordList.get(index);
+ Assert.assertNotNull(logRecord);
+ assertEquals(expected, logRecord.getMessage());
+ }
+
+ private void assertThrowable(Throwable expected, int index) {
+ LogRecord logRecord = listHandler.recordList.get(index);
+ Assert.assertNotNull(logRecord);
+ assertEquals(expected, logRecord.getThrown());
+ }
}
From a405c8db97d908ba326b775494359049f31c2fe9 Mon Sep 17 00:00:00 2001
From: Ceki Gulcu
Date: Wed, 16 Jun 2021 00:23:37 +0200
Subject: [PATCH 066/121] formatting changes only
---
.../slf4j/spi/DefaultLoggingEventBuilder.java | 310 +++++++++---------
.../org/slf4j/spi/LoggingEventBuilder.java | 35 +-
2 files changed, 173 insertions(+), 172 deletions(-)
diff --git a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
index ca60555c..597eed45 100755
--- a/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
+++ b/slf4j-api/src/main/java/org/slf4j/spi/DefaultLoggingEventBuilder.java
@@ -11,182 +11,180 @@ import org.slf4j.event.LoggingEvent;
public class DefaultLoggingEventBuilder implements LoggingEventBuilder {
- DefaultLoggingEvent loggingEvent;
- Logger logger;
+ DefaultLoggingEvent loggingEvent;
+ Logger logger;
- public DefaultLoggingEventBuilder(Logger logger, Level level) {
- this.logger = logger;
- loggingEvent = new DefaultLoggingEvent(level, logger);
- }
+ public DefaultLoggingEventBuilder(Logger logger, Level level) {
+ this.logger = logger;
+ loggingEvent = new DefaultLoggingEvent(level, logger);
+ }
- /**
- * Add a marker to the current logging event being built.
- *
- * It is possible to add multiple markers to the same logging event.
- *
- * @param marker the marker to add
- */
- @Override
- public LoggingEventBuilder addMarker(Marker marker) {
- loggingEvent.addMarker(marker);
- return this;
- }
+ /**
+ * Add a marker to the current logging event being built.
+ *
+ * It is possible to add multiple markers to the same logging event.
+ *
+ * @param marker the marker to add
+ */
+ @Override
+ public LoggingEventBuilder addMarker(Marker marker) {
+ loggingEvent.addMarker(marker);
+ return this;
+ }
- @Override
- public LoggingEventBuilder setCause(Throwable t) {
- loggingEvent.setThrowable(t);
- return this;
- }
+ @Override
+ public LoggingEventBuilder setCause(Throwable t) {
+ loggingEvent.setThrowable(t);
+ return this;
+ }
- @Override
- public LoggingEventBuilder addArgument(Object p) {
- loggingEvent.addArgument(p);
- return this;
- }
+ @Override
+ public LoggingEventBuilder addArgument(Object p) {
+ loggingEvent.addArgument(p);
+ return this;
+ }
- @Override
- public LoggingEventBuilder addArgument(Supplier
Added support for the native OSGi service loader mechanism as
described in SLF4J-457. Our
@@ -53,15 +62,15 @@
href="https://jira.qos.ch/browse/SLF4J-511">SLF4J-511 by Ralph
Goers.
- -->
+
+
XXth of June, 2021 - Release of SLF4J 1.7.31
-
In the jcl-over-slf4j module Avoid Object to String Fixed a
- memory leak in case of no provided binding and multi-threaded
- initialization as described in SLF4J-469. Many
- thanks to David Harsha to providing the relevant PR.
+
In the jcl-over-slf4j module avoid Object to
+ String conversion. This issue was reported in SLF4J-497 by Antonio
+ Tomac who also provided the relevant PR.
@@ -2302,12 +2311,6 @@
13 April 2005 - start of work on SLF4J project
Launch of the SLF4J project. Work has begun on the web-site, svn
- repositories as well as the source code.
-