【问题标题】:How can I provide a custom log4j.xml for different ant tasks?如何为不同的 ant 任务提供自定义 log4j.xml?
【发布时间】:2010-10-03 16:00:29
【问题描述】:

我有一个构建文件,作为构建过程的一部分,它依赖于几个 taskdef。这些 taskdef 项(例如,webdoclet 和 jasper2)使用 log4j 作为记录器。理想情况下,我希望能够为每个提供不同的 log4j 配置文件,但至少,我希望能够指定使用哪个 log4j 配置文件。

我过去所做的是将包含我希望 taskdef 使用的 log4j.xml 的目录放在类路径的前面。例如:

…… 文件集> …… 路径> 目标>

我已经证实,事实上,“Build”目录位于类路径的前面,并且该目录中存在 log4j.xml。但是,当我在调试中使用 log4j 以详细模式运行 ant 时,我看到 log4j 正在选择 当前工作目录 中的 log4j.xml,这不是我想要的。 Log4j 似乎没有使用类路径来解析默认 log4j.xml。

我正在使用 log4j 1.2.8(嵌入在更大的框架中,所以我无法升级它)并且其中一些任务定义似乎依赖于 commons-logging 1.0.3。构建过程使用 Sun Java 5。

如果我在运行 ant 之前set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml,taskdefs 会正确加载所需的 log4j.xml。

将“Build”目录放在用于工作的 taskdef 的类路径的前面。我不知道发生了什么变化。如何恢复我可以控制的行为——在 build.xml 中——哪个 log4j 配置文件用于给定任务?除了设置 ANT_OPTS 和重新排列文件以将应用程序的 log4j.xml 移出当前工作目录以使 log4j 找到正确的 log4j.xml 文件之外,还有其他方法吗?

【问题讨论】:

    标签: java ant log4j taskdef


    【解决方案1】:

    我可以使用带有sysproperty 的相对文件 URL 来指定配置文件,如下所示:

    <java classname="com.lunatech.MainClass">
       <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/>
       <classpath refid="runtime.classpath"/>
    </java>
    

    【讨论】:

      【解决方案2】:

      Log4j 通过查找系统属性 log4j.configuration 来加载其配置。否则,它会在类路径中查找 log4j.properties 或 log4j.xml。

      在一些 fork 新 JVM 的 ant 任务上,您可以使用 标签指定 log4j.configuration 系统属性。然而,对于那些你最好的选择是创建一个类路径条目,其第一个条目是你想要使用的 log4j 配置。

      【讨论】:

      • 好吧,我正在按照您的建议进行操作——我创建了一个类路径条目,其第一个条目是要使用的(包含该目录的)log4j 配置。这曾经有效,但现在不行。如果我把log4j.xml文件放在classpath下,还是不行。
      • jasper2 任务似乎支持“fork”元素,您可以将其设置为 true 并尝试使用 jvmarg 吗?
      • 在启动 ant 时使用 -verbose 和 -debug 参数,也许额外的信息将有助于解释它失败的原因
      【解决方案3】:

      能否移动当前工作目录中的 log4j.xml 文件?

      【讨论】:

      • 我真的希望不必移动任何文件。
      【解决方案4】:

      如果我在运行 ant 之前设置 ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml,taskdefs 会正确加载所需的 log4j.xml。

      您是否尝试过使用 sysproperty 设置此属性?

      应该是这样的:

      <target name="define.jasper2">
         <sysproperty key="log4j.configuration" value="Build/log4j.xml"/>
         ...
      </target>
      

      【讨论】:

      • 不幸的是,至少在 Ant 1.7.0 中,您既不能在 taskdef 中使用 sysproperty,也不能在目标中独立使用。所以这行不通。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-05
      • 2014-09-09
      • 2019-08-10
      相关资源
      最近更新 更多