2009-01-26 126 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> 
相關問題