JUL
JUL全稱Java util Logging是java原生的日志框架,使用時(shí)不需要另外引用第三方類庫,相對(duì)其他日志框架使用方便,學(xué)習(xí)簡單,能夠在小型應(yīng)用中靈活使用。
架構(gòu)介紹:
Loggers :被稱為記錄器,應(yīng)用程序通過獲取Logger對(duì)象,調(diào)用其API來發(fā)布日志信息。Logger通常為應(yīng)用程序訪問日志系統(tǒng)的入口程序。
Appenders :也被稱為Handlers,每個(gè)Logger都會(huì)關(guān)聯(lián)一組Handlers,Logger會(huì)將日志交給關(guān)聯(lián)Handlers處理,由Handlers負(fù)責(zé)將日志做記錄。Handlers在此是一個(gè)抽象,其具體的實(shí)現(xiàn)決定了日志記錄的位置可以是控制臺(tái)、文件、網(wǎng)絡(luò)上的其他日志服務(wù)或操作系統(tǒng)日志等。
Layouts :也被稱為Formatters,它負(fù)責(zé)對(duì)日志事件中的數(shù)據(jù)進(jìn)行轉(zhuǎn)換和格式化。Layouts決定了數(shù)據(jù)在一條日志記錄中的最終形式。
Level :每條日志消息都有一個(gè)關(guān)聯(lián)的日志級(jí)別。該級(jí)別粗略指導(dǎo)了日志消息的重要性和緊迫,我可以將Level和Loggers,Appenders做關(guān)聯(lián)以便于我們過濾消息。
Filters :過濾器,根據(jù)需要定制哪些信息會(huì)被記錄,哪些信息會(huì)被放過。
總結(jié):
用戶使用Logger來進(jìn)行日志記錄,Logger持有若干個(gè)Handler,日志的輸出操作是由Handler完成的。
在Handler輸出日志前,會(huì)經(jīng)過Filter的過濾,判斷哪些日志級(jí)別過濾放行哪些攔截,
Handler會(huì)將日志內(nèi)容輸出到指定位置(日志文件、控制臺(tái)等)。Handler在輸出日志時(shí)會(huì)使用Layout,將輸出內(nèi)容進(jìn)行排版。
入門案例:
1.創(chuàng)建工程,引入依賴
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.測(cè)試
public class JULTest {
@Test
public void test01() {
// 1.獲取日志記錄器對(duì)象
Logger logger = Logger.getLogger("pers.fgy.JULTest");
// 2.日志記錄輸出
logger.info("hello jul");
// 通用方法進(jìn)行日志記錄
logger.log(Level.INFO, "info msg");
// 通過占位符方式輸出變量值
String name = "fgy";
Integer age = 18;
logger.log(Level.INFO, "用戶信息:{0},{1}", new Object[]{name, age});
}
}
日志的級(jí)別:
jul中定義的日志級(jí)別
java.util.logging.Level中定義了日志的級(jí)別:
SEVERE(最高值)
WARNING 警告信息
INFO (默認(rèn)級(jí)別)
CONFIG 配置信息
FINE debug級(jí)別信息,信息顆粒度最小
FINER debug級(jí)別信息
FINEST(最低值)debug級(jí)別信息,信息顆粒度最大
還有兩個(gè)特殊的級(jí)別:
OFF,可用來關(guān)閉日志記錄。
ALL,啟用所有消息的日志記錄。
@Test
public void testLogLevel() {
// 1.獲取日志對(duì)象
Logger logger = Logger.getLogger("pers.fgy.JULTest");
// 2.日志記錄輸出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
雖然測(cè)試了 7 個(gè)日志級(jí)別,但是默認(rèn)是info級(jí)別,所以只會(huì)輸出info以上級(jí)別的信息。
自定義日志級(jí)別配置:
@Test
public void testLogConfig() throws IOException {
// 1.創(chuàng)建日志記錄器對(duì)象
Logger logger = Logger.getLogger("pers.fgy.JULTest");
// 一、自定義日志級(jí)別
// a.關(guān)閉系統(tǒng)默認(rèn)配置
logger.setUseParentHandlers(false);
// b.創(chuàng)建handler對(duì)象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.創(chuàng)建formatter對(duì)象(簡單格式轉(zhuǎn)換對(duì)象)
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.進(jìn)行關(guān)聯(lián)
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
// e.設(shè)置日志級(jí)別
logger.setLevel(Level.ALL);
consoleHandler.setLevel(Level.ALL);
// 二、輸出到日志文件
FileHandler fileHandler = new FileHandler("d:/logs/jul.log");
fileHandler.setFormatter(simpleFormatter);
logger.addHandler(fileHandler);
// 2.日志記錄輸出
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
}
Logger之間的父子關(guān)系:
JUL中Logger之間存在父子關(guān)系,這種父子關(guān)系通過樹狀結(jié)構(gòu)存儲(chǔ),JUL在初始化時(shí)會(huì)創(chuàng)建一個(gè)頂層RootLogger作為所有Logger父Logger,存儲(chǔ)上作為樹狀結(jié)構(gòu)的根節(jié)點(diǎn)。并且父子關(guān)系通過路徑來關(guān)聯(lián)。
@Test
public void testLogParent() {
Logger logger1 = Logger.getLogger("pers");
Logger logger2 = Logger.getLogger("pers.fgy");
System.out.println(logger2.getParent() == logger1); // true
System.out.println(logger1.getParent()); // java.util.logging.LogManager$RootLogger@887af79
}
日志的配置文件:默認(rèn)配置文件路徑$JAVAHOMEjreliblogging.properties
自定義 logging.properties 文件
## RootLogger使用的處理器(獲取時(shí)設(shè)置) handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler # RootLogger日志等級(jí) .level=ALL ## 自定義Logger pers.fgy.handlers=java.util.logging.ConsoleHandler # 自定義Logger日志等級(jí) pers.fgy.level=CONFIG # 忽略父日志設(shè)置 pers.fgy.useParentHandlers=false ## 控制臺(tái)處理器 # 輸出日志級(jí)別 java.util.logging.ConsoleHandler.level=ALL # 輸出日志格式 java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter # 指定handler對(duì)象的字符集 java.util.logging.ConsoleHandler.encoding=UTF-8 ## 文件處理器 # 輸出日志級(jí)別 java.util.logging.FileHandler.level=INFO # 輸出日志格式 java.util.logging.FileHandler.formatter=java.util.logging.XMLFormatter # 輸出日志文件路徑 java.util.logging.FileHandler.pattern=d:/logs/java%u.log # 輸出日志文件限制大小(50000字節(jié)) java.util.logging.FileHandler.limit=50000 # 輸出日志文件限制個(gè)數(shù) java.util.logging.FileHandler.count=10 # 輸出日志文件 是否是追加 java.util.logging.FileHandler.append=true ## 指定日志消息格式 java.util.logging.SimpleFormatter.format=%4$s
@Test
public void testProperties() throws IOException {
// 讀取自定義配置文件
InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 獲取日志管理器對(duì)象
LogManager logManager = LogManager.getLogManager();
// 通過日志管理器加載配置文件
logManager.readConfiguration(in);
Logger logger = Logger.getLogger("pers");
logger.severe("severe");
logger.warning("warning");
logger.info("info");
logger.config("config");
logger.fine("fine");
logger.finer("finer");
logger.finest("finest");
// 嚴(yán)重警告信息配置詳細(xì)較詳細(xì)非常詳細(xì)
Logger logger2 = Logger.getLogger("pers.fgy");
logger2.severe("severe");
logger2.warning("warning");
logger2.info("info");
logger2.config("config");
logger2.fine("fine");
logger2.finer("finer");
logger2.finest("finest");
// 嚴(yán)重警告信息配置
}
日志原理解析:
1. 初始化LogManager
1. LogManager加載logging.properties配置
2. 添加Logger到LogManager
2. 從單例LogManager獲取Logger
3. 設(shè)置級(jí)別Level,并指定日志記錄LogRecord
4. Filter提供了日志級(jí)別之外更細(xì)粒度的控制
5. Handler是用來處理日志輸出位置
6. Formatter是用來格式化LogRecord的
總結(jié)
- 上一篇: LOLs11赵信打野出装 最强出装
- 下一篇: lols11剑姬怎么出装 出装顺序