Tổng hợp về java logger (và lý do tại sao java logger s*ck)
Java
77
White

huydx viết ngày 21/03/2016

Đã bao giờ bạn làm java và nghĩ rằng: Tại sao có quá nhiều loại logger, và không hiểu loại nào dùng để làm gì không nhỉ. Điểm ra sơ sơ cũng đã thấy chóng mặt : commons-logging、log4j、slf4j-api、jcl-over-slf4j、logback-classic ... Mình dám cược là nhiều bạn sẽ ức chế giống hệt mình, không hiểu những thư viện trên khác nhau ở đâu, và mục đích mỗi loại để làm gì.

Thêm nữa, ngày xưa thì combination commons-logging+log4j hay được sử dụng, ngày nay thì thay vào đó combination slf4j+logback lại trở thành trend, rồi thêm nữa dự án cũng thay đổi từ jdk 1.4 lên 1.7 hay thậm chí là 1.8, bạn muốn nâng cấp bộ logger của mình, kèm theo jdk cũng sẽ cảm thấy chóng mặt khi không biết phải thay đổi jar file ra sao, replace thế nào.

Lý do logger-ecosystem của java trở nên hỗn loạn như hiện nay nằm 70% ở thằng slf4j. Trong bài viết này mình sẽ chỉnh lý lại đống ecosystem hỗn loạn này nhằm giúp các bạn đã từng rơi vào tình trạng ức chế như mình. Về cơ bản thì có 3 loại jar chính dành cho nhiệm vụ "log", mình sẽ đi lần lượt ở dưới đây

1. Interface

  • commons-logging
  • slf4j

Trên đây chính là những jar file nhằm nhiệm vụ định nghĩa interface dành cho việc log. Bạn nào chưa hiểu interface là gì thì trong java nó là đoạn code đại loại như dưới đây

public interface Hoge {
    public void hello();
}

Trong những jar file này thì cũng có cả impletation cho việc log nhưng thường là rất đơn giản như là chỉ log ra stdout, không threadsafe... Giả sử slf4j interface cho Logger bạn có thể tham khảo tại: http://www.slf4j.org/api/org/slf4j/Logger.html
Nhìn qua thì bạn sẽ thấy có rất nhiều method, chứng tỏ rằng những logger nào implement slf4j sẽ có rất nhiều chức năng phải không

2. Adapter hay là Bridge

Một vài jar file thuộc loại adapter tiêu biểu có thể được liệt kê dưới đây:

  • jcl-over-slf4j.XXX.jar(commons-logging => slf4j)
  • jul-to-slf4j.XXX.jar(java.util.logging => slf4j)
  • log4j-over-slf4j.XXX.jar(log4j => slf4j)

Nhiệm vụ của adapter/bridge như là một "proxy" nằm giữa các interface khác nhau. Khi nhìn từ ngoài thì sẽ thấy như thống nhất là cùng một method logger, nhưng bên trong sẽ có các implementation khác nhau. Giả sử bạn có một thư viện rất cũ sử dụng commons-logging, nhưng trong hệ thống hiện tại lại đang dùng slf4j là chính, vậy bạn cần một thứ ngôn ngữ "trung gian" nằm giữa hệ thống mới và thư viện cũ. Các jar file ở trên làm chính là nhiệm vụ này.

Ngoài ra adapter không chỉ làm cầu nối giữa các loại interface mà còn có thể nối giữa các config file nữa :D. Cho dù bạn không có log4j.jar nhưng có adapter nối đến log4j thì vẫn có thể sử dụng config file dạng log4j.xml.

Tuy nhiên việc có quá nhiều loại adapter cũng dẫn đến tình trạng hỗn loạn hiện nay...

3. Implementation

Đây chính là phần quan trọng nhất. Một vài thư viện tiêu biểu bao gồm:

  • java.util.logging
  • log4j
  • logback

Logback chính là phiên bản kế tiếp của log4j. Các thư viện này sử dụng interface được qui định tại các jar file trong phần 1.Interface ở trên, sau đó sẽ implemetation sao cho log được xuất ra hiệu quả nhất, nhanh nhất, thread safe..

slf4j binding

Trong phần implementation này xuất hiện thêm một khái niệm gọi là binding, thường được dùng cho các hệ thống sử dụng slf4j. Một vài binding hay được thấy bao gồm

  • slf4j-log4j12-XXXX.jar(slf4j => log4j1.2)
  • slf4j-jdk14-XXX.jar(sử dụng jdk1.4、xuất ra java.util.logging)
  • slf4j-log4j-XXX.jar(slf4j => log4j)
  • slf4j-jcl-XXX.jar(slf4j => commons.logging)

Các bạn có thể thấy có rất nhiều library thực hiện nhiệm vụ binding cho slf4j, vậy binding là cái khỉ gì??? Các jar file này nhằm một mục đích chính là "chọn lựa" implementation cho slf4j. Chính vì nhằm mục đích "chọn lựa" thế nên trong cùng một classpath mà có nhiều binding thì slf4j sẽ không biết phải chọn thằng nào để xuất log.

Tuy nhiên có trường hợp đặc biệt là combination slf4j + logback thì sẽ không cần binding. Bạn có thể hiểu "sơ sơ" về binding thông qua hình "đơn giản" dưới đây :P

alt text

 Kết luận

Mình đoán chắc sẽ có nhiều bạn đọc xong bài trên mà vẫn đang lơ mơ. Mình viết xong và cũng không hiểu mình đã viết gì nữa =)). Tuy nhiên mình hy vọng là khi bạn gặp lỗi

Multiple bindings were found on the class path

thì có thể hiểu được lý do tại sao.
Có một thread trên hacker news từ khá lâu cũng đã bàn về vấn đề này
The Logging Mess in Java

Happy Logging :D

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

huydx

116 bài viết.
942 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
148 14
Introduction (Link) là một cuộc thi ở Nhật, và cũng chỉ có riêng ở Nhật. Đây là một cuộc thi khá đặc trưng bởi sự thú vị của cách thi của nó, những...
huydx viết gần 2 năm trước
148 14
White
118 15
Happy programmer là gì nhỉ, chắc ai đọc xong title của bài post này cũng không hiểu ý mình định nói đến là gì :D. Đầu tiên với cá nhân mình thì hap...
huydx viết hơn 3 năm trước
118 15
White
95 10
(Ảnh) Mở đầu Chắc nhiều bạn đã nghe đến khái niệm oauth. Về cơ bản thì oauth là một phương thức chứng thực, mà nhờ đó một web service hay một ap...
huydx viết 3 năm trước
95 10
Bài viết liên quan
White
0 0
Trong bài viết này, một số hình ảnh hoặc nọi dung có thể bị thiếu do quá trình chế bản. Vui lòng xem nội dung ở blog gốc sau: (Link) (Link), chúng...
programmerit viết gần 3 năm trước
0 0
Male avatar
9 5
Facade Design Patern Facade Patern thuộc vào họ mô hình cấu trúc (structural patern). Facade patern phát biểu rằng : "just provide a unified an...
DuongVanTien viết gần 2 năm trước
9 5
White
4 2
Một số hàm giúp mapping data đơn giản với Groovy Ví dụ với list data như sau: def student1 = name: "Huan", age: 22, gender: "male"] def student...
Tất Huân viết 2 ngày trước
4 2
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
116 bài viết.
942 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!