2010-09-20 24 views
55

Câu hỏiCó thể tạo hiển thị log4j mà tệp được sử dụng để định cấu hình chính nó không?

Có thể làm cho Log4J hiển thị đường dẫn đầy đủ của tệp được sử dụng để định cấu hình không?


nền

Tôi có một mối quan hệ yêu-ghét với log4j. Trong thời điểm tốt, nó tuyệt vời nhưng khi nó không hoạt động, nó có thể là một trong những điều khó khăn nhất để gỡ lỗi. Tôi quản lý tất cả các đăng nhập trong ứng dụng của chúng tôi. Vì vậy, tôi rất quen thuộc với việc ghi nhật ký và default initialization procedure defined in the manual. Tuy nhiên, có vẻ như, cứ sau vài tuần, việc đăng nhập bị gián đoạn và tôi dành rất nhiều để phân loại vấn đề.

Lần này, nó bị hỏng nặng. Mỗi câu lệnh đăng nhập duy nhất ở khắp mọi nơi đang được đổ xuống bàn điều khiển và tôi không thể hiểu tại sao. Cùng một mã cơ sở chính xác đã sử dụng các tệp log4j.xml của tôi tuần trước, đột nhiên sử dụng một số cấu hình khác. Không có gì rõ ràng đã thay đổi. Đoán duy nhất của tôi là, một vài phụ thuộc đã thay đổi và tôi nghi ngờ Maven đã tải xuống một số JAR độc ác đang phá vỡ mọi thứ.

Nếu tôi chỉ có thể hình dung ra mà tập tin cấu hình Log4J quyết định sử dụng lúc khởi động, tôi có thể giải quyết vấn đề này và hầu hết các vấn đề khác một cách dễ dàng.


Tóm tắt

Có một số cách để nói Log4J để in tập tin đó nó được sử dụng cho cấu hình? Ngoài ra, có cách nào để phá vỡ một ứng dụng đang chạy và sử dụng trình gỡ lỗi để trả lời câu hỏi này (có thể với một biểu thức hoặc bằng cách kiểm tra các biến)?

Trả lời

61

Có, chỉ cần thêm log4j.debug vào biến hệ thống JVM. Ví dụ:

java -Dlog4j.debug -cp ... some.class.name 

Log4j sau đó sẽ ra một cái gì đó như sau:

log4j: Trying to find [log4j.xml] using context classloader [email protected] 
log4j: Using URL [file:/C:/Users/matt/workspace/projectname/target/test-classes/log4j.xml] for automatic log4j configuration. 
log4j: Preferred configurator class: org.apache.log4j.xml.DOMConfigurator 
log4j: System property is :null 
log4j: Standard DocumentBuilderFactory search succeded. 
log4j: DocumentBuilderFactory is: org.apache.xerces.jaxp.DocumentBuilderFactoryImpl 
log4j: debug attribute= "null". 
log4j: Ignoring debug attribute. 
log4j: reset attribute= "false". 
log4j: Threshold ="null". 
... 

Để tham khảo thấy the manualthe FAQ.

+0

tuyệt vời! Tôi không thể chờ đợi để thử vào ngày mai. – gMale

0

Tôi đang sử dụng Log4J2 và nếu bạn muốn để có được các tập tin từ bên trong chương trình Java của bạn này làm việc cho tôi:

LoggerContext lContect = LogManager.getContext(); 
Field f = lContect.getClass().getDeclaredField("configuration"); 
f.setAccessible(true); 
XmlConfiguration iWantThis = (XmlConfiguration) f.get(lContect); 
System.out.println("Config File: " + iWantThis.getName()); 
0

Các log4j 2 tương đương cho việc này là để thiết lập <Configuration status="trace"> trong file cấu hình. Điều này sẽ hiển thị vị trí từ nơi tệp cấu hình log4j2 được tải, cũng như các chi tiết nội bộ khác của quá trình cấu hình log4j2. Theo mặc định, mức trạng thái của trình ghi nhật ký là WARN, vì vậy bạn chỉ thấy thông báo khi có sự cố.

Nếu tệp cấu hình không được tìm thấy chính xác, bạn vẫn có thể bật ghi nhật ký trạng thái nội bộ log4j2 bằng cách đặt thuộc tính hệ thống org.apache.logging.log4j.simplelog.StatusLogger.level thành TRACE.

+2

Nhưng nếu bạn đang cố gắng tìm hiểu xem giá trị cấu hình nào đang được sử dụng, việc thêm giá trị đó vào một giá trị cấu hình có thể không hoạt động sẽ không làm được gì tốt! – Omaha

Các vấn đề liên quan