Tôi cấu hình log4j trong lớp thử nghiệm JUnit ở đâu?


85

Nhìn vào trường hợp thử nghiệm JUnit cuối cùng mà tôi đã viết, tôi đã gọi phương thức BasicConfigurator.configure () của log4j bên trong hàm tạo lớp. Điều đó hoạt động tốt khi chỉ chạy một lớp đơn lẻ đó từ lệnh "run as JUnit test case" của Eclipse. Nhưng tôi nhận ra nó không chính xác: Tôi khá chắc chắn rằng bộ thử nghiệm chính của chúng tôi chạy tất cả các lớp này từ một quy trình và do đó cấu hình log4j sẽ xảy ra ở đâu đó cao hơn.

Nhưng tôi vẫn cần chạy một trường hợp thử nghiệm một mình, trong trường hợp đó, tôi muốn cấu hình log4j. Tôi nên đặt lệnh gọi cấu hình ở đâu để nó được chạy khi trường hợp thử nghiệm chạy độc lập, chứ không phải khi trường hợp thử nghiệm được chạy như một phần của bộ lớn hơn?


Tôi sẽ giả sử log4j 1.x ở đây, không phải 2 ...
rogerdpack

Câu trả lời:


51

Các LogManagerxác định lớp mà log4j cấu hình để sử dụng trong một khối tĩnh mà chạy khi lớp được nạp. Có ba tùy chọn dành cho người dùng cuối:

  1. Nếu bạn chỉ định log4j.defaultInitOverridefalse, nó sẽ không cấu hình log4j.
  2. Chỉ định đường dẫn đến tệp cấu hình theo cách thủ công và ghi đè tìm kiếm classpath. Bạn có thể chỉ định trực tiếp vị trí của tệp cấu hình bằng cách sử dụng đối số sau để java:

    -Dlog4j.configuration=<path to properties file>

    trong cấu hình người chạy thử nghiệm của bạn.

  3. Cho phép log4j quét classpath để tìm tệp cấu hình log4j trong quá trình kiểm tra của bạn. (mặc định)

Xem thêm tài liệu trực tuyến .


Làm sao nó biết đó là "tệp cấu hình log4j?" Tên tệp là gì? (log4j.xml?)
Chad

1
@Chad: Tôi đã chỉnh sửa câu trả lời của mình để giải quyết câu hỏi của bạn. Vui lòng xem liên kết đến khối tĩnh để biết chính xác cách thực hiện điều này.
Paul Morie

Tôi đang sử dụng log4j2 và tôi đã phải sử dụng các thiết lập sau đây để chỉ một tập tin: -Dlog4j.configurationFile=log4j2.xml. Ngoài ra, nếu bạn đang cố gắng để gỡ lỗi tải / khởi động, thiết lập này có thể hữu ích: -Dlog4j2.debug=true.
Kent

Bất kỳ cách nào để được cụ thể hơn một chút về câu trả lời này?
markthegrea

61

Tôi thường chỉ đặt một tệp log4j.xml vào src / test / resources và để log4j tự tìm nó: không cần mã, khởi tạo log4j mặc định sẽ chọn nó. (Tôi thường muốn đặt trình ghi nhật ký của riêng mình thành 'GỠ LỖI')


6
Đối với thử nghiệm xây dựng tiêu chuẩn, tôi sẽ đặt Log4j thành cảnh báo hoặc thậm chí là lỗi. Nếu các thử nghiệm thành công (cả các thử nghiệm âm tính) thì không được ghi nhật ký, điều này thu hút sự chú ý của người dùng.
keiki

2
Đúng vậy cho log4j 1.x. Đối với log4j2 rõ ràng bạn có thể sử dụng nhiều tệp "kỳ lạ" hơn như tệp log4j2-test.properties ... logging.apache.org/log4j/2.x/manual/configuration.html :)
rogerdpack


5

Tôi sử dụng thuộc tính hệ thống trong log4j.xml:

...
<param name="File" value="${catalina.home}/logs/root.log"/>
...

và bắt đầu kiểm tra với:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>2.16</version>
    <configuration>
        <systemProperties>
            <property>
                <name>catalina.home</name>
                <value>${project.build.directory}</value>
            </property>
        </systemProperties>
    </configuration>
</plugin>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.