Tổng hợp về java logger (và lý do tại sao java logger s*ck)
Java
164
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

118 bài viết.
1240 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
220 20
Một ngày đẹp trời, bạn quyết định viết một dịch vụ web dự định sẽ làm thay đổi cả thế giới. Dịch vụ của bạn sẽ kết nối tất cả các thiết bị di động ...
huydx viết 2 năm trước
220 20
White
192 15
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 4 năm trước
192 15
White
151 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 5 năm trước
151 15
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 5 năm trước
0 0
White
0 0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...
https://loda.me viết hơn 1 năm trước
0 0
White
2 0
1. Prepare Tools IDE: Netbean 8.2 JDK: 1.8 Maven: 3.5.0 2. Target Build project thỏa mãn các yêu cầu sau: Sử dụng spring boot + spring ...
xoandaica viết hơn 1 năm trước
2 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

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


White
{{userFollowed ? 'Following' : 'Follow'}}
118 bài viết.
1240 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á!