使用任务调用的构建文件<ant>将重置调用方的日志记录配置



两个项目:产品(项目A)和A的自动基准测试项目(项目B)。

在B的构建文件中,我们需要调用A的构建文件来运行构建并与应用服务器捆绑,过程如下:

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

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

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

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

readConfiguration期间,将调用LogManager.reset()reset期间,每个记录器的每个处理程序都将被删除。由于<ant>将把目标构建文件加载到调用方的同一进程,因此所有处理程序都将被删除。

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

我的问题是:

除了之外,还有什么方法可以解决这个问题吗

  1. 使用<exec>运行项目A的构建文件
  2. 编写一个任务来运行readConfiguration(),以便在<ant>调用后从默认配置文件中恢复默认的JDK日志记录设置
  3. 使用ant自己的日志框架(Task.log()等)

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

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

最新更新