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
Tại sao người ta lại sử dụng một trong các gói sau thay vì gói kia?
Câu trả lời:
Theo thứ tự thời gian của sự xuất hiện api (theo như tôi biết):
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 + ".");
}
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.
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 javadoc và tà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.
Xem thêm câu trả lời cho câu hỏi Các phương pháp hay nhất để ghi lại lỗi là gì? , đặc biệt:
Có một số vấn đề tiềm ẩn khi tải lớp với Commons Logging.
Log4J và SLF4J được phát triển bởi cùng một người, học hỏi từ các vấn đề được tìm thấy trong thực tế với Log4J.
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.
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).
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ó.
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.