Có đáng để sử dụng slf4j với log4j2 không


114

Tôi không thể quyết định có sử dụng slf4j hay không với log4j2. Dựa trên các bài đăng trực tuyến, không có vẻ như nó sẽ có bất kỳ hiệu suất nào nhưng nó có thực sự cần thiết hay không.

Ngoài ra, các quy tắc điểm này có lợi cho log4j2:

  • SLF4J buộc ứng dụng của bạn phải ghi các Chuỗi. API Log4j 2 hỗ trợ ghi nhật ký bất kỳ CharSequence nào nếu bạn muốn ghi nhật ký văn bản, nhưng cũng hỗ trợ ghi nhật ký bất kỳ Đối tượng nào.
  • API Log4j 2 cung cấp hỗ trợ ghi nhật ký các đối tượng Message, biểu thức lambda Java 8 và ghi nhật ký không có rác (nó tránh tạo mảng vararg và tránh tạo chuỗi khi ghi nhật ký các đối tượng CharSequence).

2
Có lẽ. Điều gì sẽ xảy ra nếu máy chủ ứng dụng của tôi bao gồm slf4jvà đăng nhập lại (hoặc log4jv1)? Sau đó, tôi có nên buộc phải cài đặt trình ghi nhật ký thứ ba để sử dụng ứng dụng của bạn không? Hoặc có thể bảo mật công ty quyết định bạn chỉ có thể sử dụng java.util.loggingtrong sản xuất, sau đó thì sao?
Elliott Frisch

Cảm ơn vì đã viết. Tuy nhiên, nếu mọi đối tượng đang sử dụng log4j org thì đối số trên sẽ không hợp lệ.
Andy897

4
Sử dụng SLF4J có nghĩa là việc thay thế việc triển khai rất dễ dàng nếu chính sách của công ty thay đổi, ví dụ: khi công ty của bạn được mua lại và các chính sách mới bắt buộc đối với bạn. Sử dụng SLF4J ngay bây giờ, khi bạn viết mã, sẽ không mất nhiều thời gian hơn so với sử dụng Log4j trực tiếp. Việc thay thế các cuộc gọi Log4j trực tiếp sau này sẽ mất rất nhiều thời gian. SLF4J là khoản đầu tư / bảo hiểm miễn phí cho tương lai. Điều đó có quan trọng hơn các tính năng API Log4j 2 không? Chỉ bạn (hoặc chính sách của công ty) mới có thể quyết định điều đó.
Andreas

Có cách nào để sử dụng slf4j với log4j2 nếu bạn muốn không? Trang này hiển thị cách sử dụng với log4j - phiên bản 1.2 - đã hết hạn sử dụng), nhưng không có tùy chọn nào cho log4j2. Nếu có một cách, tại sao slf4j không đề cập đến nó?
J Woodchuck

Câu trả lời:


162

Hãy tiếp tục: lập trình tới API log4j2 thay vì slf4j

An toàn: API Log4j2 cung cấp các đảm bảo chính xác như slf4j - và hơn thế nữa.

Bây giờ bản thân Log4j2 được tách thành API và mô-đun triển khai, không còn bất kỳ giá trị nào trong việc sử dụng SLF4J.

Có, đó là thực hành tốt để giữ cho các tùy chọn của bạn luôn mở. Bạn có thể muốn thay đổi cách triển khai ghi nhật ký khác sau này.

Trong 10 năm qua, việc xây dựng tính linh hoạt như vậy trong ứng dụng của bạn có nghĩa là sử dụng API trình bao bọc như SLF4J. Tuy nhiên, tính linh hoạt này không miễn phí: nhược điểm của phương pháp này là ứng dụng của bạn không thể sử dụng bộ tính năng phong phú hơn của thư viện ghi nhật ký cơ bản.

Log4j2 cung cấp một giải pháp không yêu cầu ứng dụng của bạn bị hạn chế ở mẫu số chung thấp nhất.

Van thoát: log4j-to-slf4j

Log4j2 bao gồm một log4j-to-slf4jmô-đun cầu nối. Bất kỳ ứng dụng nào được mã hóa dựa trên API Log4j2 đều có thể chọn chuyển triển khai hỗ trợ sang bất kỳ triển khai tuân thủ slf4j nào bất kỳ lúc nào.

log4j-to-slf4j

Như đã đề cập trong câu hỏi, sử dụng API Log4j2 trực tiếp cung cấp nhiều chức năng hơn và có một số lợi thế phi chức năng so với sử dụng API trình bao bọc như slf4j:

  • API thông báo
  • Lambdas vì lười ghi nhật ký
  • Ghi nhật ký bất kỳ đối tượng nào thay vì chỉ chuỗi
  • Không có rác: tránh tạo các kỳ lạ hoặc tạo Chuỗi nếu có thể
  • ClosableThreadContext tự động xóa các mục khỏi MDC khi bạn hoàn thành chúng

(Xem 10 tính năng API Log4j2 không có trong SLF4J để biết thêm chi tiết.)

Các ứng dụng có thể sử dụng một cách an toàn các tính năng phong phú này của API Log4j2 mà không bị khóa triển khai lõi Log4j2 gốc.

SLF4J vẫn là van an toàn của bạn, điều đó không có nghĩa là ứng dụng của bạn phải viết mã chống lại API SLF4J nữa.


Tiết lộ: Tôi đóng góp cho Log4j2.


Cập nhật: Có vẻ như có một số nhầm lẫn rằng lập trình cho API Log4j2 bằng cách nào đó giới thiệu "mặt tiền cho mặt tiền". Không có sự khác biệt về mặt này giữa API Log4j2 và SLF4J.

Cả hai API đều yêu cầu 2 phụ thuộc khi sử dụng triển khai gốc và 4 phụ thuộc cho triển khai không phải gốc. SLF4J và API Log4j2 giống hệt nhau về mặt này. Ví dụ:

Các phụ thuộc bắt buộc tương tự đối với SLF4J và API Log4j 2


7
Tôi hiểu. Hãy để tôi nói lại câu hỏi của tôi. Có bất kỳ triển khai độc lập nào của API log4j2 ngoài log4j2 không?
Ceki

5
API Log4j2 và impl không được "kết hợp chặt chẽ". Tất cả các triển khai SLF4J này đều có sẵn: Một ứng dụng được mã hóa dựa trên API Log4j2 có thể chọn phần log4j-to-slf4jphụ thuộc thay vì log4j-corevà chọn bất kỳ triển khai SLF4J nào mà bạn đã đề cập. Số lượng triển khai gốc của API Log4j2 là không liên quan.
Remko Popma

19
Vấn đề là bạn thường phụ thuộc vào các thư viện mà bản thân họ sử dụng slf4j, vì vậy sẽ dễ dàng hơn nếu bạn chỉ cần gắn bó với điều đó.
Davio

18
vì vậy, tôi nên sử dụng một giao diện cho một giao diện cho một triển khai? Yea, không, cảm ơn ... Slf4j đã đánh bại log4j bằng cách cung cấp một giao diện tốt để triển khai để ghi nhật ký ... log4j2 chỉ nên triển khai api slf4j - nếu có một tính năng nào đó bị thiếu, hãy đóng góp lại, nếu slf4j không có tính năng mới tính năng, thì có lẽ đó là một trường hợp cho các giao diện log4j2 api ....
RockMeetHardplace

4
@RemkoPopma - bạn vẫn đang ủng hộ việc không sử dụng giao diện log4j. Vâng, tôi hiểu rồi - tôi có thể xâu chuỗi giao diện của log4j2 -> giao diện của slf4j -> bất cứ cách triển khai nào, nhưng tôi chỉ muốn không trừu tượng hóa phần trừu tượng - cảm ơn nhưng không, cảm ơn.
RockMeetHardplace
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.