2009-01-26 124 views
5

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

我之前做过的工作是在类路径的前面放置包含我想让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> 

我验证过,事实上,“构建”目录在类路径的前面,一个log4j.xml文件在该目录中存在。但是,当我在debug模式下以log4j在详细模式下运行ant时,我发现log4j正在选择当前工作目录中的log4j.xml,这不是我想要的。 Log4j似乎没有使用类路径来解析默认的log4j.xml。

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

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

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

回答

0

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

+0

我真的宁愿不用动任何文件。 – Eddie 2009-01-26 23:39:27

2

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

在某些分叉新JVM的ant任务上,可以使用< jvmarg/>标记指定log4j.configuration系统属性。但是,对于那些并不是最好的选择是创建一个类路径条目,该条目的第一个条目是您希望使用的log4j配置。

+0

嗯,我正在做你的建议 - 我创建一个类路径条目,其第一个条目是要使用的(包含)log4j配置的目录。这曾经工作,但现在没有。如果我将log4j.xml文件放在类路径中,它仍然不起作用。 – Eddie 2009-01-27 00:05:39

+0

看来jasper2任务支持“fork”元素,你可以将其设置为true并尝试使用jvmarg? – Kevin 2009-01-27 00:11:07

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> 
3

我能够使用相对文件的URL与sysproperty这样的指定配置文件:

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