2009-01-26 24 views
5

Tôi có một tệp xây dựng như là một phần của quá trình xây dựng dựa trên một số nhiệm vụ. Các mục taskdef này (ví dụ: webdoclet và jasper2) sử dụng log4j làm trình ghi nhật ký. Lý tưởng nhất, tôi muốn có thể cung cấp một tệp cấu hình log4j khác nhau cho mỗi tệp, nhưng tối thiểu, tôi muốn có thể chỉ định tệp cấu hình log4j nào được sử dụng.Làm cách nào tôi có thể cung cấp log4j.xml tùy chỉnh cho các tác vụ kiến ​​khác nhau?

Những gì tôi đã làm mà được sử dụng để làm việc là đặt ở phía trước của classpath thư mục chứa log4j.xml mà tôi muốn taskdef sử dụng. Ví dụ:

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

Tôi đã xác minh rằng, trên thực tế, thư mục "Xây dựng" nằm ở phía trước đường dẫn lớp và tệp log4j.xml tồn tại trong thư mục đó. Tuy nhiên, khi tôi chạy ant ở chế độ tiết với log4j trong debug, tôi thấy log4j đang chọn log4j.xml nằm trong thư mục làm việc hiện tại hiện tại, không phải là cái tôi muốn. Log4j dường như không sử dụng classpath để giải quyết log4j.xml mặc định.

Tôi đang sử dụng log4j 1.2.8 (được nhúng trong một khung lớn hơn, vì vậy tôi không thể nâng cấp nó) và một số nhiệm vụ này xuất hiện dựa vào ghi nhật ký 1.0.3. Quá trình xây dựng sử dụng Sun Java 5.

Nếu tôi set ANT_OPTS=-Dlog4j.configuration=Build/log4j.xml trước khi chạy ant, taskdefs tải đúng log4j.xml mong muốn.

Đặt thư mục "Xây dựng" ở phía trước đường dẫn lớp cho các nhiệm vụ được sử dụng để hoạt động. Tôi không biết điều gì đã thay đổi. Làm thế nào tôi có thể khôi phục lại hành vi mà tôi có thể kiểm soát - trong tệp build.xml - tệp cấu hình log4j nào được sử dụng cho một tác vụ cụ thể? Có cách nào khác hơn là thiết lập ANT_OPTS và khác hơn là sắp xếp lại các tệp để di chuyển log4j.xml của ứng dụng ra khỏi thư mục làm việc hiện tại để nhận log4j để tìm tệp log4j.xml đúng không?

Trả lời

0

Bạn có thể di chuyển tệp log4j.xml trong thư mục làm việc hiện tại không?

+0

Tôi thực sự muốn không phải di chuyển bất kỳ tệp nào xung quanh. – Eddie

2

Log4j tải cấu hình của nó bằng cách tìm kiếm thuộc tính hệ thống log4j.configuration. Nếu không, nó sẽ tìm log4j.properties hoặc log4j.xml trên classpath.

Trên một số tác vụ kiến ​​chia rẽ một JVM mới, bạn có thể chỉ định thuộc tính hệ thống log4j.configuration với thẻ < jvmarg/>. Tuy nhiên, trên những người không đặt cược tốt nhất của bạn là tạo một mục nhập classpath có mục nhập đầu tiên là cấu hình log4j bạn muốn sử dụng.

+0

Vâng, tôi đang làm những gì bạn đề nghị - Tôi tạo một mục classpath có mục đầu tiên là (thư mục chứa) log4j cấu hình để sử dụng. Điều này được sử dụng để làm việc, nhưng bây giờ thì không. Nếu tôi đặt tệp log4j.xml trên đường dẫn lớp, nó vẫn không hoạt động. – Eddie

+0

Dường như nhiệm vụ jasper2 hỗ trợ phần tử "ngã ba", bạn có thể đặt nó thành true và thử sử dụng jvmarg không? – Kevin

+0

sử dụng đối số -verbose và -debug khi khởi động kiến, có lẽ thông tin bổ sung sẽ hữu ích về lý do không thành công –

0

Nếu tôi đặt ANT_OPTS = -Dlog4j.configuration = Build/log4j.xml trước khi chạy kiến, taskdefs tải đúng log4j.xml mong muốn.

Bạn đã thử đặt thuộc tính này bằng sysproperty chưa?

nên giống như thế này:

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

Thật không may, ít nhất trong Ant 1.7.0, bạn không thể sử dụng sysproperty trong taskdef hoặc không độc lập trong một mục tiêu. Vì vậy, điều này không hoạt động. – Eddie

3

tôi có thể chỉ định một tập tin cấu hình sử dụng một URL tập tin tương đối với sysproperty như thế này:

<java classname="com.lunatech.MainClass"> 
    <sysproperty key="log4j.configuration" value="file:src/log4j-debug.properties"/> 
    <classpath refid="runtime.classpath"/> 
</java> 
Các vấn đề liên quan