当前位置: 首页 > 知识库问答 >
问题:

在使用Gradle运行jUnit测试时将JUL日志语句传递给Log4j2

齐凯康
2023-03-14

我有一个应用程序使用JUL日志记录。我正在将它切换到Log4j2,而当使用Gradle运行jUnit测试时,日志记录的奇怪行为令我感到困惑。

示例简化示例:测试

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 --------------------
----------------------------------------------------------------------------------------------------------

当我从CLI使用Gradle运行它或使用Gradle runner使用Idea运行它时,我会得到这样的结果:

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,尽管在代码中明确告诉它我想要log4j的JUL实现。我怎样才能说服Gradle使用Log4j记录器呢?

附注。我更愿意将所有日志语句切换到Log4j和ducch JUL,但不幸的是,目前这不是一个选项。

共有1个答案

徐智渊
2023-03-14

我通过将system属性添加到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"
}
 类似资料:
  • 有没有更简单的方法来完成我想要的?如果这是最好的方法,那么我做错了什么?

  • 问题内容: 我是Gradle新秀,我不确定Gradle在运行测试集时是否会启动新的JVM。 就像将JVM参数传递给Gradle测试任务一样,我想将一些参数传递给运行测试集的JVM。 我在build.gradle中添加了以下几行: 但这告诉我: 我搜索了此错误,但未能解决。 问题答案: 尝试设置封闭任务的,而不要尝试将其设置为。 您收到的错误提示该错误不存在。 例: 这只是一个猜测,因为我没有要确认

  • 问题内容: 目前,我有以下 build.gradle 文件: 这 的build.gradle 文件是我的仓库 在这里 。我所有的主文件都在 src / model /中 ,它们各自的测试在 test / model中 。 如何正确添加JUnit 4 依赖项 ,然后在 测试/模型 文件夹中运行那些测试? 问题答案: 如何正确添加junit 4依赖关系? 假设您要针对标准Maven(或等效版本)存储库

  • 我有一个Java应用程序,它使用Gradle作为构建系统。这是多项目构建(几个Java项目)。 当我运行时,有些测试失败了,我注意到并不是所有的测试都在运行。 如果我将以下代码添加到中,它确实会运行所有测试,但当然,构建的代码总是成功完成: 我有两个问题: gradle是否在第一次失败后停止执行测试? 是否有一种方法可以运行所有测试(即使在一些测试失败时),并且如果其中一些测试失败,构建的测试仍然

  • 当前我有以下build.gradle文件: 此build.gradle文件用于我的存储库。我的所有主文件都在src/model/中,它们各自的测试都在test/model中。

  • 这里是Gradle 2.14和Groovy 2.4.7。我有以下groovy: