在編寫程序的過程中桃漾,發(fā)現(xiàn)程序運行結(jié)果與預(yù)期不符立莉,怎么辦瑞你?當(dāng)然是用System.out.println()
打印出執(zhí)行過程中的某些變量糠惫,觀察每一步的結(jié)果與代碼邏輯是否符合蚪缀,然后有針對性地修改代碼鲜滩。
- 代碼改好了怎么辦搭独?當(dāng)然是刪除沒有用的
System.out.println()
語句了炸客。 - 如果改代碼又改出問題怎么辦?再加上
System.out.println()
戈钢。 - 反復(fù)這么搞幾次,很快大家就發(fā)現(xiàn)使用
System.out.println()
非常麻煩殉了。
怎么辦?解決方法是使用日志。那什么是日志众弓?日志就是Logging
,它的目的是為了取代System.out.println()
谓娃。
輸出日志脚乡,而不是用System.out.println()
滨达,有以下幾個好處:
- 可以設(shè)置輸出樣式,避免自己每次都寫
"ERROR: " + var
捡遍; - 可以設(shè)置輸出級別锌订,禁止某些級別輸出。例如画株,只輸出錯誤日志辆飘;
- 可以被重定向到文件,這樣可以在程序運行結(jié)束后查看日志谓传;
- 可以按包名控制日志級別蜈项,只輸出某些包打的日志;
- 可以……
那如何使用日志续挟?因為Java標(biāo)準(zhǔn)庫內(nèi)置了日志包java.util.logging
紧卒,我們可以直接用。先看一個簡單的例子:
// logging
import java.util.logging.Level;
import java.util.logging.Logger;
public class Hello {
public static void main(String[] args) {
Logger logger = Logger.getGlobal();
logger.info("start process...");
logger.warning("memory is running out...");
logger.fine("ignored.");
logger.severe("process will be terminated...");
}
}
//Mar 02, 2019 6:32:13 PM Hello main
//INFO: start process...
//Mar 02, 2019 6:32:13 PM Hello main
//WARNING: memory is running out...
//Mar 02, 2019 6:32:13 PM Hello main
//SEVERE: process will be terminated...
對比可見庸推,使用日志最大的好處是常侦,它自動打印了時間、調(diào)用類贬媒、調(diào)用方法等很多有用的信息聋亡。
再仔細觀察發(fā)現(xiàn),4條日志际乘,只打印了3條坡倔,logger.fine()
沒有打印。這是因為脖含,日志的輸出可以設(shè)定級別罪塔。JDK的Logging
定義了7個日志級別,從嚴(yán)重到普通:
- SEVERE
- WARNING
- INFO
- CONFIG
- FINE
- FINER
- FINEST
因為默認(rèn)級別是INFO养葵,因此征堪,INFO級別以下的日志,不會被打印出來关拒。使用日志級別的好處在于佃蚜,調(diào)整級別庸娱,就可以屏蔽掉很多調(diào)試相關(guān)的日志輸出。
使用Java標(biāo)準(zhǔn)庫內(nèi)置的Logging
有以下局限:
-
Logging
系統(tǒng)在JVM啟動時讀取配置文件并完成初始化谐算,一旦開始運行main()
方法熟尉,就無法修改配置; - 配置不太方便洲脂,需要在JVM啟動時傳遞參數(shù)
-Djava.util.logging.config.file=<config-file-name>
斤儿。
因此,Java標(biāo)準(zhǔn)庫內(nèi)置的Logging
使用并不是非常廣泛恐锦。更方便的日志系統(tǒng)我們稍后介紹往果。
小結(jié)
- 日志是為了替代
System.out.println()
,可以定義格式踩蔚,重定向到文件等棚放; - 日志可以存檔枚粘,便于追蹤問題馅闽;
- 日志記錄可以按級別分類,便于打開或關(guān)閉某些級別馍迄;
- 可以根據(jù)配置文件調(diào)整日志福也,無需修改代碼;
- Java標(biāo)準(zhǔn)庫提供了
java.util.logging
來實現(xiàn)日志功能攀圈。