Trang chủHướng dẫnLogger trong Java – Ví dụ về Java Logging
Chuyên gia

Logger trong Java – Ví dụ về Java Logging

CyStack blog 5 phút để đọc
CyStack blog11/08/2025
Locker Avatar

Bao Tran

Web Developer

Locker logo social
Reading Time: 5 minutes

Hôm nay chúng ta sẽ tìm hiểu về Logger trong Java. Java Logger cung cấp tính năng ghi nhật ký trong lập trình Java.

Logger trong Java

Logger trong Java

API ghi nhật ký của Java (Java Logging API) đã được giới thiệu trong phiên bản 1.4 và bạn có thể sử dụng API này để ghi lại các thông báo của ứng dụng. Trong hướng dẫn ghi nhật ký Java này, chúng ta sẽ tìm hiểu các tính năng cơ bản của Java Logger. Chúng ta cũng sẽ xem xét ví dụ về Java Logger với các cấp độ ghi nhật ký (logging levels), trình xử lý ghi nhật ký (Logging Handlers), bộ định dạng (Formatters), bộ lọc (Filters), trình quản lý nhật ký (Log Manager) và các cấu hình ghi nhật ký (logging configurations) khác nhau.

Java logging api

Java Logger

java.util.logging.Logger là lớp được sử dụng để ghi lại các thông báo ứng dụng trong API ghi nhật ký của Java. Chúng ta có thể tạo Java Logger chỉ với một dòng mã rất đơn giản như sau:

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

Các cấp độ ghi nhật ký trong Java (Java Logging Levels):

java.util.logging.Level định nghĩa các cấp độ ghi nhật ký khác nhau trong Java. Có bảy cấp độ ghi nhật ký trong Java:

  • SEVERE (cao nhất)
  • WARNING
  • INFO
  • CONFIG
  • FINE
  • FINER
  • FINEST

Có hai cấp độ ghi nhật ký khác là OFF (sẽ tắt tất cả ghi nhật ký) và ALL (sẽ ghi nhật ký tất cả các thông báo). Chúng ta có thể đặt cấp độ logger bằng đoạn mã sau:

logger.setLevel(Level.FINE);

Các bản ghi (log) sẽ được tạo cho tất cả các cấp độ bằng hoặc cao hơn cấp độ của logger. Ví dụ, nếu cấp độ logger được đặt là INFO, các bản ghi sẽ được tạo cho các thông báo ghi nhật ký INFO, WARNINGSEVERE.

Java Logging Handlers

Chúng ta có thể thêm nhiều trình xử lý (handler) vào một java logger và bất cứ khi nào chúng ta ghi lại một thông báo, mọi handler sẽ xử lý nó một cách phù hợp. Có hai handler mặc định được cung cấp bởi Java Logging API:

  1. ConsoleHandler: Handler này ghi tất cả các thông báo ghi nhật ký ra console.
  2. FileHandler: Handler này ghi tất cả các thông báo ghi nhật ký vào một tệp ở định dạng XML.

Chúng ta cũng có thể tạo các handler tùy chỉnh của riêng mình để thực hiện các tác vụ cụ thể. Để tạo lớp Handler của riêng mình, chúng ta cần mở rộng lớp java.util.logging.Handler hoặc bất kỳ lớp con nào của nó như StreamHandler, SocketHandler, v.v. Dưới đây là một ví dụ về một java logging handler tùy chỉnh:

package com.journaldev.log;

import java.util.logging.LogRecord;
import java.util.logging.StreamHandler;

public class MyHandler extends StreamHandler {

    @Override
    public void publish(LogRecord record) {
        //add own logic to publish
        super.publish(record);
    }

    @Override
    public void flush() {
        super.flush();
    }

    @Override
    public void close() throws SecurityException {
        super.close();
    }

}

Java Logging Formatters

Formatter được sử dụng để định dạng các thông báo nhật ký. Có hai bộ định dạng có sẵn trong Java Logging API:

  1. SimpleFormatter: Bộ định dạng này tạo các thông báo văn bản với thông tin cơ bản. ConsoleHandler sử dụng lớp bộ định dạng này để in các thông báo nhật ký ra console.
  2. XMLFormatter: Bộ định dạng này tạo thông báo XML cho nhật ký, FileHandler sử dụng XMLFormatter làm bộ định dạng mặc định.

Chúng ta có thể tạo lớp Formatter tùy chỉnh của riêng mình bằng cách mở rộng lớp java.util.logging.Formatter và đính kèm nó vào bất kỳ handler nào. Đây là một ví dụ về một lớp bộ định dạng tùy chỉnh đơn giản:

package com.journaldev.log;

import java.util.Date;
import java.util.logging.Formatter;
import java.util.logging.LogRecord;

public class MyFormatter extends Formatter {

    @Override
    public String format(LogRecord record) {
        return record.getThreadID()+"::"+record.getSourceClassName()+"::"
                +record.getSourceMethodName()+"::"
                +new Date(record.getMillis())+"::"
                +record.getMessage()+"\\n";
    }

}

Logger trong Java – Java Log Manager

java.util.logging.LogManager là lớp đọc cấu hình ghi nhật ký, tạo và duy trì các thể hiện logger. Chúng ta có thể sử dụng lớp này để đặt cấu hình dành riêng cho ứng dụng của mình.

LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));

Dưới đây là một ví dụ về tệp cấu hình Java Logging API. Nếu chúng ta không chỉ định bất kỳ cấu hình nào, nó sẽ được đọc từ tệp JRE Home/lib/logging.properties. Tệp cấu hình ví dụ có thể được đặt tên là mylogging.properties.

handlers= java.util.logging.ConsoleHandler

.level= FINE

# default file output is in user's home directory.
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

# Limit the message that are printed on the console to INFO and above.
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.journaldev.files = SEVERE

Đây là một chương trình Java đơn giản minh họa việc sử dụng Logger trong Java.

package com.journaldev.log;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.logging.ConsoleHandler;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.LogManager;
import java.util.logging.Logger;

public class LoggingExample {

    static Logger logger = Logger.getLogger(LoggingExample.class.getName());

    public static void main(String[] args) {
        try {
            LogManager.getLogManager().readConfiguration(new FileInputStream("mylogging.properties"));
        } catch (SecurityException | IOException e1) {
            e1.printStackTrace();
        }
        logger.setLevel(Level.FINE);
        logger.addHandler(new ConsoleHandler());
        //adding custom handler
        logger.addHandler(new MyHandler());
        try {
            //FileHandler file name with max size and number of log files limit
            Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
            fileHandler.setFormatter(new MyFormatter());
            //setting custom filter for FileHandler
            fileHandler.setFilter(new MyFilter());
            logger.addHandler(fileHandler);

            for(int i=0; i<1000; i++){
                //logging messages
                logger.log(Level.INFO, "Msg"+i);
            }
            logger.log(Level.CONFIG, "Config data");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }

}

Khi bạn chạy chương trình ví dụ java logger ở trên, bạn sẽ nhận thấy rằng nhật ký CONFIG không được in ra tệp, đó là do lớp MyFilter.

package com.journaldev.log;

import java.util.logging.Filter;
import java.util.logging.Level;
import java.util.logging.LogRecord;

public class MyFilter implements Filter {

	@Override
	public boolean isLoggable(LogRecord log) {
		//don't log CONFIG logs in file
		if(log.getLevel() == Level.CONFIG) return false;
		return true;
	}

}

Định dạng đầu ra cũng sẽ giống như định dạng được định nghĩa bởi lớp MyFormatter.

1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg977
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg978
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg979
1::com.journaldev.log.LoggingExample::main::Sat Dec 15 01:42:43 PST 2012::Msg980

Nếu chúng ta không thêm lớp Formatter tùy chỉnh của riêng mình vào FileHandler, thông báo nhật ký sẽ được in ra như sau:

<record>
  <date>2012-12-14T17:03:13</date>
  <millis>1355533393319</millis>
  <sequence>996</sequence>
  <logger>com.journaldev.log.LoggingExample</logger>
  <level>INFO</level>
  <class>com.journaldev.log.LoggingExample</class>
  <method>main</method>
  <thread>1</thread>
  <message>Msg996</message>
</record>

Các thông báo nhật ký trên console sẽ có định dạng như sau:

Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg997
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998
Dec 15, 2012 1:42:43 AM com.journaldev.log.LoggingExample main
INFO: Msg998

Dưới đây là hình ảnh cuối cùng của dự án ví dụ về Java Logger:

java logging logger example

Đó là toàn bộ nội dung về Logger trong Java và Ví dụ về Java Logger. Bạn có thể tải xuống dự án từ liên kết bên dưới.

0 Bình luận

Đăng nhập để thảo luận

Chuyên mục Hướng dẫn

Tổng hợp các bài viết hướng dẫn, nghiên cứu và phân tích chi tiết về kỹ thuật, các xu hướng công nghệ mới nhất dành cho lập trình viên.

Đăng ký nhận bản tin của chúng tôi

Hãy trở thành người nhận được các nội dung hữu ích của CyStack sớm nhất

Xem chính sách của chúng tôi Chính sách bảo mật.

Đăng ký nhận Newsletter

Nhận các nội dung hữu ích mới nhất