2010-01-14 42 views
47

Có vẻ như log4j có một số class loading issues (trong số những người khác) và có vẻ như với tôi xu hướng là di chuyển ra khỏi log4j về phía slf4j. (Hibernate ngừng sử dụng ưu tiên đầu tiên sau)Log4j có bị bỏ rơi có lợi cho Slf4j không?

  1. Có đúng không?
  2. Các vấn đề chính trong log4j mà slf4j giải quyết là gì?
  3. Slf4j là từ cuối cùng hay thậm chí còn có tiêu chuẩn công nghiệp "tiếp theo log4j" tiếp theo tốt hơn không?

Cập nhật:

  • Vì vậy answer này bằng cách delfuego confuses me, bạn có thể chấp nhận/phản đối nó ?:

Bạn dường như đã stumbled khi các vấn đề lớn với log4j (và thư viện Ghi nhật ký Apache), có nghĩa là chúng có một sốridiculouslykhó khăn khi khám phá và tương tác với trình nạp lớp phù hợp vì chúng đang sử dụng . Có một lời giải thích rất dày đặc của , hoàn chỉnh với các ví dụ, tại đây; tin nhắn mang về nhà là một trong những động lực chính cho khung đăng nhập mới SLF4J là để loại bỏ hoàn toàn các vấn đề này. Bạn có thể muốn trao đổi nó và xem liệu cuộc sống của bạn có dễ dàng hơn không.

+4

Bài viết bạn tham khảo tại http://articles.qos.ch/classloader.html không phải về vấn đề tải lớp với log4j mà đúng hơn là với Jakarta Commons Logging (một mặt tiền ghi nhật ký khác). Đây là những gì SLF4J thay thế và gộp mã của hệ thống ghi nhật ký thực tế (bao gồm cả log4j) để loại bỏ các vấn đề tải lớp đó. –

+0

có thể trùng lặp của [Các dự án mới có nên sử dụng logback thay vì log4j không?] (Http://stackoverflow.com/questions/178836/should-new-projects-use-logback-instead-of-log4j) – ripper234

Trả lời

46

Slf4j thực sự chỉ là mặt tiền ghi nhật ký. Tuy nhiên, Log4j được dự định sẽ thành công bởi Logback, từ cùng một tác giả.

Cập nhật: nếu bạn muốn biết về một lợi ích khác của SLF4J, đó là một thực tế rằng sau (xấu xí) cấu trúc không cần thiết nữa để tránh những toString() cách không cần thiết được gọi là:

if (logger.isDebugEnabled()) { 
    logger.debug("Message: " + bigObject + ", " + anotherBigObject); 
} 

bạn thay vì có thể tận dụng các thông điệp tham số:

logger.debug("Message: {}, {}", bigObject, anotherBigObject); 

xem thêm What is the fastest way of (not) logging?

+0

+1: Tôi đã có một câu hỏi rất giống nhau chỉ một vài ngày trở lại và bắt đầu sử dụng Logback trong đó sử dụng slf4j trong nền. – lostiniceland

+0

?! varargs không ngừng thực hiện các chức năng ... phải không? –

+4

Không, nhưng nó dừng việc thực hiện toString xảy ra khi bạn nối một đối tượng vào chuỗi. Vấn đề chính với việc khai thác gỗ đắt đỏ không phải là lời gọi hàm log, đó là việc xây dựng chuỗi đã đăng nhập! –

6

Nhìn vào slf4j page nó không giống như nó sẽ thay log4j - nó sẽ chỉ cho phép bạn sử dụng khung đăng nhập cơ bản giống nhau (ví dụ: log4j) cho toàn bộ ứng dụng của bạn, cho phép các thư viện tự động nối vào đó.

Dường như thay thế cho Apache Commons Logging hơn log4j.

3

SLF4J có, theo ý kiến ​​của tôi, lợi thế rất lớn mà bạn có thể thống nhất việc ghi nhật ký của tất cả các thư viện mà bạn sử dụng thông qua các cây cầu mà nó cung cấp. Cả khung công tác ghi nhật ký khác đều không cho phép điều này. Điều này cho phép các dự án di chuyển trơn tru đến SLF4J và bỏ qua các lựa chọn khung khai thác mà các phụ thuộc đã thực hiện.

+1

slf4j không phải là nhật ký khuôn khổ. Nó là một mặt tiền cho một trong một số khung khai thác gỗ. –

18

Slf4J không phải là một thay thế cho Log4j, mà là cung cấp một mặt tiền để ghi nhật ký, vì vậy bạn có thể cắm vào khung đăng nhập của riêng mình. Nó chủ yếu là hữu ích cho các thư viện. từ slf4j.org:

The Simple Logging Facade cho Java hoặc (SLF4J) đóng vai trò như một mặt tiền đơn giản hoặc trừu tượng cho nhiều logging khung, ví dụ java.util.logging, log4j và logback, cho phép người dùng cuối cắm vào khung khai thác mong muốn trong thời gian triển khai.

Để trả lời câu hỏi của bạn: SLF4J đã được thông qua bởi các khuôn khổ bây giờ, nhưng trong các dự án của bạn, bạn có thể tiếp tục sử dụng Log4J (hoặc bất kỳ khác)

+0

Vì vậy, câu trả lời này là khó hiểu: http: // stackoverflow.com/questions/1974705/log4j-and-the-thread-context-classloader/1974775 # 1974775 nó ngụ ý rằng slfJ giải quyết các vấn đề được tạo ra bởi Log4j sau khi tất cả ... có thể là bên cạnh tính năng Facade của nó, nó cũng có một độc lập tốt triển khai ghi nhật ký gốc tốt hơn log4j? – ruchirhhi

+1

SLF4J yêu cầu thực thi ghi nhật ký thực bên dưới nó. Điều này vẫn có thể là Log4j, hoặc bạn có thể sử dụng Logback, mà thực sự thực hiện các giao diện SLF4J (SLF4J và Logback được viết bởi cùng một người). – SteveD

+0

Nó chỉ là một mặt tiền. Tuy nhiên, có một triển khai mới được gọi là Logback, được thiết kế để thực hiện lớp đầu tiên của SLF4J. Đáng chú ý là SLF4J, Log4J và Logback đều được tạo ra bởi cùng một người mà về cơ bản thấy Log4J bị trì hoãn. Ông có một tài khoản trên StackOverflow (tên người dùng là Ceki) và có xu hướng phục hồi điều này trong hầu hết các chủ đề Log4J/SLF4J. – GaryF

7

đầu tiên: một điểm quan trọng: SLF4J là khai thác gỗ frontend (API), có thể sử dụng bên dưới hầu hết các hệ thống đăng nhập chính: ví dụ log4j hoặc java.util.logging. Vì vậy, tốt hơn là so sánh sfl4j với commons-logging.

Về tình trạng Log4j, trích dẫn từ The state of java logging (một năm trước)

Một điều mà tôi đã không nhận ra là phát triển log4j là về cơ bản đã chết. Nó hiện đang ở phiên bản 1.2, và kế hoạch cho phiên bản 1.3 đã bị bỏ rơi ủng hộ phát triển log4j 2.0. Tuy nhiên, nó không xuất hiện rằng 2.0 đang trong quá trình phát triển tích cực. Cần lưu ý rằng Ceki Gülcü, người sáng lập ban đầu của dự án log4j, đã chuyển sang slf4j (xem bên dưới).

3

Slf4j không phải là mặt tiền ghi thực sự. Slf4j không hỗ trợ nhiều tính năng của người triển khai. Tóm lại, tôi đề cập đến các ví dụ về log4j bên dưới.

  • SLF4J không thể chỉ định một người dùng chọn tập tin cấu hình, nhưng lực lượng người dùng sử dụng mặc định (log4j.properties hoặc log4j.xml) tại một trong rất nhiều rễ Java (mỗi Jar có một gốc cộng với JVM gốc và các lớp học hoặc bin). Nếu hai tệp JAR có nó, thật khó để kiểm soát cái nào để sử dụng một cách an toàn.
  • Slf4j không thể hỗ trợ tất cả các cấp Log4j, chẳng hạn như 'gây tử vong'. Khi chuyển đổi mã lớn từ Log4j sang Slf4j, cần có nỗ lực thay đổi mã lớn (ví dụ: quyết định cách sắp xếp lại các cấp).
  • Hai tệp Jar chính (log4j-over-slf4j.jar hoặc slf4j-log4j12.jar) phải được chọn. Nếu classpath cả hai, sẽ không hoạt động. Nếu chọn ngẫu nhiên, mất các tính năng không mong muốn (ví dụ: log4j-over-slf4j.jar không hỗ trợ nhiều tệp nhật ký cho cùng một lớp, ví dụ: một cho nhật ký sự kiện và một cho nhật ký dữ liệu thô).
Các vấn đề liên quan