Đăng nhập trong Java có gì? [đóng cửa]


117

Tại sao người ta lại sử dụng một trong các gói sau thay vì gói kia?

  • Ghi nhật ký Java
  • Ghi nhật ký Commons
  • Log4j
  • SLF4j
  • Đăng lại

4
Bạn có thể muốn stackoverflow.com/questions/873051 , so sánh SLF4j với Commons Logging.
James McMahon,

24
Tại sao Ceki lại tạo ra 3 khung ghi nhật ký !!! thật điên rồ ...
mP.

6
@mP. - log4j là lần đầu tiên, sau đó nảy sinh bất đồng và slf4j + logback được viết. slf4j là API và ghi lại quá trình triển khai API. Bất kể mọi thứ khác, slf4j đều cực kỳ hữu ích.
Thorbjørn Ravn Andersen

3
Để biết chi tiết về lý do Ceki Gülcü tạo SLF4J + Logback, hãy xem bài nói chuyện sau Devoxx: parleys.com/#st=5&id=1701
cắnk

Điều tốt nhất có được từ đây là API slf4j hy vọng sẽ thống nhất thế giới ghi nhật ký. Tôi nghĩ rằng logback vẫn chưa đạt được khối lượng quan trọng đối với các nhà phát triển.
Thorbjørn Ravn Andersen

Câu trả lời:


86

Theo thứ tự thời gian của sự xuất hiện api (theo như tôi biết):

  • Log4j vì hầu hết mọi người đều sử dụng nó (theo kinh nghiệm của tôi)
  • Commons Logging vì các dự án mã nguồn mở sử dụng nó (vì vậy chúng có thể tích hợp với bất kỳ khung ghi nhật ký nào được sử dụng trong giải pháp tích hợp); đặc biệt hợp lệ nếu bạn là API / Framework / OSS và bạn dựa vào các gói khác sử dụng Commons Logging.
  • Commons Logging bởi vì bạn không muốn "khóa" vào một khuôn khổ ghi nhật ký cụ thể (vì vậy thay vào đó, bạn khóa những gì Commons Logging cung cấp cho bạn) - Tôi không nghĩ là hợp lý khi quyết định sử dụng điểm này làm lý do.
  • Ghi nhật ký Java vì bạn không muốn thêm vào một jar bổ sung.
  • SLF4j vì nó mới hơn Commons Logging và cung cấp tính năng ghi nhật ký được tham số hóa:

logger.debug("The entry is {}.", entry);
//which expands effectively to
if (logger.isDebugEnabled()){
    // Note that it's actually *more* efficient than this - see Huxi's comment below...
    logger.debug("The entry is " + entry + "."); 
}
  • Đăng nhập lại vì nó mới hơn log4j và một lần nữa, hỗ trợ ghi nhật ký được tham số hóa, vì nó triển khai SLF4j trực tiếp
  • SLF4j / Logback vì nó được viết bởi cùng một người đã làm log4j, vì vậy anh ấy đã làm cho nó tốt hơn (theo Ken G - cảm ơn. Nó có vẻ phù hợp khi xem các bài đăng tin tức trước đó của họ )
  • SLF4j vì họ cũng xuất bản bộ điều hợp log4j nên bạn không phải "chuyển đổi" log4j trong mã cũ hơn - chỉ cần đặt log4j.properties sử dụng SLF4j và cấu hình của nó

3
Theo như tôi có thể nói ý tưởng đằng sau ghi nhật ký commons là nó nên được sử dụng trong các thư viện. Bằng cách này, thư viện luôn có thể sử dụng cùng một khuôn khổ ghi nhật ký (thông qua ghi nhật ký chung) mà ứng dụng lưu trữ sử dụng.
Joachim Sauer 10/08/08

Cảm ơn rất nhiều cho Loki vì câu hỏi. Bây giờ tôi biết rằng tôi sẽ không sử dụng log4j làm khuôn khổ mặc định của mình nữa. SLF4j FTW! Cũng cảm ơn Ken G vì đã chỉ ra rằng SLF4j được viết bởi cùng một người như log4j
Stephen

3
Nhận xét trong ví dụ mã của bạn không đúng 100%. Định dạng thực tế của thông báo được Logback thực hiện một cách lười biếng, vì vậy nó sẽ chỉ xảy ra nếu sự kiện thực sự được xử lý bởi một appender appender yêu cầu thông báo được định dạng - điều này sẽ không xảy ra trong trường hợp ví dụ như SocketAppender vì sự kiện được tuần tự hóa bằng cách sử dụng mẫu thông báo không thay đổi + các đối số dưới dạng Chuỗi. Tôi đoán nó chỉ phụ thuộc vào cách bạn định nghĩa "hiệu quả". Nó chắc chắn sẽ phát ra cùng một thông báo (ít nhất là nếu mục nhập và đối tượng giống nhau;)) vì vậy xin vui lòng tha thứ cho nitpicking của tôi.
Huxi

6
SLF4J thực chất chỉ là một API nằm trên các khuôn khổ ghi nhật ký khác. Tương tự như mục tiêu của Commons Logging, nhưng trực quan hơn từ kinh nghiệm của tôi.
James McMahon

37

Tôi thấy việc đăng nhập bằng Java khó hiểu, không nhất quán, tài liệu kém và đặc biệt là lộn xộn. Hơn nữa, có rất nhiều điểm giống nhau giữa các khuôn khổ ghi nhật ký này dẫn đến sự cố gắng trùng lặp và nhầm lẫn về môi trường ghi nhật ký mà bạn thực sự đang ở. Đặc biệt, nếu bạn đang làm việc trong một ngăn xếp ứng dụng web Java nghiêm túc, bạn thường ở trong nhiềucác môi trường ghi nhật ký cùng một lúc; (ví dụ: ngủ đông có thể sử dụng log4j và tomcat java.util.logging). Apache commons có nghĩa là cầu nối các khung ghi nhật ký khác nhau, nhưng thực sự chỉ làm tăng thêm độ phức tạp. Nếu bạn không biết trước điều này, thì thật là hoang mang. Tại sao thông báo nhật ký của tôi không in ra bảng điều khiển, v.v.? Ồ vì tôi đang xem nhật ký Tomcat chứ không phải log4j. Thêm một lớp phức tạp nữa, máy chủ ứng dụng có thể có cấu hình ghi nhật ký chung có thể không nhận ra cấu hình cục bộ cho một ứng dụng web cụ thể. Cuối cùng, tất cả các khuôn khổ ghi nhật ký này CÓ THỂ QUÁ ĐƯỢC HOÀN THÀNH. Đăng nhập trong Java là một mớ hỗn độn vô tổ chức khiến các nhà phát triển như tôi thất vọng và bối rối.

Các phiên bản đầu tiên của Java không có khung ghi nhật ký tích hợp dẫn đến trường hợp này.


19
Đây có phải là một câu trả lời? Nó trông giống như một lời khen ngợi.
Michael Myers

15
Tôi xin lỗi. Nó một chút của một lời nói. Nhưng nó cũng là một phản hồi chung cho "Có gì xảy ra với việc đăng nhập trong Java?". Câu trả lời, trong ngắn hạn, là nó bị phá vỡ sâu sắc.
Julien Chastang

1
Chà, nó không đáng 1 phiếu; P Nhưng có điều gì đó để suy ngẫm.
guyumu

21
Sự cố bắt đầu khi Sun thực sự thêm java.util.logging vào Java 1.4. Trước đó LOG4J đã được thành lập và sử dụng rộng rãi. Sau đó, cần có các trình bao bọc để hỗ trợ cả LOG4J và java.util.logging. Ngoài ra, vì jul được chứa trong gói java. * Nên không thể thay thế nó bằng cách hoán đổi JAR - đó là cách SLF4J làm cầu nối với các khung công tác khác. Đây có lẽ là ý tưởng tồi tệ nhất của Sun ... và cuối cùng nó dẫn đến giả định sai lầm rằng một "công dân Java tốt" nên sử dụng jul.
Huxi

4
@Huxi, tôi cho rằng API Lịch tệ hơn. Để bảo vệ Sun, đó không phải là mã của họ, mà đến từ Taglient.
Thorbjørn Ravn Andersen

22

Có một điểm quan trọng chưa được đề cập trước đây:

SLF4J (và cả Logback và LOG4J làm chương trình phụ trợ ghi nhật ký) có hỗ trợ cho cái gọi là Ngữ cảnh chẩn đoán được ánh xạ (MDC, xem javadoctài liệu ).

Về cơ bản, đây là một Bản đồ địa phương chuỗi <Chuỗi, Chuỗi> mà bạn có thể sử dụng để thêm thông tin ngữ cảnh bổ sung vào sự kiện ghi nhật ký của mình. Trạng thái hiện tại của MDC được gắn với mọi sự kiện.

Điều này có thể cực kỳ hữu ích nếu bạn đặt những thứ như tên người dùng và URL của yêu cầu (trong trường hợp ứng dụng web) vào đó. Ví dụ, điều này có thể được thực hiện tự động bằng cách sử dụng một bộ lọc.


2
Về mặt kỹ thuật, đó là một Bản đồ địa phương chuỗi <Chuỗi, Chuỗi>.
pdxleif


4

Trong dự án công ty của chúng tôi, chúng tôi sử dụng LOG4j và nó rất dễ sử dụng như Stephen đã trình bày trong ví dụ của mình. Chúng tôi cũng đã viết các lớp mẫu của riêng mình cho LOG4j để bạn có thể tạo các lược đồ tệp đầu ra của riêng mình. Bạn có thể mô tả tệp nhật ký của bạn trông như thế nào. Có thể nâng cao các lớp log4j ban đầu.

Tất cả các thuộc tính LOG4j bạn có thể thay đổi trong tệp log4j.properties, vì vậy bạn có thể sử dụng các tệp khác nhau cho các dự án khác nhau.

Ghi nhật ký Java không phải là sở thích của tôi, nhưng điều này có thể là do tôi sử dụng log4j ngay từ đầu.


4

Các Commons tổng quan Logging đưa ra lý do cho sự tồn tại của nó: khai thác gỗ từ mã thư viện, khi bạn không có kiểm soát đối với khung đăng nhập bên dưới. Rất quan trọng đối với các dự án Apache khác nhau, sẽ được liên kết với các ứng dụng bên ngoài. Có lẽ không quá quan trọng đối với các dự án CNTT nội bộ, nơi bạn có toàn quyền kiểm soát.

Điều đó nói rằng, tôi viết thư cho Commons Logging, cũng như nhiều nhà phát triển khác mà tôi biết. Lý do là để giảm thiểu hành lý tinh thần: bạn có thể thay đổi dự án hoặc công việc và không phải học một khuôn khổ mới (miễn là công việc / dự án mới cũng sử dụng CL, và / hoặc bạn có thể thuyết phục họ chuyển sang làm).

Ngoài ra, có một số giá trị để tạo trình bao bọc của riêng bạn xung quanh bất kỳ khung công tác nào bạn sử dụng. Như được mô tả ở đây , tôi muốn sử dụng một đối tượng LogWrapper để cung cấp chuỗi tùy chỉnh (quan trọng) và giảm thiểu sự lộn xộn trực quan của các câu lệnh ghi nhật ký (ít quan trọng hơn).


1
Ngoài ra còn có một cầu nối commons.logging => SLF4J có thể được sử dụng để định tuyến tất cả ghi nhật ký CL qua SLF4J. SLF4J hỗ trợ bắc cầu commons.logging, LOG4J và (hơi rườm rà, nhưng tốt nhất có thể) java.util.logging, vì vậy tất cả các bản ghi sẽ kết thúc trong bất kỳ phần mềm phụ trợ SLF4J nào bạn sẽ sử dụng. Xem slf4j.org/legacy.html Tôi muốn sử dụng Logback, btw, nhưng bạn có thể tranh luận rằng tôi thiên vị.
Huxi

2

Nói chung, tôi sẽ mặc định sử dụng Log4J.

Tôi sẽ sử dụng Java Logging nếu tôi không ngại sự phụ thuộc vào Java 1.4 nhưng tôi vẫn sẽ sử dụng Log4J theo sở thích.

Tôi sẽ sử dụng Commons Logging nếu tôi đang cải tiến thứ gì đó đã sử dụng nó.


Không ngại phụ thuộc vào 1.4 ?? Thậm chí 1.4 đã hết tuổi thọ.
Tom Hawtin - tackline

2
@Tom Ý anh ấy là jdk1.4 + đừng ngớ ngẩn.
mP.

Trên thực tế, gần đây tôi đã thực hiện một số công việc trong một hệ thống vẫn đang chạy dưới jdk 1.3 :-(, và cách đây chưa đầy hai năm, lần cuối cùng tôi duy trì hệ thống jdk 1.2 . Quá nhiều nơi không nâng cấp trừ khi họ hoàn toàn có họ chỉ từ chối cài đặt các bản nâng cấp.
Michael Rutherfurd

0

Tôi sẽ đề xuất tạo một mặt tiền ghi nhật ký mỏng có thể ghi vào bất kỳ khung ghi nhật ký nào, tại thời điểm đó, việc lựa chọn công cụ hỗ trợ trở thành một điểm tranh luận khá nhiều.


2
Đó là những gì ghi nhật ký commons làm vậy tại sao lại phát minh ra bánh xe? Ngoài ra, có một số vấn đề mà mặt tiền của bạn sẽ phải xử lý mà ghi nhật ký chung đã làm.
James AN Stauffer 10/08/08

+1 Để chống lại đối số ghi nhật ký chung, Một số ứng dụng doanh nghiệp sử dụng trình ghi nhật ký tùy chỉnh. Luôn luôn là một ý tưởng hay để ẩn việc triển khai cơ bản. Lớp bao bọc 'mỏng' giúp loại bỏ nhu cầu đóng gói một lọ khác và không nhiều như việc phát minh lại.
questzen 10/08/08

1
Điều này đã cứu tôi gần đây khi chúng tôi chuyển khung công tác của mình sang Khung công tác nhỏ gọn (trong .Net). Nếu chúng tôi có các phụ thuộc được mã hóa cứng vào nLog, chúng tôi sẽ bị hỏng. Bởi vì chúng tôi đã sử dụng cách tiếp cận này, chúng tôi có thể thả vào một trình ghi nhật ký rỗng và rất vui. Ai đó bỏ phiếu lại cho tôi tới 0 Xin vui lòng :-)
tsimon

3
Một cái đã tồn tại - hãy xem slf4j. Đó là một trình bao bọc mỏng được chấp nhận cho phép bạn chuyển đổi các khung ghi nhật ký khi khởi động ứng dụng bằng cách chuyển đổi các lọ trên đường dẫn thời gian chạy.
răn đe

1
làm tắc nghẽn có cách riêng của nó để khám phá khung công tác mà nó sẽ sử dụng - nó không đẹp và khá phức tạp. Ceki đã tạo bao nhiêu khung ghi nhật ký. Người ta phải luôn cố gắng tạo ra một mức độ chuyển hướng và ẩn một triển khai ngay cả khi nó bị tắc nghẽn với việc ghi nhật ký của chính bạn. Sau đó, bạn có thể plugin bất kỳ f / w nào bạn muốn như Travis đã đề cập.
mP.
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.