From acf62ef1cff3f5b3c8df5e44fe01a2aac1e97642 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Kautler?= Date: Fri, 18 May 2018 15:38:40 +0200 Subject: [PATCH 001/121] Make slf4j with java.util.ServiceLoader properly work in OSGi by using the Service Loader Mediator Specification --- slf4j-api/src/main/resources/META-INF/MANIFEST.MF | 3 +++ 1 file changed, 3 insertions(+) diff --git a/slf4j-api/src/main/resources/META-INF/MANIFEST.MF b/slf4j-api/src/main/resources/META-INF/MANIFEST.MF index b49b4739..77d8a9e4 100755 --- a/slf4j-api/src/main/resources/META-INF/MANIFEST.MF +++ b/slf4j-api/src/main/resources/META-INF/MANIFEST.MF @@ -9,3 +9,6 @@ Export-Package: org.slf4j;version=${parsedVersion.osgiVersion}, org.slf4j.helpers;version=${parsedVersion.osgiVersion}, org.slf4j.event;version=${parsedVersion.osgiVersion} Import-Package: org.slf4j.spi;version=${parsedVersion.osgiVersion} +Require-Capability: osgi.extender;filter:="(osgi.extender=osgi.service + loader.processor)",osgi.serviceloader;filter:="(osgi.serviceloader=or + g.slf4j.spi.SLF4JServiceProvider)" From d3f50a9185266cf03a0c1a93c15cffcd4bc32c1e Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 13 Jun 2019 01:19:32 +0200 Subject: [PATCH 002/121] attempt to fix slf4j-migrator Maven Central upload issue --- pom.xml | 2 +- .../src/main/java/org/slf4j/migrator/ProjectConverter.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 87b31497..3b22bd64 100755 --- a/pom.xml +++ b/pom.xml @@ -74,7 +74,7 @@ osgi-over-slf4j integration slf4j-site - slf4j-migrator + diff --git a/slf4j-migrator/src/main/java/org/slf4j/migrator/ProjectConverter.java b/slf4j-migrator/src/main/java/org/slf4j/migrator/ProjectConverter.java index 99f1a194..a553fe39 100644 --- a/slf4j-migrator/src/main/java/org/slf4j/migrator/ProjectConverter.java +++ b/slf4j-migrator/src/main/java/org/slf4j/migrator/ProjectConverter.java @@ -56,7 +56,7 @@ public class ProjectConverter { /** * Ask for concrete matcher implementation depending on the conversion mode * Ask for user confirmation to convert the selected source directory if valid - * Ask for user confirmation in case of number of files to convert > 1000 + * Ask for user confirmation in case of number of files to convert > 1000 * * @param conversionType * @param progressListener From 890fc5b0e60c9d0003b6fa98aa271eaf6c1cd540 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Thu, 13 Jun 2019 18:40:10 +0200 Subject: [PATCH 003/121] documentating fluent api --- slf4j-site/src/site/pages/manual.html | 3 +++ slf4j-site/src/site/pages/news.html | 12 +++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/slf4j-site/src/site/pages/manual.html b/slf4j-site/src/site/pages/manual.html index 4c9859d3..47b8ce5d 100755 --- a/slf4j-site/src/site/pages/manual.html +++ b/slf4j-site/src/site/pages/manual.html @@ -64,6 +64,9 @@ loggers.

+

since 2.0.0 SLF4J API version 2.0.0 + requires Java 8 and inroduces a fluent API. +

Hello World

diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index 1dab239a..a58a214c 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -38,8 +38,18 @@ --> - +
+

2019 - Release of SLF4J 2.0.0-alpha0

+ +

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

diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index a58a214c..4bc5c802 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -43,10 +43,15 @@

2019 - Release of SLF4J 2.0.0-alpha0

The the 2.0.x series requires Java 8 and - adds a fluent-api.

+ adds a backward-compatible fluent logging api.

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.0 0.8.1 1.2.17 - 1.0.13 + 1.2.3 4.12 3.7.1 3.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

-
slf4j-nop-${project.version}.jar
+
slf4j-nop-${latest.stable.version}.jar
Binding for NOP, silently discarding all logging.

-
slf4j-simple-${project.version}.jar
+
slf4j-simple-${latest.stable.version}.jar
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.

-
slf4j-jcl-${project.version}.jar
+
slf4j-jcl-${latest.stable.version}.jar
Binding for Jakarta Commons @@ -260,16 +294,16 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail

To switch logging frameworks, just replace slf4j bindings on your class path. For example, to switch from java.util.logging - to log4j, just replace slf4j-jdk14-${project.version}.jar with - slf4j-log4j12-${project.version}.jar. + to log4j, just replace slf4j-jdk14-${latest.stable.version}.jar with + slf4j-log4j12-${latest.stable.version}.jar.

SLF4J does not rely on any special class loader machinery. In fact, each SLF4J binding is hardwired at compile time to use one and only one specific logging framework. For - example, the slf4j-log4j12-${project.version}.jar binding is + example, the slf4j-log4j12-${latest.stable.version}.jar binding is bound at compile time to use log4j. In your code, in addition - to slf4j-api-${project.version}.jar, you simply drop + to slf4j-api-${latest.stable.version}.jar, you simply drop one and only one binding of your choice onto the appropriate class path location. Do not place more than one binding on your class path. Here is a graphical illustration of @@ -355,11 +389,11 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail you need to do is to declare "ch.qos.logback:logback-classic" as a dependency in your pom.xml file as shown below. In addition to logback-classic-${logback.version}.jar, - this will pull slf4j-api-${project.version}.jar as well + this will pull slf4j-api-${latest.stable.version}.jar as well as logback-core-${logback.version}.jar into your project. Note that explicitly declaring a dependency on logback-core-${logback.version} or - slf4j-api-${project.version}.jar is not wrong and may + slf4j-api-${latest.stable.version}.jar is not wrong and may be necessary to impose the correct version of said artifacts by virtue of Maven's "nearest definition" dependency mediation rule. @@ -377,12 +411,12 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail log4j as the underlying logging framework, all you need to do is to declare "org.slf4j:slf4j-log4j12" as a dependency in your pom.xml file as shown below. In addition to - slf4j-log4j12-${project.version}.jar, this will pull - slf4j-api-${project.version}.jar as well as + slf4j-log4j12-${latest.stable.version}.jar, this will pull + slf4j-api-${latest.stable.version}.jar as well as log4j-${log4j.version}.jar into your project. Note that explicitly declaring a dependency on log4j-${log4j.version}.jar or - slf4j-api-${project.version}.jar is not wrong and may + slf4j-api-${latest.stable.version}.jar is not wrong and may be necessary to impose the correct version of said artifacts by virtue of Maven's "nearest definition" dependency mediation rule.

@@ -390,7 +424,7 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
<dependency> 
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-log4j12</artifactId>
-  <version>${project.version}</version>
+  <version>${latest.stable.version}</version>
 </dependency>

@@ -400,10 +434,10 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail framework, all you need to do is to declare "org.slf4j:slf4j-jdk14" as a dependency in your pom.xml file as shown below. In addition to - slf4j-jdk14-${project.version}.jar, this will pull - slf4j-api-${project.version}.jar into your project. + slf4j-jdk14-${latest.stable.version}.jar, this will pull + slf4j-api-${latest.stable.version}.jar into your project. Note that explicitly declaring a dependency on - slf4j-api-${project.version}.jar is not wrong and may + slf4j-api-${latest.stable.version}.jar is not wrong and may be necessary to impose the correct version of said artifact by virtue of Maven's "nearest definition" dependency mediation rule.

@@ -411,7 +445,7 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail
<dependency> 
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-jdk14</artifactId>
-  <version>${project.version}</version>
+  <version>${latest.stable.version}</version>
 </dependency>
@@ -436,8 +470,8 @@ SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further detail

Mixing different versions of slf4j-api.jar and SLF4J binding can cause problems. For example, if you are using - slf4j-api-${project.version}.jar, then you should also use - slf4j-simple-${project.version}.jar, using + slf4j-api-${latest.stable.version}.jar, then you should also use + slf4j-simple-${latest.stable.version}.jar, using slf4j-simple-1.5.5.jar will not work.

diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index 4bc5c802..b8c4ac31 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -48,7 +48,7 @@

SLF4J version 2.0.0 requires Java 8. It builds on the 1.8.x series and adds a backward-compatible fluent-api. By backward-compatible, + href="manual.html#fluent">fluent logging 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 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 + *

Note that version 2.0 of the SLF4J API introduces a fluent api, + * the most significant API change to occur in the last 20 years. + * + *

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.

From a5eb9ce00ca119da55b3a05c986f8bfe795608b0 Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Sun, 28 Jul 2019 17:18:22 +0200 Subject: [PATCH 009/121] bump version --- 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 c98268df..3cc73735 100755 --- a/integration/pom.xml +++ b/integration/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT integration diff --git a/jcl-over-slf4j/pom.xml b/jcl-over-slf4j/pom.xml index 5010e00e..e1d07e53 100755 --- a/jcl-over-slf4j/pom.xml +++ b/jcl-over-slf4j/pom.xml @@ -5,7 +5,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT 4.0.0 diff --git a/jul-to-slf4j/pom.xml b/jul-to-slf4j/pom.xml index 56d446ea..1e0e3d2f 100755 --- a/jul-to-slf4j/pom.xml +++ b/jul-to-slf4j/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT jul-to-slf4j diff --git a/log4j-over-slf4j/pom.xml b/log4j-over-slf4j/pom.xml index eb1c04c0..4b4c8c30 100755 --- a/log4j-over-slf4j/pom.xml +++ b/log4j-over-slf4j/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT diff --git a/osgi-over-slf4j/pom.xml b/osgi-over-slf4j/pom.xml index a0617482..e3f8fe1e 100755 --- a/osgi-over-slf4j/pom.xml +++ b/osgi-over-slf4j/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT osgi-over-slf4j diff --git a/pom.xml b/pom.xml index e4e6e5ab..836cc652 100755 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT pom SLF4J diff --git a/slf4j-api/pom.xml b/slf4j-api/pom.xml index 6c64de63..56f7e24e 100755 --- a/slf4j-api/pom.xml +++ b/slf4j-api/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-api diff --git a/slf4j-ext/pom.xml b/slf4j-ext/pom.xml index cecdc895..c85962ac 100755 --- a/slf4j-ext/pom.xml +++ b/slf4j-ext/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-ext diff --git a/slf4j-jdk14/pom.xml b/slf4j-jdk14/pom.xml index 0a81db14..049c425c 100755 --- a/slf4j-jdk14/pom.xml +++ b/slf4j-jdk14/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-jdk14 diff --git a/slf4j-log4j12/pom.xml b/slf4j-log4j12/pom.xml index d313a9ca..94192ec0 100755 --- a/slf4j-log4j12/pom.xml +++ b/slf4j-log4j12/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-log4j12 diff --git a/slf4j-nop/pom.xml b/slf4j-nop/pom.xml index efaa25cf..7fe33ff3 100755 --- a/slf4j-nop/pom.xml +++ b/slf4j-nop/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-nop diff --git a/slf4j-simple/pom.xml b/slf4j-simple/pom.xml index 9568ab11..e7d7eb9d 100755 --- a/slf4j-simple/pom.xml +++ b/slf4j-simple/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-simple diff --git a/slf4j-site/pom.xml b/slf4j-site/pom.xml index 23dfcb32..ea9cdaf9 100755 --- a/slf4j-site/pom.xml +++ b/slf4j-site/pom.xml @@ -7,7 +7,7 @@ org.slf4j slf4j-parent - 2.0.0-alpha0 + 2.0.0-alpha1-SNAPSHOT slf4j-site From b05e7fe90da3583d343d26cea424dcb0a6cd640a Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Sun, 28 Jul 2019 18:25:07 +0200 Subject: [PATCH 010/121] allow SubstitutableLoggerTest to pass --- .../test/java/org/slf4j/helpers/SubstitutableLoggerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java index 3315239e..be15564a 100644 --- a/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java +++ b/slf4j-api/src/test/java/org/slf4j/helpers/SubstitutableLoggerTest.java @@ -46,8 +46,10 @@ import org.slf4j.helpers.SubstituteLogger; * @author Chetan Mehrotra */ public class SubstitutableLoggerTest { + // atTrace excluded during development of 2.0 API - private static final Set EXCLUDED_METHODS = new HashSet(Arrays.asList("getName", "atTrace", "atDebug", "atInfo", "atWarn", "atError")); + private static final Set EXCLUDED_METHODS = new HashSet(Arrays.asList("getName", "makeLoggingEventBuilder", "atTrace", + "atDebug", "atInfo", "atWarn", "atError")); @Test public void testDelegate() throws Exception { From d5074263f87b1b8b824e51cfc6e72d25b01c1ccb Mon Sep 17 00:00:00 2001 From: Ceki Gulcu Date: Tue, 6 Aug 2019 12:22:55 +0200 Subject: [PATCH 011/121] update 1,7,27 release information --- pom.xml | 2 +- slf4j-site/src/site/pages/news.html | 51 +++++++++++++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/pom.xml b/pom.xml index 836cc652..9aed47c0 100755 --- a/pom.xml +++ b/pom.xml @@ -33,7 +33,7 @@ - 1.7.26 + 1.7.27 8 ${jdk.version} diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index b8c4ac31..e34466d4 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -37,10 +37,57 @@ class names in --> -
-

2019 - Release of SLF4J 2.0.0-alpha0

+

6th of August, 2019 - Release of SLF4J 1.7.27

+ +

• 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/moduleJMPS module name
slf4j-apiorg.slf4j
slf4j-jdk14org.slf4j.jul
slf4j-noporg.slf4j.nop
slf4j-simpleorg.slf4j.simple
jcl-over-slf4jorg.apache.commons.logging
log4j-over-slf4jlog4j
+ +

• 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

The the 2.0.x series requires Java 8 and adds a backward-compatible Date: Fri, 9 Aug 2019 14:47:48 +0200 Subject: [PATCH 012/121] fix SLF4J-463 --- .../main/java/org/slf4j/LoggerFactory.java | 1 + .../main/java/org/slf4j/MarkerFactory.java | 1 - .../org/slf4j/spi/SLF4JServiceProvider.java | 29 ++++++++++++--- .../DoubleInitializationPitfallTest.java | 37 +++++++++++++++++++ slf4j-site/src/site/pages/news.html | 11 ++++++ 5 files changed, 73 insertions(+), 6 deletions(-) create mode 100644 slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java diff --git a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java index 995f3eb2..2c6e0970 100755 --- a/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/LoggerFactory.java @@ -148,6 +148,7 @@ public final class LoggerFactory { reportMultipleBindingAmbiguity(providersList); if (providersList != null && !providersList.isEmpty()) { PROVIDER = providersList.get(0); + // SLF4JServiceProvider.initialize() is intended to be called here and nowhere else. PROVIDER.initialize(); INITIALIZATION_STATE = SUCCESSFUL_INITIALIZATION; reportActualBinding(providersList); diff --git a/slf4j-api/src/main/java/org/slf4j/MarkerFactory.java b/slf4j-api/src/main/java/org/slf4j/MarkerFactory.java index 8c344faa..15ab2825 100644 --- a/slf4j-api/src/main/java/org/slf4j/MarkerFactory.java +++ b/slf4j-api/src/main/java/org/slf4j/MarkerFactory.java @@ -52,7 +52,6 @@ public class MarkerFactory { static { SLF4JServiceProvider provider = LoggerFactory.getProvider(); if (provider != null) { - provider.initialize(); MARKER_FACTORY = provider.getMarkerFactory(); } else { Util.report("Failed to find provider"); diff --git a/slf4j-api/src/main/java/org/slf4j/spi/SLF4JServiceProvider.java b/slf4j-api/src/main/java/org/slf4j/spi/SLF4JServiceProvider.java index 60052ef0..19d7e9a0 100755 --- a/slf4j-api/src/main/java/org/slf4j/spi/SLF4JServiceProvider.java +++ b/slf4j-api/src/main/java/org/slf4j/spi/SLF4JServiceProvider.java @@ -2,7 +2,16 @@ package org.slf4j.spi; import org.slf4j.ILoggerFactory; import org.slf4j.IMarkerFactory; +import org.slf4j.LoggerFactory; +/** + * This interface based on {@link java.util.ServiceLoader} paradigm. + * + *

It replaces the old static-binding mechanism used in SLF4J versions 1.0.x to 1.7.x. + * + * @author Ceki G¨lc¨ + * @since 1.8 + */ public interface SLF4JServiceProvider { @@ -10,8 +19,7 @@ public interface SLF4JServiceProvider { * Return the instance of {@link ILoggerFactory} that * {@link org.slf4j.LoggerFactory} class should bind to. * - * @return the instance of {@link ILoggerFactory} that - * {@link org.slf4j.LoggerFactory} class should bind to. + * @return instance of {@link ILoggerFactory} */ public ILoggerFactory getLoggerFactory(); @@ -19,15 +27,26 @@ public interface SLF4JServiceProvider { * Return the instance of {@link IMarkerFactory} that * {@link org.slf4j.MarkerFactory} class should bind to. * - * @return the instance of {@link IMarkerFactory} that - * {@link org.slf4j.MarkerFactory} class should bind to. + * @return instance of {@link IMarkerFactory} */ public IMarkerFactory getMarkerFactory(); - + /** + * Return the instnace of {@link MDCAdapter} that + * {@link MDC} should bind to. + * + * @return instance of {@link MDCAdapter} + */ public MDCAdapter getMDCAdapter(); public String getRequesteApiVersion(); + /** + * Initialize the logging back-end. + * + *

WARNING: This method is intended to be called once by + * {@link LoggerFactory} class and from nowhere else. + * + */ public void initialize(); } diff --git a/slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java b/slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java new file mode 100644 index 00000000..202f354c --- /dev/null +++ b/slf4j-simple/src/main/java/org/slf4j/simple/DoubleInitializationPitfallTest.java @@ -0,0 +1,37 @@ +package org.slf4j.simple; + +import static org.junit.Assert.fail; + +import org.junit.Test; +import org.slf4j.ILoggerFactory; +import org.slf4j.LoggerFactory; +import org.slf4j.MDC; +import org.slf4j.MarkerFactory; + +public class DoubleInitializationPitfallTest { + + + @Test + public void verifyImpactOfMarkerFactory() { + ILoggerFactory firstFactory = LoggerFactory.getILoggerFactory(); + MarkerFactory.getMarker("DOUBLE_INIT"); + ILoggerFactory secondFactory = LoggerFactory.getILoggerFactory(); + + if(firstFactory != secondFactory) { + fail("MarkerFactory.getMarker causes multiple provider initialization"); + } + } + + @Test + public void verifyImpactOfMDC() { + ILoggerFactory firstFactory = LoggerFactory.getILoggerFactory(); + MDC.put("DoubleInitializationPitfallTest", "a"); + ILoggerFactory secondFactory = LoggerFactory.getILoggerFactory(); + + if(firstFactory != secondFactory) { + fail("MarkerFactory.getMarker causes multiple provider initialization"); + } + } + + +} diff --git a/slf4j-site/src/site/pages/news.html b/slf4j-site/src/site/pages/news.html index e34466d4..9404e73e 100755 --- a/slf4j-site/src/site/pages/news.html +++ b/slf4j-site/src/site/pages/news.html @@ -37,6 +37,17 @@ class names in --> + +


+

2019 - Release of SLF4J 2.0.0-alpha1

+ + +

• Fix the double back-end initializatoin problem reported + in SLF4J-463 by + Dan Groves who also provided a test-case to reptoduce the problem + and a relevant fix. +

+

6th of August, 2019 - Release of SLF4J 1.7.27

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 [![Build Status](https://travis-ci.org/qos-ch/slf4j.svg)](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.28 8 ${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 @@