2012-05-03 26 views
7

Điểm có tuyên bố nếu ở đây là gì? Mức độ nghiêm trọng có thể được thay đổi trong tập tin cấu hình log4j.xml. Nếu mức độ nghiêm trọng là gỡ lỗi, nó sẽ đăng nhập thông báo gỡ lỗi, nếu không nó sẽ không.đăng nhập gỡ lỗi kích hoạt kiểm tra trong java

Ý nghĩa của câu lệnh if dưới đây là gì?

if (log.isDebugEnabled()) 
    { 
     log.debug("I am logging something"); 
    } 

Trả lời

12

Trong ví dụ của bạn không có nhu cầu về một 'nếu' statement (giữa 'nếu' không phải là một vòng lặp)

Nhưng nếu bạn lấy ví dụ dưới đây sau đó bạn có thể thấy rằng chúng tôi làm một nối và nếu cấp độ đăng nhập là thông tin sau đó không cần thiết thao tác ghép nối này sẽ được thực hiện. Để có hiệu suất tốt hơn, chúng tôi kiểm tra tình trạng này.

if (log.isDebugEnabled()) 
{ 
    log.debug("I am logging " + 1234 + "."); 
} 

thêm thông tin:

Sử dụng slf4j để tránh như vậy nếu có điều kiện. Tuyên bố trên có thể được viết lại trong slf4j như sau,

log.debug("I am logging {} .", 1234); 
+1

+1 cho SLF4J. Không có nhiều căng thẳng như một tính năng tuyệt vời. – adarshr

+0

mặt khác, chúng ta có thể thảo luận về những gì có hiệu suất tốt hơn - một 'if' (+1 getter) hoặc một số cuộc gọi phương thức để xác định xem debug được kích hoạt hay vô hiệu hóa ... – Betlista

2

Đây được xem là phương pháp hay. Ví dụ, nếu có một số chuỗi nối nó không được đánh giá và kiểm tra trong log4j, nhưng nó được kiểm tra đầu tiên.

Ví dụ:

if (log.isDebugEnabled()) { 
    log.debug("N=" + N + ", a=" + Arrays.toString(a)); 
} 

phương pháp Arrays.toString() và cũng nối không được thực hiện nếu debug không được kích hoạt. Nếu không có if nó được gọi trước và sau đó được kiểm tra, đó là tất cả ;-)

Ý kiến ​​của tôi là khi có chuỗi đơn giản như trong ví dụ của bạn nếu xung quanh việc ghi nhật ký là không cần thiết, nếu có điều gì phức tạp hơn (thậm chí phức tạp hơn như trong ví dụ của tôi) điều này có thể tiết kiệm một số thời gian CPU trong chế độ sản xuất (không có chế độ gỡ lỗi được kích hoạt). Bạn cũng phải nhận ra rằng trong trường hợp ghép nối có String.valuOf() gọi (đối tượng không null) gọi phương thức toString(), có thể thực sự là vấn đề hiệu suất đối với các đối tượng dữ liệu lớn (các bean có nhiều thuộc tính) nếu bạn xem xét nó gọi không logic kinh doanh (do đó nó là "vô ích").

+0

Không có nối nào ngụ ý ít đối tượng được tạo ra, ngụ ý ít rác hơn để thu thập. Sâu trong vòng trong vv tiết kiệm có thể khá đáng kể. – djna

+0

Tôi không hiểu rõ tình cảm đầu tiên của bạn. Trong ví dụ của tôi ngay cả khi debug là các đối tượng bị vô hiệu hóa '" N = "', '", a = "' được tạo ra (như hằng số trong thời gian biên dịch), do đó không có bộ nhớ tiết kiệm. Có lẽ bạn có thể mô tả nhiều hơn ;-) – Betlista

+0

Nói chung, mọi người không chỉ đăng nhập một số chuỗi liên tục, họ đăng nhập "X =" + x + ", y =" + y v.v ... hiển thị các giá trị. Trong nhiều trường hợp, bạn cũng có thể gọi toString() trên một số đối tượng, mà chính nó có thể nối các giá trị. Tốt hơn để sử dụng thành ngữ an toàn trong mọi trường hợp ... – djna

0

Đó là tối ưu hóa hiệu suất. Nó được thực hiện để tránh đánh giá các đối số cho log.debug. Nó chỉ đáng làm nếu việc xây dựng thông điệp tường trình đặc biệt tốn kém (ví dụ: nối tiếp một tài liệu XML).

Điều này được đề cập chi tiết trong số Short introduction to log4j.

+0

Bài tham khảo cho biết "Chi phí xây dựng tham số này có thể khá cao và phụ thuộc vào kích thước của tham số liên quan."Bài báo không nói rằng bài kiểm tra chỉ đáng làm nếu chi phí xây dựng" đặc biệt đắt "- đó là cách giải thích hoặc trải nghiệm của bạn. Theo tôi, tốt hơn là nên tham gia vào thói quen làm bài kiểm tra. – djna

+0

Không, tôi nghĩ đó là Trừ khi bạn đang đăng nhập, ví dụ như trong vòng lặp chặt chẽ (mà bạn có thể sẽ không được, vì bạn sẽ tạo ra một lượng lớn tiếng ồn đăng nhập), nối một vài chuỗi giành được – harto

+1

trong bất kỳ trường hợp cụ thể, tôi chấp nhận rằng nó có thể có khả năng nó là overkill.Đối với tôi những vấn đề là: a) .Các lập trình viên có xu hướng áp dụng thói quen và sử dụng chúng mà không xem xét từng trường hợp b). để được rằng "X =" + X là rẻ, sau đó một người nào đó thay đổi toString của X(), bây giờ nó không phải là. Nó chỉ là quá khó để liên tục thực hiện các phân tích hiệu suất. Nó không phải tốn kém về nỗ lực hoặc kích thước chương trình để thêm tes t. – djna

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