如何为不同的ant任务提供自定义log4j.xml?

时间:2009-01-26 23:23:19

标签: java ant log4j taskdef

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

我以前做过的工作就是在类路径的前面放置包含我希望taskdef使用的log4j.xml的目录。例如:

<target name="define.jasper2">
  <path id="jspc.classpath">
      <!-- Put this FIRST so Jasper will find the log4j.xml in the Build directory -->
      <pathelement location="Build"/>
      <fileset dir="${tomcat.libs}">
             ....
      </fileset>
      <pathelement location="${log4j.jar}"/>
      ....
  </path>

  <taskdef name="jasper2" classname="org.apache.jasper.JspC" classpathref="jspc.classpath"/>
</target>

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

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

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

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

4 个答案:

答案 0 :(得分:3)

我能够使用sysproperty的相对文件URL指定配置文件,如下所示:

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

答案 1 :(得分:2)

Log4j通过查找系统属性log4j.configuration来加载其配置。如果做不到这一点,它会在类路径上查找log4j.properties或log4j.xml。

在一些分支新JVM的ant任务中,您可以使用&lt; jvmarg /&gt;指定log4j.configuration系统属性。标签。但是,对于那些不是最好的选择是创建一个类路径条目,其第一个条目是您想要使用的log4j配置。

答案 2 :(得分:0)

您可以移动当前工作目录中的log4j.xml文件吗?

答案 3 :(得分:0)

  

如果我在运行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>