2012-04-27 19 views
23

Tôi luôn sử dụng các mô hình sau đây để xây dựng (SLF4J) logger:Chi phí của việc tạo nhật ký SLF4J trong bối cảnh tĩnh và không tĩnh là gì?

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

này đã làm việc cho đến nay, nhưng tôi đã tự hỏi về static bối cảnh tại một số điểm và nhu cầu để vượt qua trong lớp bê tông đen tất cả các thời gian thay vì chỉ sử dụng một logger không tĩnh như

private final Logger log = LoggerFactory.getLogger(getClass()); 

này đã cơ bản được yêu cầu (và trả lời) trước đây để log4j

Should logger be private static or not

và đây

Should be logger always final and static?

Tôi nhận ra final về cơ bản là bắt buộc, vì vậy tôi lại tự hỏi cao bao nhiêu chi phí của việc sử dụng của SLF4J trong bối cảnh không tĩnh thực sự là.

Q:

đáng kể thực tế overhead của việc sử dụng

private final Logger log = LoggerFactory.getLogger(getClass()); 

qua

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

ở mức trung bình (web) ứng dụng ? (Không cần phải "thảo luận" cao cấp, nặng tải webapps đây)


Lưu ý, tôi cuối cùng lên kế hoạch để sử dụng một cách tiếp cận thậm chí đẹp hơn bằng CDI để có được một logger SLF4J như

@Inject private final Logger log; 

như được mô tả ở đây http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection, nhưng trước tiên tôi cần phải biết về bộ nhớ đệm của trình ghi nhật ký.

câu hỏi Sub: là nó thậm chí có thể sử dụng ?:

@Inject private static final Logger log; 

(chỉ mới bắt đầu với CDI phải trung thực)

+3

Lưu ý rằng nếu bạn sử dụng 'getClass()' thì tên/danh mục của trình ghi nhật ký có thể thay đổi bất ngờ khi có các lớp con. – Thilo

+0

Cảm ơn. Tôi thực sự đang tìm kiếm một "mô hình tạo logger" ở đây, nhưng tôi phải thừa nhận rằng tôi không chắc chắn 100% về trường hợp sử dụng của riêng mình, đó là liệu tôi có muốn các lớp con có thể có được logger riêng của họ hay không để sử dụng lại từ một lớp học được chia sẻ. : -/ – Kawu

+0

bạn có thể loại bỏ biến này nếu bạn sử dụng [jcabi-log] (http://www.jcabi.com/jcabi-log/), một trình bao bọc tĩnh xung quanh slf4j – yegor256

Trả lời

21

Chi phí cho biến nhật ký không tĩnh (ví dụ) phải là không đáng kể trừ khi nhiều, giả sử 10000 hoặc nhiều hơn, xảy ra sự kiện. Từ khóa ở đây là không đáng kể. Nếu nhiều (> 10000) đối tượng được khởi tạo, tác động có thể sẽ được đo lường nhưng vẫn còn thấp.

Cụ thể hơn, trình ghi nhật ký thể hiện tăng dấu chân bộ nhớ bằng một tham chiếu (64 bit) cho mỗi cá thể đối tượng. Về phía CPU, chi phí là một băm tìm kiếm trên mỗi trường hợp, tức là chi phí tra cứu trình ghi nhật ký thích hợp trong bảng băm (nhỏ). Một lần nữa, cả hai chi phí sẽ không đáng kể trừ khi nhiều đối tượng được tạo ra.

Câu hỏi này cũng được thảo luận trong số SLF4J FAQ.

+0

Điều gì về quá trình tiêm/tra cứu có liên quan? Bất kỳ nhược điểm ở đó? – Kawu

+0

Xem câu trả lời cập nhật của tôi. – Ceki

2

Tôi không chắc chắn về các chi phí chính xác khi sử dụng LoggerFactory nhưng tôi nghi ngờ nó sẽ ảnh hưởng đến hiệu suất ứng dụng của bạn. Vì vậy, chỉ cần sử dụng tĩnh hoặc không tĩnh như bạn thấy phù hợp.

Lợi ích của việc sử dụng @Inject là gì. LoggerFactory đã cung cấp và trừu tượng từ impl cụ thể. Trong mọi trường hợp, nó sẽ chậm hơn rất nhiều so với LoggerFactory.

Cú pháp súc tích hơn khi bạn sử dụng @Inject đúng. Nhưng hãy tưởng tượng bạn sử dụng lớp trong bài kiểm tra. Sau đó, bạn phải thiết lập tiêm để có được khai thác gỗ. Với LoggerFactory bình thường, nó cũng hoạt động tốt trong các thử nghiệm. Nếu java có một cơ chế chung cho @Inject nó sẽ hoạt động tốt nhưng vì nó là thiết lập khó khăn hơn.

+0

Nó chỉ là một thứ không có quan tâm: nếu bạn có thể (về cơ bản) sử dụng '@Inject logger log riêng tư cuối cùng;' tại sao tôi nên sử dụng 'private logger logger log = LoggerFactory.getLogger (MyClass.class);' (hầu như không thể chú ý đến overhead như Ceki đã nói)? – Kawu

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