在本教程中,我們將借助示例學(xué)習(xí)Java日志記錄及其各種組件。
Java允許我們通過日志記錄過程來創(chuàng)建和捕獲日志消息和文件。
在Java中,日志記錄需要框架和API。Java在java.util.logging程序包中具有內(nèi)置的日志記錄框架。
我們還可以將第三方框架(如Log4j,Logback等)用于日志記錄。
下圖顯示了Java Logging API(java.util.logging)的核心組件和指定流程。
Logger類提供了日志記錄的方法。我們可以從Logger類中實(shí)例化對象并調(diào)用其方法以進(jìn)行記錄。
讓我們舉個(gè)實(shí)例。
Logger logger = Logger.getLogger("newLoggerName");
Logger類的getLogger()方法用于查找或創(chuàng)建新的Logger。 字符串參數(shù)定義logger的名稱。
在這里,這將創(chuàng)建一個(gè)新Logger對象或返回一個(gè)具有相同名稱的Logger對象。
按照慣例,使用class.getName()在當(dāng)前類之后定義一個(gè)Logger。
Logger logger = Logger.getLogger(MyClass.class.getName());
注意:如果傳遞的名稱為null,該方法將拋出NullPointerException。
每個(gè)Logger都有確定日志消息重要性的級(jí)別。有7個(gè)基本日志級(jí)別:
日志級(jí)別(降序) | 使用 |
---|---|
SEVERE | 嚴(yán)重故障 |
WARNING | 警告消息,潛在問題 |
INFO | 常規(guī)運(yùn)行時(shí)信息 |
CONFIG | 配置信息 |
FINE | 普通的開發(fā)人員信息(跟蹤消息) |
FINER | 詳細(xì)的開發(fā)人員信息(跟蹤消息) |
FINEST | 高度詳細(xì)的開發(fā)人員信息(跟蹤消息) |
OFF | 關(guān)閉所有級(jí)別的日志記錄(不捕獲任何內(nèi)容) |
ALL | 打開所有級(jí)別的日志記錄(捕獲所有內(nèi)容) |
每個(gè)日志級(jí)別都有一個(gè)整數(shù)值,用來確定它們的嚴(yán)重性,除了兩個(gè)特殊的日志級(jí)別OFF和ALL之外。
默認(rèn)情況下,始終會(huì)記錄前三個(gè)日志級(jí)別。要設(shè)置其他級(jí)別,我們可以使用以下代碼:
logger.setLevel(Level.LogLevel); // 示例 logger.setLevel(Level.FINE);
在本示例中,只有Level.FINE和它之上的級(jí)別被設(shè)置為日志記錄。刪除所有其他日志消息。
現(xiàn)在要記錄一條日志消息,我們使用該log()方法。
logger.log(Level.LogLevel, "log message"); // 示例 logger.log(Level.INFO, "This is INFO log level message");
有一些用于記錄所需級(jí)別的速記方法。
logger.info( "這是INFO日志級(jí)別的消息"); logger.warning( "這是WARNING日志級(jí)別的消息");
然后,已通過設(shè)置的日志級(jí)別的所有日志請求都將轉(zhuǎn)發(fā)到LogRecord。
注意:如果一個(gè)日志記錄器的級(jí)別被設(shè)置為null,那么它的級(jí)別將從其父繼承,以此類推。
過濾器(如果存在)決定LogRecord是否轉(zhuǎn)發(fā)該日志記錄。顧名思義,它根據(jù)特定的標(biāo)準(zhǔn)過濾日志消息。
如果LogRecord通過指定的條件,則僅從記錄器傳遞到日志處理程序,并從日志處理程序傳遞到外部系統(tǒng)。
// 設(shè)置filter logger.setFilter(filter); // 獲取 filter Filter filter = logger.getFilter();
日志處理程序或附加程序?qū)⒔邮?strong>LogRecord并將其導(dǎo)出到各種目標(biāo)。
Java SE提供了5個(gè)內(nèi)置處理程序:
處理程序 | 使用 |
---|---|
StreamHandler | 寫入OutputStream |
ConsoleHandler | 寫入控制臺(tái) |
FileHandler | 寫入文件 |
SocketHandler | 寫入到遠(yuǎn)程TCP端口 |
MemoryHandler | 寫入內(nèi)存 |
處理程序可以將LogRecord傳遞到過濾器,以再次確定是否可以將其轉(zhuǎn)發(fā)到外部系統(tǒng)。
要添加新的處理程序,我們使用以下代碼:
logger.addHandler(handler); // 示例 Handler handler = new ConsoleHandler(); logger.addHandler(handler);
要?jiǎng)h除處理程序,我們使用以下代碼:
logger.removeHandler(handler); // 示例 Handler handler = new ConsoleHandler(); logger.addHandler(handler); logger.removeHandler(handler);
一個(gè)記錄器可以有多個(gè)處理程序。要獲取所有處理程序,我們使用以下代碼:
Handler[] handlers = logger.getHandlers();
處理程序還可以使用Formatter將LogRecord對象格式化為字符串,然后再將其導(dǎo)出到外部系統(tǒng)。
Java SE具有兩個(gè)內(nèi)置的Formatter:
格式化程序 | 使用 |
---|---|
SimpleFormatter | 將LogRecord格式化為字符串 |
XMLFormatter | 將LogRecord格式化為XML格式 |
我們可以使用以下代碼來格式化處理程序:
// 格式化成字符串形式 handler.setFormatter(new SimpleFormatter()); // 格式化成XML格式 handler.setFormatter(new XMLFormatter());
日志管理對象跟蹤的全球記錄的信息。它讀取并維護(hù)日志記錄配置和記錄器實(shí)例。
日志管理器是單例,這意味著僅實(shí)例化了一個(gè)實(shí)例。
要獲取日志管理器實(shí)例,我們使用以下代碼:
LogManager manager = new LogManager();
這是使用Java 日志的一些優(yōu)點(diǎn)。
幫助監(jiān)控程序的流程
幫助捕獲可能發(fā)生的任何錯(cuò)誤
為問題診斷和調(diào)試提供支持