Trong hướng dẫn này, chúng ta sẽ tìm hiểu về Logging trong Java và các thành phần khác nhau của nó với sự trợ giúp của các ví dụ.

Java cho phép chúng ta tạo và nắm bắt các thông báo và file nhật ký thông qua trình ghi nhật ký(Logging).

Trong Java, việc ghi nhật ký(Logging) được sử dụng trong các framework và API. Java có một framework để ghi nhật ký được tích hợp sẵn trong gói java.util.logging.

Chúng ta cũng có thể sử dụng các framework của bên thứ ba như Log4j, Logback và nhiều framework khác cho mục đích ghi nhật ký.

1. Các thành phần ghi nhật ký trong Java

Hình bên dưới đại diện cho các thành phần cốt lõi và luồng điều khiển của API ghi nhật ký trong Java ( java.util.logging).

1.1 Logger

Các lớp Logger cung cấp phương thức để khai thác viết nhật ký. Chúng ta có thể khởi tạo các đối tượng từ lớp Logger và gọi các phương thức của nó cho mục đích ghi nhật ký.

Hãy lấy một ví dụ.

Logger logger = Logger.getLogger("newLoggerName");

phương thức  getLogger() của lớp Logger được sử dụng để tìm hoặc tạo mới Logger. Đối số chuỗi khai báo tên của trình ghi nhật ký.

Ở đây, điều này tạo ra một đối tượng Logger mới hoặc trả về một đối tượng hiện có Logger cùng tên.

Đó là một quy ước để định nghĩa một Logger sau lớp hiện tại đang sử dụng class.getName()

Logger logger = Logger.getLogger(MyClass.class.getName());

Lưu ý: Phương thức này sẽ ném ra NullPointerException nếu tên được truyền là null.

Mỗi loại Logger có một mức khai báo tầm quan trọng của thông báo nhật ký. Có 7 cấp độ nhật ký cơ bản:

Cấp độ nhật ký (theo thứ tự giảm dần)Sử dụng
SEVEREthất bại nghiêm trọng
WARNINGthông báo cảnh báo, một vấn đề tiềm ẩn
INFOthông tin thời gian chạy chung
CONFIGthông tin cấu hình
FINEthông tin chung về nhà phát triển (theo dõi thông báo)
FINERthông tin chi tiết về nhà phát triển (thông báo theo dõi)
FINESTthông tin nhà phát triển rất chi tiết (theo dõi thông báo)
OFFtắt ghi nhật ký cho tất cả các cấp (không ghi gì)
ALLbật ghi nhật ký cho tất cả các cấp (nắm bắt mọi thứ)

Mỗi cấp độ nhật ký có một giá trị số nguyên xác định mức độ nghiêm trọng của chúng ngoại trừ hai cấp độ nhật ký đặc biệt OFF và ALL.

1.2 Ghi nhật ký tin nhắn

Theo mặc định, ba cấp nhật ký hàng đầu luôn được ghi lại. Để đặt một cấp độ khác, chúng ta có thể sử dụng code sau:

logger.setLevel(Level.LogLevel);

// example
logger.setLevel(Level.FINE);

Trong ví dụ này, chỉ định FINE và level đó được thiết lập để được ghi lại những log level đó thôi. Tất cả các thông báo nhật ký khác bị loại bỏ.

Bây giờ để ghi một tin nhắn, chúng ta sử dụng phương thức log().

logger.log(Level.LogLevel, "log message");

// example
logger.log(Level.INFO, "This is INFO log level message");

Có các phương thức viết tắt để ghi nhật ký ở các cấp độ mong muốn.

logger.info( "This is INFO log level message");
logger.warning( "This is WARNING log level message");

Tất cả các yêu cầu nhật ký đã vượt qua mức nhật ký đã đặt sau trước đó, nó sẽ chuyển tiếp đến LogRecord .

Lưu ý: Nếu cấp độ của người ghi nhật ký được đặt thành null, cấp độ của nó sẽ được kế thừa từ cấp độ gốc của nó và cứ thế tiếp tục.

1.3. Bộ lọc

Một bộ lọc (nếu có) xác định liệu LogRecord có nên được chuyển tiếp hay không. Như tên cho thấy, nó lọc các thông báo nhật ký theo các tiêu chí cụ thể.

Một LogRecord chỉ truyền vào các logger để xử lý log và xử lý log vào hệ thống bên ngoài nếu nó vượt qua các tiêu chí được chỉ định trước đó.

// set a filter
logger.setFilter(filter);

// get a filter
Filter filter = logger.getFilter();

1.4. Người xử lý (Người phụ)

Trình xử lý nhật ký hoặc trình phụ sẽ nhận LogRecord và xuất nó sang các mục tiêu khác nhau.

Java SE cung cấp 5 trình xử lý tích hợp:

Người xử lýSử dụng
StreamHandlerviết cho một OutputStream
ConsoleHandlerghi vào console
FileHandlerghi vào file
SocketHandlerghi vào các cổng TCP từ xa
MemoryHandlerghi vào bộ nhớ

Một trình xử lý có thể chuyển LogRecord tới một bộ lọc để xác định lại xem nó có thể được chuyển tiếp đến các hệ thống bên ngoài hay không.

Để thêm trình xử lý mới, chúng ta sử dụng code sau:

logger.addHandler(handler);

// example
Handler handler = new ConsoleHandler();
logger.addHandler(handler);

Để xóa trình xử lý, chúng ta sử dụng code sau:

logger.removeHandler(handler);

// example
Handler handler = new ConsoleHandler();
logger.addHandler(handler);
logger.removeHandler(handler);

Một trình ghi nhật ký có thể có nhiều trình xử lý. Để có được tất cả các trình xử lý, chúng ta sử dụng mã sau:

Handler[] handlers = logger.getHandlers();

1.5. Định dạng

Một trình xử lý cũng có thể sử dụng Formatter để định dạng đối tượng LogRecord thành một chuỗi trước khi xuất nó ra các hệ thống bên ngoài.

Java SE có hai bộ định dạng tích hợp :

Bộ định dạngSử dụng
SimpleFormatterđịnh dạng LogRecord thành chuỗi
XMLFormatterđịnh dạng LogRecord sang biểu mẫu XML

Chúng ta có thể sử dụng mã sau để định dạng trình xử lý:

// formats to string form
handler.setFormatter(new SimpleFormatter());

// formats to XML form
handler.setFormatter(new XMLFormatter());

2. LogManager

đối tượng LogManager theo dõi những thông tin của logging toàn cầu. Nó đọc và duy trì cấu hình ghi nhật ký và các thể hiện của bộ ghi nhật ký.

Trình quản lý nhật ký(LogManager) là một singleton, có nghĩa là chỉ một phiên bản của nó được khởi tạo.

Để có được phiên bản trình quản lý nhật ký, chúng ta sử dụng mã sau:

LogManager manager = new LogManager();

3. Ưu điểm của ghi nhật ký

Dưới đây là một số ưu điểm của việc đăng nhập bằng Java.

  • giúp theo dõi dòng chảy của chương trình
  • giúp nắm bắt bất kỳ lỗi nào có thể xảy ra
  • cung cấp hỗ trợ chẩn đoán và gỡ lỗi vấn đề

Cài ứng dụng cafedev để dễ dàng cập nhật tin và học lập trình mọi lúc mọi nơi tại đây.

Nguồn và Tài liệu tiếng anh tham khảo:

Tài liệu từ cafedev:

Đăng ký kênh youtube để ủng hộ Cafedev nha các bạn, Thanks you!