Java基礎系列(三十三):日誌進階
前言
上篇文章中,我們對於日誌的使用進行了一個初步的學習和了解,這篇文章會對Java自帶的基礎日誌框架進行進一步的深入學習和了解。
自定義配置
首先,我們可以通過直接去編輯配置檔案去修改日誌系統的各種屬性,在預設的情況下,配置檔案存在於:jre/lib/logging.properties
一般來說,我們不會去修改這個檔案,而是會去使用自己編寫的配置檔案來對不同的程式實現不同的日誌管理的效果,此時我們可以使用以下的命令去啟動應用程式:
java -Djava.util.logging.config.file=configFile MainClass
日誌管理器在VM啟動過程中被初始化,這在main
main
中呼叫System.setProperty("java.util.logging.config.file",file)
,也會呼叫LogManager.readConfiguration()來重新初始化日誌管理器。
如果想要修改預設的日誌記錄級別,就需要編輯配置檔案,並修改以下命令列:
.level=INFO
可以通過新增以下內容來指定自己的日誌記錄級別
com.viyoung.myapp.level=FINE
也就是說,在日誌記錄器名後面新增字尾.level。
日誌記錄並不會將訊息直接傳送到控制檯,而是會經過處理器(稍後我們會對處理器進行講解),處理器也有級別,如果想要在控制檯上看到FINE級別的訊息,就需要進行以下設定:
java.util.logging.ConsoleHandler.level=FINE
處理器
在預設情況下,日誌記錄器會將記錄傳送到ConsoleHandler
中,並由它輸出到System.err
流中。特別是,日誌記錄器還會將記錄傳送到父處理器中,而最終的處理器(命名為“”
)有一個ConsoleHandler
。
與日誌記錄器一樣,處理器也有日誌記錄級別。對於一個要被記錄的日誌記錄,它的日誌記錄級別必須高宇日誌記錄器和處理器的閾值。日誌管理器配置檔案設定的預設控制檯處理器的日誌記錄級別為:
java.util.logging.ConsoleHandler.level=INFO
想要記錄FINE
級別的日誌,就必須修改配置檔案中的預設日誌記錄級別和處理器級別。另外,還可以繞過配置檔案,安裝自己的處理器。
Logger logger = Logger.getLogger("com.viyoung.myapp");
logger.setLevel(Level.FINE);
logger.setUseParentHandlers(false);
Handler handler = new ConsoleHanlder();
handler.setLevel(Level.FINE);
logger.addHandler(handler);
在預設情況下,日誌記錄器會將記錄傳送到自己的處理器和父處理器。我們的日誌記錄器都是原始日誌記錄器(命名為“”)的子類,而原始日誌記錄器將會把所有等於或高於INFO
級別的記錄傳送到控制檯。然而,我們並不想兩次看到這些記錄。鑑於這個原因,應該將userParentHandlers
屬性設定為false
。
將日誌儲存到本地
將日誌儲存到本地需要用到一個名為FileHandler
的處理器,它可以向下面這樣直接將記錄傳送到預設檔案的處理器:
FileHandler handler = new FileHandler();
logger.addHandler(handler);
這些記錄被髮送到使用者主目錄的javan.log
檔案中,n
是檔名的唯一編號。如果使用者系統沒有主目錄,檔案就會儲存在類似於/User/yonghu
這樣的預設位置上。在預設的情況下,記錄被格式化為XML。
可以通過設定日誌管理器配置檔案中的不同引數,或者利用其它的構造器來修改檔案處理器的預設行為
過濾器
在預設情況下,過濾器根據日誌記錄的級別進行過濾。每個日誌記錄器和處理器都可以有一個可選的過濾器來完成附加的過濾。另外,可以通過實現Filter
介面並定義下列方法來自定義過濾器。
boolean isLoggable(LogRecord record)
在這個方法中,可以利用自己喜歡的標準,對日誌記錄進行分析,返回true
表示這些記錄應該包含在日誌中。例如。某個過濾器可能只對entering
方法和exiting
方法產生的訊息感興趣,這個過濾器可以呼叫record.getMessage()
方法,並且檢視這個訊息是否用ENTRY
或RETURN
開頭。
如果需要將一個過濾器安裝到一個日誌記錄器或者處理器中,只需要呼叫setFilter
方法就可以,但是,需要注意的一點是,同一時刻只能有一個過濾器。
格式化器
ConsoleHandler
類和FileHandler
類可以生成文字和XML格式的日誌記錄。但是,也可以自定義格式。這需要擴充套件Formatter類並覆蓋下面這個方法:
String format(LogRecord record)
可以根據自己的願望對記錄中的資訊進行格式化,並返回結果字串。在format方法中,有可能會呼叫下面這個方法
String formatMessage(LogRecord record)
這個方法對記錄中的部分資訊進行格式化,引數替換和本地化應用操作。
比如:
String getHead(Handler h)
String getTail(Handler h)
可以給日誌記錄設定頭和尾,最後使用setFormatter
方法將格式化器安裝到處理器中。
叨叨兩句
雖說講了這麼多日誌的內容,但是日常的開發中,我們使用Logging
的頻率並不高,它比起Slf4j
和Log4j
來說過於簡單,但是它可以幫我們去理解更深層次日誌的使用,後面我們會在開發實戰篇–常用日誌框架中詳細講解Slf4j
和Log4j
,敬請期待~
公眾號
掃碼或微信搜尋 Vi的技術部落格,關注公眾號,不定期送書活動各種福利~