I have an application that uses JUL logging. I am switching it to Log4j2 and I am perplexed by strange behavior of logging when running jUnit tests using Gradle.
Sample simplified example: Test
import org.junit.Test;
import java.util.logging.LogManager;
import java.util.logging.Logger;
public class Test1
{
static
{
System.setProperty("java.util.logging.manager", org.apache.logging.log4j.jul.LogManager.class.getName());
}
private static final Logger LOG = Logger.getLogger("xxx");
@Test
public void test1()
{
System.out.println("----------------------------------------------------------------------------------------------------------");
System.out.println(LogManager.getLogManager().getClass().getName());
LOG.severe("-------------------- W O R K I N G --------------------");
System.out.println("----------------------------------------------------------------------------------------------------------");
}
}
log4j2.xml placed in resource folder:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
<Properties>
<Property name="loggingPattern">%date{YYYY-MM-dd HH:mm:ss.SSS} %maxLength{%-6level}{3} %12replace{%1MDC{mySession}}{\s+}{- } t%-5T %-40.40logger{1.1} %msg{nolookups}%n</Property>
</Properties>
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="${loggingPattern}"/>
</Console>
</Appenders>
<Loggers>
<Root level="WARN">
<AppenderRef ref="Console" level="ALL"/>
</Root>
</Loggers>
</Configuration>
build.gradle
plugins {
id 'java'
}
group 'org.raqua'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.12.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.12.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-jul', version: '2.12.1'
testCompile group: 'junit', name: 'junit', version: '4.12'
}
When I run the test in Idea (with Idea's own test runner) or Eclipse I get this printed in console:
----------------------------------------------------------------------------------------------------------
org.apache.logging.log4j.jul.LogManager
2019-10-21 13:25:13.485 ERR - t1 xxx -------------------- W O R K I N G --------------------
----------------------------------------------------------------------------------------------------------
When I run it with Gradle from CLI or with Idea using Gradle runner I get this:
Testing started at 1:26 PM ...
> Task :cleanTest
> Task :compileJava NO-SOURCE
> Task :processResources UP-TO-DATE
> Task :classes UP-TO-DATE
> Task :compileTestJava UP-TO-DATE
> Task :processTestResources NO-SOURCE
> Task :testClasses UP-TO-DATE
> Task :test
----------------------------------------------------------------------------------------------------------
java.util.logging.LogManager
Oct 21, 2019 1:26:45 PM Test1 test1
SEVERE: -------------------- W O R K I N G --------------------
----------------------------------------------------------------------------------------------------------
BUILD SUCCESSFUL in 0s
4 actionable tasks: 2 executed, 2 up-to-date
1:26:45 PM: Tasks execution finished ':cleanTest :test --tests "Test1"'.
So the issue seems to be that when using Gradle, incorrect LogManager - JUL is loaded, despite explicitly telling it in the code that I want Log4j's JUL implementation. How can I persuade Gradle to use Log4j logger?
P.S. I would prefer to switch all log statements to Log4j and ditch JUL, but that is unfortunately not an option at the moment.