Java log4j-jul配置以某种方式通过gradle-junit5测试使所有log4j2日志记录静音

Java log4j-jul配置以某种方式通过gradle-junit5测试使所有log4j2日志记录静音,java,gradle,log4j2,junit5,java.util.logging,Java,Gradle,Log4j2,Junit5,Java.util.logging,首先,这里是完整的源代码 当我在JUnit任务中启用system属性时,所有日志记录都会消失 tasks.test { // Use junit platform for unit tests. useJUnitPlatform() // this isn't currently enabled in the code, so you can see the logging working when you run the ./gradlew build, but if you u

首先,这里是完整的源代码

当我在JUnit任务中启用system属性时,所有日志记录都会消失

tasks.test {
  // Use junit platform for unit tests.
  useJUnitPlatform()

  // this isn't currently enabled in the code, so you can see the logging working when you run the ./gradlew build, but if you uncomment it, you'll see the logs disappear.
  systemProperty("java.util.logging.manager","org.apache.logging.log4j.jul.LogManager")

  testLogging {
    lifecycle {
      showStandardStreams = true
      displayGranularity = 2
      events.addAll(listOf(
        TestLogEvent.STARTED,
        TestLogEvent.PASSED,
        TestLogEvent.SKIPPED,
        TestLogEvent.FAILED
      ))
    }
  }
  reports {
    html.isEnabled = false
    junitXml.isEnabled = true
  }
}
这是我的

static void configureLog4j(){
var console=“console”;
var builder=ConfigurationBuilderFactory.newConfigurationBuilder();
var defaultAppender=builder.newAppender(控制台,“控制台”)
.addAttribute(“目标”,ConsoleAppender.target.SYSTEM_OUT);
defaultAppender.add(builder.newLayout(“PatternLayout”)
.addAttribute(“模式”,“突出显示{%-5level}-%msg%n-上下文%MDC%n%throwable”);
builder.add(defaultAppender);
builder.add(builder.newRootLogger(Level.ERROR)
.add(builder.newAppenderRef(控制台));
add(builder.newLogger(“com.xenoterracide”,Level.DEBUG));
Configurator.initialize(builder.build());
}
下面是一个例子的相关部分

类记录汇编测试{
@以前
静态无效配置log4j(){
Application.configureLog4j();
}
@试验
void parsers()引发异常{
我确实在这里看到了其他答案,但这是他们给出的答案,所以我不确定为什么它会阻止我的其他日志记录。我的最终目标是让所有日志记录工作正常,但阻止
javax.money
/
moneta
日志记录

更新:

使用
/gradlew run
时,在
JavaExec
任务中设置属性会起作用,但不确定为什么它不适用于测试

tasks.withType<JavaExec> {
  systemProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager")
}
tasks.withType{
systemProperty(“java.util.logging.manager”、“org.apache.logging.log4j.jul.LogManager”)
}
您可以。使用您的代码添加
printConfig
方法并使用@AfterAll调用它。当我使用您的代码执行此操作并运行
/gradlew build
时,我得到以下输出:

FileProcessorTest STANDARD_ERROR
java.util.logging.config.class was null
java.util.logging.config.file was null
LogManager=org.apache.logging.log4j.jul.LogManager
scn=CoreLogger, n=, uph=true, l=WARNING, fl=null
    ->org.slf4j.bridge.SLF4JBridgeHandler, h=ALL, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.timer, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.LauncherConfigurationParameters, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.EngineDiscoveryOrchestrator, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.descriptor.JupiterTestDescriptor, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.ServiceLoaderTestExecutionListenerRegistry, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.execution.JupiterEngineExecutionContext, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.discovery.MethodOrderingVisitor, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.InternalTestPlan, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.monitor, uph=true, l=null, fl=null
scn=CoreLogger, n=javax.management.notification, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.execution.ConditionEvaluator, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.mbeanserver, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.ServiceLoaderPostDiscoveryFilterRegistry, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.extension.TimeoutConfiguration, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.TestExecutionListenerRegistry, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.extension.MutableExtensionRegistry, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.discovery.MethodSelectorResolver, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.relation, uph=true, l=null, fl=null
scn=CoreLogger, n=javax.management.modelmbean, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.execution.ExecutableInvoker, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.javamoney.moneta.spi.MoneyUtils, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.EngineIdValidator, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.descriptor.DisplayNameUtils, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.support.OpenTest4JAndJUnit4AwareThrowableCollector, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.commons.util.ReflectionUtils, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.misc, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.platform.engine.support.hierarchical.NodeTestTask, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.javamoney.moneta.spi.MonetaryConfig, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=javax.management.mlet, uph=true, l=null, fl=null
scn=CoreLogger, n=org.junit.jupiter.engine.config.EnumConfigurationParameterConverter, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.junit.platform.commons.util.ClasspathScanner, uph=true, l=SEVERE, fl=null
scn=CoreLogger, n=org.javamoney.moneta.DefaultMonetaryContextFactory, uph=true, l=SEVERE, fl=null
外卖包括:

  • 已安装org.apache.logging.log4j.jul.LogManager。[通过]
  • org.slf4j.bridge.SLF4JBridgeHandler已安装并设置为ALL。您的代码正在使用log4j,但似乎slf4j也已安装[警告]
  • 所有记录器均按照
    uph=true
    [PASS]向SLF4JBridgeHandler发布
  • 没有
    com.xenoterracide
    logger。项目使用logj。[通过]
  • 根记录器设置为警告。将只看到警告和错误。[可疑]
  • 子日志记录器是null和SEVERE的混合。将只看到警告和错误。[可疑]
  • 因此,让我们再次运行它,但不在任何位置设置log4j.jul.LogManager,我将使用System.out:

    FileProcessorTest STANDARD_OUT
    java.util.logging.config.class was null
    java.util.logging.config.file was null
    LogManager=java.util.logging.LogManager
    scn=RootLogger, n=, uph=true, l=INFO, fl=null
        ->java.util.logging.ConsoleHandler, h=INFO, fl=null
    scn=Logger, n=org.junit.jupiter.engine.execution.InvocationInterceptorChain$ValidatingInvocation, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.timer, uph=true, l=null, fl=null
    scn=Logger, n=global, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.LauncherConfigurationParameters, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.EngineDiscoveryOrchestrator, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.descriptor.JupiterTestDescriptor, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.ServiceLoaderTestExecutionListenerRegistry, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.descriptor.MethodBasedTestDescriptor, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.execution.JupiterEngineExecutionContext, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.discovery.MethodOrderingVisitor, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.InternalTestPlan, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.execution.ConditionEvaluator, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.monitor, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.notification, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.mbeanserver, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.ServiceLoaderPostDiscoveryFilterRegistry, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.extension.TimeoutConfiguration, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.TestExecutionListenerRegistry, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.extension.MutableExtensionRegistry, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.discovery.MethodSelectorResolver, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.relation, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.execution.ExecutableInvoker, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.modelmbean, uph=true, l=null, fl=null
    scn=Logger, n=org.javamoney.moneta.spi.MoneyUtils, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter, uph=true, l=null, fl=null
    scn=Logger, n=javax.management, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.EngineIdValidator, uph=true, l=null, fl=null
    scn=Logger, n=org.javamoney.moneta.Money, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.descriptor.DisplayNameUtils, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.support.OpenTest4JAndJUnit4AwareThrowableCollector, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.commons.util.ReflectionUtils, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.misc, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.engine.support.hierarchical.NodeTestTask, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.launcher.core.ServiceLoaderTestEngineRegistry, uph=true, l=null, fl=null
    scn=Logger, n=org.javamoney.moneta.spi.MonetaryConfig, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.jupiter.engine.config.EnumConfigurationParameterConverter, uph=true, l=null, fl=null
    scn=Logger, n=org.junit.platform.commons.util.ClasspathScanner, uph=true, l=null, fl=null
    scn=Logger, n=javax.management.mlet, uph=true, l=null, fl=null
    scn=Logger, n=org.javamoney.moneta.DefaultMonetaryContextFactory, uph=true, l=null, fl=null
    
    现在,当我比较这两次跑步时,您可以看到:

  • 当log4j log manager运行时,级别要么是从根记录器继承的警告,要么是在子记录器上设置的严重级别
  • 运行JUL日志管理器时,所有级别都继承信息
  • 我认为你所看到的问题是存在的

  • 您需要将根记录器级别设置为给定级别。
    builder.add(builder.newRootLogger(级别)
  • log4j配置未正确更新JUL记录器级别。这表明Application::configureLog4j中存在错误
  • 未安装org.slf4j.bridge.SLF4JBridgeHandler。可能在安装桥处理程序时,输出将转到slf4j,并且没有针对slf4j的控制台附加程序设置
  • 您可以尝试明确排除jul-to-slf4j包。也许这将允许logj4控制jul而不是slf4j。还有一个相关信息