Trong bài viết này, chúng ta sẽ cùng tìm hiểu về ghi Log trong Java, hay còn gọi là ghi nhật ký và các thành phần khác nhau của nó cùng với các ví dụ dẫn chứng.
Ghi Log
Java cho phép chúng ta tạo và có được các thông báo và tệp nhật ký thông qua quá trình ghi nhật ký. Việc ghi nhật ký yêu cầu các Framework và API. Java có một Framwork ghi nhật ký đã được tích hợp 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ý.
Các thành phần ghi Log trong Java
1. Trình ghi log
Logger hay trình ghi Log cung cấp các phương thức để ghi lại 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ý.
Ví dụ:
1 |
Logger nhat_ky = Logger.getLogger("Ten_nhat_ky"); |
Phương thức getLogger() của lớp Logger được sử dụng để tìm hoặc tạo một Logger mới. Đối số chuỗi ký tự sẽ xác định tên của trình ghi nhật ký. Tại đây, điều này tạo ra một đối tượng Logger mới hoặc trả về một Logger hiện có có cùng tên. Nó là một quy ước để xác định một Logger sau lớp hiện tại bằng cách sử dụng class.getName().
1 |
Logger nhat_ky = Logger.getLogger(MyClass.class.getName()); |
Chú ý: Phương thức này sẽ đưa ra một ngoại lệ NullPointerException nếu tên được truyền có giá trị là null.
Mỗi Logger có một mức nhằm xác định tầm quan trọng của các thông báo. Có 7 mức cơ bản:
Mức độ (Theo chiều giảm dần) | Ý nghĩa |
SEVERE | Mức độ nghiêm trọng |
WARNING | Cảnh báo một sự kiện có thể xảy ra |
INFO | Thông tin chung về thời gian chạy |
CONFIG | Thông tin về cấu hình |
FINE | Thông tin chung về theo dõi |
FINER | Thông tin chi tiết về việc theo dõi |
FINEST | Thông tin đầy đủ chi tiết về việc theo dõi |
OFF | Dừng ghi log với tất cả các mức |
ALL | Bật ghi log với tất cả các mức |
Mỗi cấp độ ghi log có một giá trị số nguyên nhằm xác định mức độ nghiêm trọng của chúng ngoại trừ hai mức độ ghi log đặc biệt là OFF và ALL.
Theo mặc định, ba mức nhật ký đầu tiên luôn được ghi Log. Để đặt một mức khác, chúng ta có thể sử dụng đoạn mã sau.
Ví dụ:
1 |
nhat_ky.setLevel(Level.CONFIG); |
Trong ví dụ trên, ta sẽ chỉ đặt mức CONFIG và các cấp trên nó được thiết lập để ghi nhật ký. Tất cả các thông báo ghi Log còn lại sẽ bị bỏ qua.
Bây giờ để ghi lại một thông báo, chúng ta sử dụng phương thức log().
Ví dụ:
1 |
nhat_ky.log(Level.INFO, "Day la thong bao ghi Log muc INFOR"); |
Có các phương thức viết tắt để ghi nhật ký ở các mức mong muốn.
Ví dụ:
1 2 |
nhat_ky.info ("Muc INFO"); nhat_ky.warning ("Muc Warning"); |
Tất cả các yêu cầu ghi nhật ký sẽ được chuyển tiếp đến LogRecord.
Chú ý: Nếu mức của trình ghi Log được đặt là null, mức của nó sẽ được kế thừa từ mức cha của nó và cứ thế từ dưới lên trên theo sơ đồ cây.
2. Bộ lọc
Một bộ lọc (nếu có) xác định xem LogRecord có nên được chuyển tiếp hay không. Bộ lọc thực hiện việc chọn lọc các thông báo nhật ký dựa theo các tiêu chí cụ thể. LogRecord chỉ được chuyển từ trình ghi nhật ký đến trình xử lý và từ trình xử lý đến các hệ thống bên ngoài nếu nó vượt qua các tiêu chí được xác định.
Ví dụ:
1 2 |
nhat_ky.setFilter(bo_loc); Filter bo_loc = nhat_ky.getFilter(); |
3. Trình xử lý
Trình xử lý nhật ký sẽ nhận LogRecord và xuất nó sang các đích đến khác nhau.
Java SE cung cấp 5 trình xử lý đã được tích hợp sẵn:
Trình xử lý | Ý nghĩa |
StreamHandler | Ghi ra lớp OutputStream |
ConsoleHandler | Ghi ra màn hình console |
FileHandler | Ghi ra file |
SocketHandler | Ghi ra các cổng TCP từ xa |
MemoryHandler | Ghi ra bộ nhớ |
Trình xử lý có thể chuyển lại LogRecord cho bộ lọc một lần để quyết định xem LogRecord có được chuyển tiếp ra hệ thống ngoài hay không.
Để thêm trình xử lý, ta sử dụng đoạn mã sau:
1 2 |
Handler trinh_xu_ly = new ConsoleHandler(); nhat_ky.addHandler(trinh_xu_ly); |
Để loại bỏ, ta sử dụng đoạn mã:
1 2 3 |
Handler trinh_xu_ly = new ConsoleHandler(); nhat_ky.addHandler(trinh_xu_ly); nhat_ky.removeHandler(trinh_xu_ly); |
Một trình ghi nhật ký có thể có nhiều trình xử lý. Để lấy được tất cả các trình xử lý, ta sử dụng đoạn mã sau:
1 |
Handler[] trinh_xy_ly = logger.getHandlers(); |
4. Bộ định dạng
Một trình xử lý cũng có thể sử dụng bộ định dạng để định dạng đối tượng LogRecord thành một chuỗi ký tự 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ạng | Ý nghĩa |
SimpleFormatter | Định dạng LogRecord sang dạng chuỗi ký tự |
XMLFormatter | Định dạng LogRecord sang dạng XML |
Ta có thể sử dụng đoạn mã sau để định dạng trình xử lý:
1 2 |
trinh_xu_ly.setFormatter(new SimpleFormatter()); trinh_xy_ly.setFormatter(new XMLFormatter()); |
Đối tượng LogManager sẽ theo dõi thông tin toàn bộ về việc ghi nhật ký. Nó đọc và duy trì cấu hình ghi nhật ký và các thể hiện của trình ghi nhật ký. LogManager là một Singleton, có nghĩa là chỉ có một thể hiện của nó được khởi tạo.
Để khởi tạo thể hiện của LogManager, chúng ta sử dụng mã sau:
1 |
LogManager trinh_quan_ly = new LogManager(); |
Ưu điểm của ghi Log
- Giúp theo dõi luồng thực thi của chương trình.
- Giúp lấy được 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.
Trên đây là khái niệm và ví dụ cơ bản về cách ghi Log trong Java. Hy vọng mọi người có thể áp dụng vào trong chương trình của mình. Mọi người hãy tiếp tục theo dõi các bài tiếp theo và cập nhật các bài mới nhất trên tek4 nhé!
P/s: Cảm ơn mọi người!