今天我们将研究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 中有七個日誌記錄級別。
- SEVERE(最高級別)
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
還有另外兩個日誌記錄級別,OFF 會關閉所有日誌記錄,而 ALL 會記錄所有消息。我們可以使用以下代碼設置記錄器級別:
logger.setLevel(Level.FINE);
日誌將生成所有級別大於或等於記錄器級別的日誌。例如,如果記錄器級別設置為 INFO,則將為 INFO、WARNING 和 SEVERE 日誌消息生成日誌。
Java 日誌處理器
我們可以將多個處理器添加到 Java 記錄器中,每個處理器都將相應地處理日誌消息。Java 日誌記錄 API 提供了兩個默認處理器。
- ConsoleHandler:此處理器將所有日誌消息寫入控制台
- 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中有兩種可用的格式化器。
- SimpleFormatter:此格式化器生成帶有基本信息的文本消息。ConsoleHandler使用此格式化器類將日誌消息打印到控制台。
- 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日誌記錄API
Source:
https://www.digitalocean.com/community/tutorials/logger-in-java-logging-example