Java 中的日志记录 – Java 日志示例

今天我们将研究Java中的Logger。Java Logger提供了在Java编程中进行日志记录的功能。

Java中的Logger

Java日志API是在1.4版本中引入的,您可以使用Java日志API来记录应用程序消息。在这个Java日志教程中,我们将学习Java Logger的基本特性。我们还将查看Java Logger示例,了解不同的日志级别、日志处理程序、格式化程序、过滤器、日志管理器和日志配置。

Java Logger

java.util.logging.Logger是用于在Java日志API中记录应用程序消息的类。我们可以使用非常简单的一行代码来创建Java Logger;

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

Java日志级别

java.util.logging.Level 定義了 Java 日誌記錄的不同級別。Java 中有七個日誌記錄級別。

  1. SEVERE(最高級別)
  2. WARNING
  3. INFO
  4. CONFIG
  5. FINE
  6. FINER
  7. FINEST

還有另外兩個日誌記錄級別,OFF 會關閉所有日誌記錄,而 ALL 會記錄所有消息。我們可以使用以下代碼設置記錄器級別:

logger.setLevel(Level.FINE);

日誌將生成所有級別大於或等於記錄器級別的日誌。例如,如果記錄器級別設置為 INFO,則將為 INFO、WARNING 和 SEVERE 日誌消息生成日誌。

Java 日誌處理器

我們可以將多個處理器添加到 Java 記錄器中,每個處理器都將相應地處理日誌消息。Java 日誌記錄 API 提供了兩個默認處理器。

  1. ConsoleHandler:此處理器將所有日誌消息寫入控制台
  2. FileHandler:此處理器將所有日誌消息以 XML 格式寫入文件。

我們也可以創建自己的自定義處理程序來執行特定任務。要創建自己的Handler類,我們需要擴展java.util.logging.Handler類或其子類,如StreamHandler、SocketHandler等。以下是一個自定義java日誌處理程序的示例:

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) {
        //添加自己的邏輯來發布
        super.publish(record);
    }


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


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

}

Java 日誌格式化器

格式化器用於格式化日誌消息。在java日誌API中有兩種可用的格式化器。

  1. SimpleFormatter:此格式化器生成帶有基本信息的文本消息。ConsoleHandler使用此格式化器類將日誌消息打印到控制台。
  2. XMLFormatter:此格式化器為日誌生成XML消息,FileHandler將XMLFormatter用作默認格式化器。

我們可以通過擴展java.util.logging.Formatter類來創建自己的自定義Formatter類,並將其附加到任何處理程序中。以下是一個簡單自定義格式化程序類的示例。

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";
    }

}

Java中的Logger – Java日誌管理器

java.util.logging.LogManager 是負責讀取日誌配置、創建和維護日誌實例的類。我們可以使用這個類來設置我們自己的應用程序特定配置。

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

這裡是 Java 日誌 API 配置文件的示例。如果我們沒有指定任何配置,則會從 JRE 主目錄 lib/logging.properties 文件中讀取。mylogging.properties

handlers= java.util.logging.ConsoleHandler

.level= FINE

# 默認的文件輸出位於用戶的主目錄中。
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

# 將打印在控制台上的消息限制為 INFO 級別及以上。
java.util.logging.ConsoleHandler.level = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

com.journaldev.files = SEVERE

以下是一個展示在 Java 中使用 Logger 的簡單程序。

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());
        // 添加自定義處理程序
        logger.addHandler(new MyHandler());
        try {
            // FileHandler 文件名,以及最大大小和日誌文件數限制
            Handler fileHandler = new FileHandler("/Users/pankaj/tmp/logger.log", 2000, 5);
            fileHandler.setFormatter(new MyFormatter());
            // 為 FileHandler 設置自定義過濾器
            fileHandler.setFilter(new MyFilter());
            logger.addHandler(fileHandler);
            
            for(int i=0; i<1000; i++){
                // 日誌消息
                logger.log(Level.INFO, "Msg"+i);
            }
            logger.log(Level.CONFIG, "Config data");
        } catch (SecurityException | IOException e) {
            e.printStackTrace();
        }
    }

}

當您運行上面的 Java 日誌示例程序時,您會注意到 CONFIG 日誌未在文件中打印,這是因為 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) {
		// 不要將 CONFIG 日誌記錄在文件中
		if(log.getLevel() == Level.CONFIG) return false;
		return true;
	}

}

同樣,輸出格式將與 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

如果我們沒有將自己的 Formatter 類添加到 FileHandler 中,則日誌消息將以此方式打印。

<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>

控制台日誌消息將按照以下格式:

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

下面的圖像顯示了最終的 Java 日誌示例項目。 這就是 Java 中的 Logger 和 Java Logger 示例的全部內容。您可以從下面的鏈接下載該項目。

下載Java Logger示例項目

參考:Java日誌記錄API

Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example