java - 使用 <ant> 任务调用的构建文件会重置调用者的日志记录配置

标签 java logging ant java.util.logging

两个项目:产品(项目-A)和 A 的汽车基准测试项目(项目-B)。

在 B 的构建文件中,我们需要调用 A 的构建文件来运行构建和 bundle-with-app-server 过程,如下所示:

<ant antfile="${build-file-A}" inheritall="false" target="all" />

而且,在项目 B 中,我们有很多使用 java.util.logging(JDK 日志记录框架)输出消息的 Ant 任务。

问题是,在该行之后,所有 jdk 记录器输出都消失了。

通过调试,我发现,在项目A的构建文件的初始化过程中,项目A中的一个静态定义的东西会运行LogManager.readConfiguration(InputStream)。 ,它加载一个配置文件,该文件仅包含单个类的记录器配置。

并且在 readConfiguration 期间, LogManager.reset()将被调用; 期间 reset ,每个记录器的每个处理程序都将被删除。作为<ant>会将目标构建文件加载到调用者的同一进程,所有处理程序都将被删除。

因此,除了配置的类,其他所有使用 jdk logger 的类都由于缺少输出处理程序而无法输出消息。

我的问题是:

有什么办法可以解决这个问题,除了:

  1. 使用<exec>运行项目 A 的构建文件;
  2. 写一个任务来运行readConfiguration()<ant> 之后从默认配置文件恢复默认 JDK 日志记录设置打电话。
  3. 使用 ant 自己的日志框架(Task.log() 等)。

请注意,我无法修改项目 A 来防止出现问题。

最佳答案

您可以创建 LogManager 的子类并覆盖 reset 和两个 readConfiguration 方法来安装您需要的处理程序。然后使用 java.util.logging.config.class 系统属性在 statup 上安装您的自定义代码。

关于java - 使用 <ant> 任务调用的构建文件会重置调用者的日志记录配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17718635/

相关文章:

java - 用 1 和 0 初始化的信号量之间的区别

java - 打开新的 JFrame 时禁用 JFrame

ios - Worklight iOS native 构建在 Jenkins 上失败

ant - 从 Gradle 使用 ANTBuilder 时 ant 插件的类路径

java - 将 autoprefix-cli 添加到 ANT 构建

java - tomcat中的独立应用程序

tomcat - 将 Apache Tomcat 作为 Windows 服务运行时如何限制 stdout.log 文件大小?

java ->>项目管理

java - log4j 结构化以实现一致的日志记录

java - 装饰器模式与使用 super