Передача операторов журнала JUL в Log4j2 при выполнении тестов jUnit с Gradle - PullRequest
0 голосов
/ 21 октября 2019

У меня есть приложение, которое использует протоколирование JUL. Я переключаю его на Log4j2, и я озадачен странным поведением ведения журнала при запуске тестов jUnit с использованием Gradle.

Пример упрощенного примера: тест

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, помещенный в папку ресурсов:

<?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'
}

КогдаЯ запускаю тест в Idea (с собственным тестером Idea) или в Eclipse. Я получаю его в консоли:

----------------------------------------------------------------------------------------------------------
org.apache.logging.log4j.jul.LogManager
2019-10-21 13:25:13.485 ERR -            t1     xxx                                      -------------------- W O R K I N G --------------------
----------------------------------------------------------------------------------------------------------

Когда я запускаю его с Gradle из CLI или с Idea с помощью Gradle Runner, я получаю следующее:

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"'.

Таким образом, проблема заключается в том, что при использовании Gradle загружается неправильный LogManager - JUL, несмотря на явное указание этого в коде, что я хочу реализовать JUL в Log4j. Как я могу убедить Gradle использовать Log4j Logger?

PS Я бы предпочел переключить все операторы журнала на Log4j и отказаться от JUL, но, к сожалению, на данный момент это не вариант.

1 Ответ

0 голосов
/ 21 октября 2019

Я решил эту проблему, добавив системное свойство в конфигурацию теста Gradle.

/* Logging configuration fot tests */
test {
    testLogging {
        showStandardStreams true
        exceptionFormat "full"
    }
    // set logging manager for tests in order to use Log4j2 JUL implementation
    systemProperty "java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...