JUL
JUL全稱Java util Logging是java原生的日志框架,使用時不需要另外引用第三方類庫,相對其他日志框架使用方便,學習簡單,能夠在小型應用中靈活使用。
架構介紹:
Loggers :被稱為記錄器,應用程序通過獲取Logger對象,調用其API來發布日志信息。Logger通常為應用程序訪問日志系統的入口程序。
Appenders :也被稱為Handlers,每個Logger都會關聯一組Handlers,Logger會將日志交給關聯Handlers處理,由Handlers負責將日志做記錄。Handlers在此是一個抽象,其具體的實現決定了日志記錄的位置可以是控制臺、文件、網絡上的其他日志服務或操作系統日志等。
Layouts :也被稱為Formatters,它負責對日志事件中的數據進行轉換和格式化。Layouts決定了數據在一條日志記錄中的最終形式。
Level :每條日志消息都有一個關聯的日志級別。該級別粗略指導了日志消息的重要性和緊迫,我可以將Level和Loggers,Appenders做關聯以便于我們過濾消息。
Filters :過濾器,根據需要定制哪些信息會被記錄,哪些信息會被放過。
總結:
用戶使用Logger來進行日志記錄,Logger持有若干個Handler,日志的輸出操作是由Handler完成的。
在Handler輸出日志前,會經過Filter的過濾,判斷哪些日志級別過濾放行哪些攔截,
Handler會將日志內容輸出到指定位置(日志文件、控制臺等)。Handler在輸出日志時會使用Layout,將輸出內容進行排版。
入門案例:
1.創建工程,引入依賴
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2.測試
public class JULTest {
@Test
public void test01() {
// 1.獲取日志記錄器對象
Logger logger = Logger.getLogger("pers.fgy.JULTest");
// 2.日志記錄輸出
logger.info("hello jul");
// 通用方法進行日志記錄
logger.log(Level.INFO, "info msg");
// 通過占位符方式輸出變量值
String name = "fgy";
Integer age = 18;
logger.log(Level.INFO, "用戶信息:{0},{1}", new Object[]{name, age});
}
}
日志的級別:
jul中定義的日志級別
java.util.logging.Level中定義了日志的級別:
SEVERE(最高值)
WARNING 警告信息
INFO (默認級別)
CONFIG 配置信息
FINE debug級別信息,信息顆粒度最小
FINER debug級別信息
FINEST(最低值)debug級別信息,信息顆粒度最大
還有兩個特殊的級別:
OFF,可用來關閉日志記錄。
ALL,啟用所有消息的日志記錄。
@Test
public void testLogLevel() {
// 1.獲取日志對象
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");
}
雖然測試了 7 個日志級別,但是默認是info級別,所以只會輸出info以上級別的信息。
自定義日志級別配置:
@Test
public void testLogConfig() throws IOException {
// 1.創建日志記錄器對象
Logger logger = Logger.getLogger("pers.fgy.JULTest");
// 一、自定義日志級別
// a.關閉系統默認配置
logger.setUseParentHandlers(false);
// b.創建handler對象
ConsoleHandler consoleHandler = new ConsoleHandler();
// c.創建formatter對象(簡單格式轉換對象)
SimpleFormatter simpleFormatter = new SimpleFormatter();
// d.進行關聯
consoleHandler.setFormatter(simpleFormatter);
logger.addHandler(consoleHandler);
// e.設置日志級別
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之間的父子關系:
JUL中Logger之間存在父子關系,這種父子關系通過樹狀結構存儲,JUL在初始化時會創建一個頂層RootLogger作為所有Logger父Logger,存儲上作為樹狀結構的根節點。并且父子關系通過路徑來關聯。
@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
}
日志的配置文件:默認配置文件路徑$JAVAHOMEjreliblogging.properties
自定義 logging.properties 文件
## RootLogger使用的處理器(獲取時設置) handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler # RootLogger日志等級 .level=ALL ## 自定義Logger pers.fgy.handlers=java.util.logging.ConsoleHandler # 自定義Logger日志等級 pers.fgy.level=CONFIG # 忽略父日志設置 pers.fgy.useParentHandlers=false ## 控制臺處理器 # 輸出日志級別 java.util.logging.ConsoleHandler.level=ALL # 輸出日志格式 java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter # 指定handler對象的字符集 java.util.logging.ConsoleHandler.encoding=UTF-8 ## 文件處理器 # 輸出日志級別 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字節) java.util.logging.FileHandler.limit=50000 # 輸出日志文件限制個數 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");
// 獲取日志管理器對象
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");
// 嚴重警告信息配置詳細較詳細非常詳細
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");
// 嚴重警告信息配置
}
日志原理解析:
1. 初始化LogManager
1. LogManager加載logging.properties配置
2. 添加Logger到LogManager
2. 從單例LogManager獲取Logger
3. 設置級別Level,并指定日志記錄LogRecord
4. Filter提供了日志級別之外更細粒度的控制
5. Handler是用來處理日志輸出位置
6. Formatter是用來格式化LogRecord的
總結
- 上一篇: LOLs11赵信打野出装 最强出装
- 下一篇: 大端模式小端模式、主机序网络序、入栈地址