1、什麼是Log4j
Log4j 是Apache爲Java提供的日誌管理工具。他與System.out.println()的作用相似,用來跟蹤、調試、維護程序。
爲了你快速理解Log4j的作用,我們用下面的代碼說明Log4j的作用。
在沒有這個插件以前,我們爲了調試程序,總是需要在程序使用System.out.println()來輸出一些信息。例如下面的代碼:
// 獲取UserService
UserService userService = UserServiceFactory.getUserService();
if(userService == null) {
System.out.println("錯誤:userService沒有獲取到!");
return;
}
// 獲取要查詢的User對象id
String uid = request.getParameter("uid");
int id;
try {
id = Integer.parseInt(uid);
} catch(NumberFormatException e) {
System.out.println("錯誤:無法將uid轉換成int類型!");
throw e;
}
// 查詢User
User user = userService.load(id);
System.out.println("信息:已查詢到User對象");
user.setPassword("zhangSan");
System.out.println("信息:修改user的密碼");
userService.save(user);
System.out.println("信息:保存user信息");
上面例子中所有的輸出語句都是用來調試程序的,相信你的代碼中也經常會出現這樣的調試代碼吧?這些調試代碼必須在項目完成後刪除。你想一想,一行一行的刪除會不會忘記幾行沒有刪除呢?
使用Log4j來打印這些測試代碼,然後通過配置文件就能統一管理這些日誌信息了!我們可以在配置文件中關閉所有日誌,也可以在配置文件中打開所有日誌,也可以打開某個級別的日誌。甚至還可以管理日誌出現的格式(是否加上日期和時間),以及日誌輸出的目標(是否爲控制檯,是否爲文件)。
2、Log4j核心概念
Log4j中有三大組件:日誌器(Logger)、日誌輸出目標(Appender)、格式化器(Layout)
1、Logger:用來輸出日誌消息的類,它可以輸出不同級別的消息,例如錯誤消息、警告消息等;
2、Appender;通常我們希望日誌輸出到文件中,以及控制檯,也可能希望日誌輸出數據庫,該類就表示一個輸出的目標;
3、Layout:對輸出的消息進行格式化,例如在消息中添加日期,以及級別等。
3、日誌級別
在Log4j中日誌消息分爲五個級別,級別由高到低排列如下:
FATAL:重大錯誤,例如系統崩潰;
ERROR:錯誤,例如某模塊癱瘓;
WARN:警告,程序的隱患,如果不處理,將來可能就是錯誤;
INFO:信息,可以用來查看程序執行的流程;
DEBUG:調試,用來調試程序的bug。
我們可以使用日誌器輸出這五種不同的日誌,然後通過設置日誌器的級別來控制輸出的結果。來看下面的代碼:
@Test
public void test() {
log.setLevel(Level.ERROR)//設置日誌級別爲ERROR
log.debug("hello log4j debug!");
log.info("hello log4j info!");
log.warn("hello log4j warn!");
log.error("hello log4j! error");
log.fatal("hello log4j fatal!"); //輸出成功
}
上面代碼中,只有error()和fatal()兩個方法的輸出會完成,其他級別的輸出都不會完成。因爲設置日誌器的級別爲Level.ERROR後,只有高於ERROR級別的日誌才能輸出。
2、日誌器名稱
在創建日誌器時,需要給日誌器指定一個名稱:Logger log = Logger.getLogger(“hello”);
日誌器的名稱不只是一個名稱而已,日誌器的名稱說明了日誌器之間的父子關係。子日誌器會繼承父日誌器的Appender和Level。
日誌器的父子關係是通過日誌器的名稱來決定的,例如名稱爲com.chj的日誌器是com.chj.logger的日誌器的爸爸。com.chj.logger會繼承com.chj的Appender以及Level。
@Test
public void fun() {
Logger log = Logger.getLogger("com.luowg");
Appender appender = new ConsoleAppender(new SimpleLayout());
log.addAppender(appender);
log.setLevel(Level.ERROR);//創建名稱爲cn.chj的日誌器
Logger log1 = Logger.getLogger("com.chj.logger");//創建名稱爲cn.chj.lgger的日誌器,它繼承名爲cn.itcast的格式化器
log1.debug("看不見!");
}
通常我們創建日誌器都是使用當前類的名稱來創建:
Logger log = Logger.getLogger(Demo.class.getName());
這樣我們可以通過配置父日誌器來改變日誌器的Appender和Level。