如何配置 J.U.L。在 JUnit 测试期间记录?

How to configure J.U.L. logging during JUnit tests?

我遇到了与此相同的问题: - 除了我使用的是 java.util.logging,而不是 Log4j。

具体而言,我正在将一个现有的(Maven 构建的)应用程序从 Log4j 转换为 java.util.logging,以符合客户要求(不可协商)。一切都使用 SLF4J,因此代码更改很少。有超过一千个测试 classes,分布在几个模块中;我们目前在这些模块的 src/test/resources 中有一个 log4j.properties 文件来自定义测试的日志输出。

我认为日志输出可以很容易地为测试定制是很重要的:如果开发人员破坏了测试并想要读取日志输出,我宁愿他们在本地调整日志配置而不是开始搞乱(小心选择)代码中的日志级别,导致 "everything logged at info" 综合症。请注意,我希望测试日志配置应用于 "the test+application code when executed under test conditions".

我不想为每个测试添加日志设置 class(如此处建议:How to set the Loglevel for a JUnit Test),因为有大量测试。这似乎是错误的解决方案。我也不想去编辑 JVM 的 logging.properties 文件,因为那会影响一切。这个应用程序不是我唯一做的事。我还必须让其他人做出相同的更改。

现有系统可以工作,因为 Log4j 从 class 路径中获取 /log4j.properties是否有 java.util.logging 的等效机制?

目前的想法:添加一个 logging.properties 文件来替换现有的配置,并尝试破解 Maven 配置以设置 java.util.logging.config.file 参数指向它。有没有更简洁的方法?

Is there a neater way?

这可能是最多的 reliable method to set the logging configuration

Is there an equivalent mechanism for java.util.logging?

java.util.logging.LogManager 文档中列出了配置选项。您可以:

  1. 设置 java.util.logging.config.file 属性 并使用属性文件。
  2. 设置 java.util.logging.config.class 属性 并创建一个 class 文件,其中包含无参数构造函数以执行您希望手动配置记录器的任何代码。
  3. 使用LogManager.readConfiguration(InputStream) and ClassLoader.getResourceAsStream(String)加载新配置。这个逻辑也可以与 java.util.logging.config.class 属性 组合。

一个项目范围的 src/test/resources/logging.properties can be set specifically for unit testing via the java.util.logging.config.file 系统 属性 在你的 @BeforeClass 方法中使用一行:

System.setProperty("java.util.logging.config.file", ClassLoader.getSystemResource("logging.properties").getPath());