2012-01-18 5 views
11

Tôi đã làm hết sức mình để thiết lập nhật thực và Ứng dụng Java của tôi để sử dụng tệp log4j.properties. Tuy nhiên, nó dường như không được sử dụng các tập tin thuộc tính và tôi không chắc chắn lý do tại sao.Ứng dụng Java: Bắt Log4j hoạt động trong môi trường Eclipse

Libraries: slf4j-api-1.6.1, slf4j-jdk14-1.6.1

Trong ứng dụng khai thác gỗ hoạt động tốt. Tôi có thể in thông tin, cảnh báo và lỗi vào bảng điều khiển eclipse.

Điều tôi muốn làm là thay đổi mức nhật ký thành gỡ lỗi và in tất cả các thông điệp ghi nhật ký cho cả bảng điều khiển và tệp nhật ký.

Tôi đã tạo ra một file log4j.properties trông như thế này:

log4j.rootLogger=DEBUG,console,file 
log4j.rootCategory=DEBUG, R, O 

# Stdout 
log4j.appender.O=org.apache.log4j.ConsoleAppender 

# File 
log4j.appender.R=org.apache.log4j.RollingFileAppender 
log4j.appender.R.File=log4j.log 

# Control the maximum log file size 
log4j.appender.R.MaxFileSize=100KB 

# Archive log files (one backup file here) 
log4j.appender.R.MaxBackupIndex=5 
log4j.appender.file.File=checkLog.log 
log4j.appender.file.threshold=DEBUG 

log4j.appender.R.layout=org.apache.log4j.PatternLayout 
log4j.appender.O.layout=org.apache.log4j.PatternLayout 

log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 
log4j.appender.O.layout.ConversionPattern=[%d{ISO8601}]%5p%6.6r[%t]%x - %C.%M(%F:%L) - %m%n 

Cấu trúc thư mục của tôi trông như thế này:

My Project 
--src/ 
----MYProject/ 
------*.java 
--bin/ 
----MYProject/ 
------*.class 
--log4j/ 
----log4j.properties 

Trong nhật thực tôi đến: Run Configurations -> Classpath (tab) -> Nhấp chuột phải vào "Mục nhập của người dùng" -> Đã thêm "log4j" làm thư mục mới "và được lưu.

Sau đó, trong mã của tôi, tôi gọi trình ghi nhật ký như thế này (sa đang mple để chứng minh cách tiếp cận của tôi vì vậy nó có thể có lỗi cú pháp):

package MYProject; 
import org.slf4j.LoggerFactory; 

public class MyClass{ 

    final org.slf4j.Logger test_logger = LoggerFactory.getLogger(MyClass.class); 

    public MyClass(){} 

    public someMethod(){ 
    test_logger.debug("Some Debug"); 
    test_logger.info("Some Info"); 
    test_logger.warn("Some Warning"); 
    test_logger.error("An Error"); 
    } 

} 

sau đó tôi gọi someMethod và nó in INFO, WARN, KHÔNG CÓ LỖI đến nhật thực console. Nó sẽ không in DEBUG và sẽ không in ra tệp.

Tôi đánh giá cao mọi đề xuất về những gì tôi có thể đang làm sai.

Trả lời

14

Có thể có một tập tin log4j.properties hay log4j.xml trong classpath trước log4j.properties của bạn. Mở cấu hình chạy cho dự án của bạn và thêm -Dlog4j.debug=true làm Đối số VM cho dự án của bạn. Điều này sẽ hướng dẫn log4j in nhiều thông tin bổ sung trên bàn điều khiển, bao gồm tệp cấu hình mà nó đang sử dụng.

+1

Tôi đã chơi xung quanh với cả nhận xét và lời xin lỗi của bạn và đây là những gì tôi đã tìm ra. Tôi không thể thêm PropertyConfigurator với thiết lập hiện tại của mình vì nó là thuộc tính của thư viện log4j và không phải là một phần của thư viện slf4j-jdk14 (thư viện log4j của tôi khi tôi hiểu nó). Việc đặt các tham số VM thành true không trả về bất kỳ lỗi gỡ lỗi bổ sung nào. – Bryce

+0

Nếu tôi sau đó tham khảo thư viện log4j thực tế ngoài slf4j-jdk14 tôi bắt đầu nhận được kết quả gỡ lỗi. Chỉ cần thêm tham chiếu làm cho tệp log4j.properties của tôi bắt đầu hoạt động. Điều này dường như giúp tôi có được khoảng 90% những gì tôi cần. Điều này làm tăng việc gỡ rối nhưng các lệnh tôi in ra trong lớp đã cho trong bài viết ban đầu không còn in (test_logger.debug, test_logger.info, v.v.). Tôi nghĩ rằng điều này là do thư viện log4j tôi thêm vào là ghi đè org.slf4j.Logger mà tôi đã sử dụng trước đó. Tôi là một chút bối rối về cách để có được hai thư viện để làm việc tốt hơn với nhau, bất cứ đề nghị? – Bryce

+1

slf4j chỉ là một mặt tiền để ghi nhật ký, bạn vẫn phải thêm thư viện ghi nhật ký thực tế (log4j trong trường hợp của bạn) vào đường dẫn lớp của bạn. Xem liên kết này: http://slf4j.org/manual.html#binding –

2

Bạn cần thông báo mã của mình để sử dụng tệp thuộc tính. Trước khi bất kỳ khai thác gỗ được thực hiện xin vui lòng đặt

PropertyConfigurator.configure("log4j/log4j.properties"); 
3

Nếu bạn đang sử dụng khai thác gỗ mặt tiền slf4j, sau đó bạn cần phải xác định chính xác một khai thác gỗ phụ trợ bằng cách bao gồm các tập tin jar tương ứng cho backend đó. Trong trường hợp của bạn, bạn đã cài đặt slf4j-jdk14-x.x.x.jar trên classpath của bạn, mà chỉ là một backend logger chung.

Để sử dụng phụ trợ log4j, bạn cần xóa slf4j-jdk14-x.x.x.jar và thay thế bằng slf4j-log4j12-x.x.x.jar. Nếu bạn không xóa nó, slf4j phải chọn chỉ một lọ phụ trợ và có thể không phải là một trong những tiện ích bạn muốn.

Tất nhiên bạn cũng sẽ cần tệp thực tế log4j-x.x.x.jar trên đường dẫn lớp học của bạn.

Khi các lọ này được đặt đúng vị trí, thì thông số VM của -Dlog4j.debug sẽ thực sự hoạt động và hữu ích trong việc gỡ lỗi nơi cấu hình ghi nhật ký của bạn đến từ đó.

0

Bạn có thể có phiên bản cũ trong thư mục đích của mình. Làm sạch dự án và thử lại.

Ngoài ra, bạn nên đảm bảo rằng bạn làm mới dự án nhật thực nếu bạn không thêm log4j.properties qua nhật thực.

0

xóa jre (Thư viện hệ thống JRE) của dự án trong thẻ thuộc tính dự án đường dẫn/tab thư viện và đặt lại jre!

+0

Bạn có thể vui lòng xây dựng thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không? – abarisone