JUL
- Java日志架構
-
- 日志架構需要解決的問題:
- 現有日志架構
-
- 日志門面
- 日志實作
- JUL簡介
- JUL使用
- 日志架構原理
- JUL配置
-
- 自定義日志級别
- Logger之間的父子關系
- 日志配置檔案
Java日志架構
日志架構需要解決的問題:
- 控制日志輸出的内容和格式
- 控制日志輸出的位置
- 日志優化:異步日志,日志檔案的歸檔和壓縮
- 日志系統的維護
- 面向接口開發 – 日志的門面
現有日志架構
JUL(java util logging)、logback、log4j、log4j2
JCL(Jakarta Commons Logging)、slf4j( Simple Logging Facade for Java)
日志門面
JCL、slf4j
日志實作
JUL、logback、log4j、log4j2
JUL簡介
JUL全稱Java util Logging是java原生的日志架構,使用時不需要另外引用第三方類庫,相對其他日志架構使用友善,學習簡單,能夠在小型應用中靈活使用。
官方連結: https://docs.oracle.com/en/java/javase/15/docs/api/java.logging/java/util/logging/package-summary.html
JUL使用
-
引入包
不需要導入第三方類庫, 包路徑為
java.util.logging
import java.util.logging.*;
- 寫日志
Logger logger = Logger.getLogger("AppTest");
logger.info("test quick");
logger.severe("severlog");
支援參數
String name = "jack";
Integer age = 18;
logger.log(Level.INFO, "info msg param1: {0}, param2: {1}", new Object[]{name, age});
-
日志級别
日志級别定義在
下java.util.logging.Level
* The levels in descending order are:
* <ul>
* <li>SEVERE (highest value)
* <li>WARNING
* <li>INFO
* <li>CONFIG
* <li>FINE
* <li>FINER
* <li>FINEST (lowest value)
* </ul>
還有2個特殊的:
OFF,可用來關閉日志記錄。
ALL,啟用所有消息的日志記錄
日志架構原理
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN2XjlGcjAzNfRHLGZkRGZkRfJ3bs92YsYTMfVmepNHL9kERPRTVE9UeRRVT3V1MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxATO0ETO1MjM2ETMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
- 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,将輸出内容進行排版。
JUL配置
自定義日志級别
// 1.建立日志記錄器對象
Logger logger = Logger.getLogger("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("/logs/jul.log");
fileHandler.setFormatter(simpleFormatter);
Logger之間的父子關系
JUL中Logger之間存在父子關系,這種父子關系通過樹狀結構存儲,JUL在初始化時會建立一個頂層RootLogger作為所有Logger父Logger,存儲上作為樹狀結構的根節點。并父子關系通過路徑來關聯。
// 日志記錄器對象父子關系
Logger logger1 = Logger.getLogger("com.test.log");
Logger logger2 = Logger.getLogger("com.test"); System.out.println(logger1.getParent() == logger2);
//傳回true
// 所有日志記錄器對象的頂級父元素 class為java.util.logging.LogManager$RootLogger name為""
System.out.println("logger2 parent:" + logger2.getParent() + ",name:" + logger2.getParent().getName());
日志配置檔案
預設配置檔案路徑$JAVAHOME\jre\lib\logging.properties
設定自定義配置檔案resources下
// 讀取自定義配置檔案
InputStream in = JULTest.class.getClassLoader().getResourceAsStream("logging.properties");
// 擷取日志管理器對象
LogManager logManager = LogManager.getLogManager();
// 通過日志管理器加載配置檔案
logManager.readConfiguration(in);
Logger logger = Logger.getLogger("com.test.JULTest");
logger.severe("severe");
配置檔案注釋
## RootLogger處理器(擷取時設定)
handlers= java.util.logging.ConsoleHandler
# RootLogger日志等級
.level= INFO
## TestLog日志處理器
TestLog.handlers= java.util.logging.FileHandler
# TestLog日志等級
TestLog.level= INFO
# 忽略父日志處理
TestLog.useParentHandlers=false
## 控制台處理器
# 輸出日志級别
java.util.logging.ConsoleHandler.level = INFO
# 輸出日志格式
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
## 檔案處理器
# 輸出日志級别
java.util.logging.FileHandler.level=INFO
# 輸出日志格式
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
# 輸出日志檔案路徑
java.util.logging.FileHandler.pattern = /logs/log.log
# 輸出日志檔案限制大小(50000位元組)
java.util.logging.FileHandler.limit = 50000
# 輸出日志檔案限制個數
java.util.logging.FileHandler.count = 10
# 輸出日志檔案 是否是追加
java.util.logging.FileHandler.append=true