日誌收集與處理
日誌的出現是為了彌補使用System.out.println()
進行除錯的不足. 因為列印語句需要我們一條一條手動控制.
日誌的管理分為兩大部分:
- 日誌記錄器
- 日誌處理器
日誌記錄器負責按設定級別對日誌進行記錄和向上傳遞, 日誌處理器負責按設定級別對日誌進行列印.
日誌記錄器
使用全域性日誌記錄器
最簡單的使用情況是通過呼叫Logger.getGlobal()
獲得全域性日誌記錄器. 然後通過info()
這樣的方法來按級別輸出日誌.
可以通過Logger.global.setLevel(Level.OFF)
設定日誌級別. 現在設定的是OFF, 則所有的日誌資訊都不會輸出.
注意 日誌輸出語句只要存在, 無論是否最終進行了輸出, 其訊息體就會建立, 如果擔心訊息建立的代價, 可以使用lambda表示式代替. 詳見 Jav8 - 通過lambd表示式進行計算 一文.
按名建立日誌記錄器
如果你想對每個類建立分離的日誌記錄器, 可以使用以下語句:
Logger logger = Logger.getLogger(LoggerExample.class.getName());
注意 日誌記錄器是有層級的, 也就是說如果你有一個日誌記錄器名為com.congyh
, 如果你關閉了com
日誌記錄器的日誌輸出, 那麼com.congyh
也不會進行日誌輸出.
日誌級別
日誌共有七種級別: SEVERE
, WARNING
, INFO
, CONFIG
, FINE
, FINER
, FINEST
.
預設情況下, 會輸出INFO
及以上級別的日誌, 可以通過使用Level.ALL
來開啟所有級別的日誌, 也可以按日誌級別進行控制.
你應該使用
CONFIG
及以下級別的日誌來輸出debug資訊.
日誌處理器
日誌處理器按照輸出的形式分為三種: ConsoleHandler
, FileHandler
, SocketHandler
.
預設的日誌處理器工作在INFO
級別, 如果不對其進行修改, 即使日誌記錄器設定在例如CONFIG
級別, 那麼日誌實際上是只記錄不輸出
LoggerExample
, 正確的使用案例如下:
// 按名建立日誌記錄器
Logger logger = Logger.getLogger(LoggerExample.class.getName());
logger.setLevel(Level.CONFIG);
ConsoleHandler consoleHandler = new ConsoleHandler();
consoleHandler.setLevel(Level.CONFIG);
logger.addHandler(consoleHandler);
logger.config("使用按名建立的logger輸出CONFIG級別的資訊");
程式輸出如下:
三月 05, 2017 10:24:49 上午 com.github.congyh.log.LoggerExample main
配置: 使用按名建立的logger輸出CONFIG級別的資訊