天天看點

Java日志(一):JULJava日志架構JUL簡介JUL使用日志架構原理JUL配置

JUL

  • Java日志架構
    • 日志架構需要解決的問題:
    • 現有日志架構
      • 日志門面
      • 日志實作
  • JUL簡介
  • JUL使用
  • 日志架構原理
  • JUL配置
    • 自定義日志級别
    • Logger之間的父子關系
    • 日志配置檔案

Java日志架構

日志架構需要解決的問題:

  1. 控制日志輸出的内容和格式
  2. 控制日志輸出的位置
  3. 日志優化:異步日志,日志檔案的歸檔和壓縮
  4. 日志系統的維護
  5. 面向接口開發 – 日志的門面

現有日志架構

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使用

  1. 引入包

    不需要導入第三方類庫, 包路徑為

    java.util.logging

import java.util.logging.*;
           
  1. 寫日志
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});
           
  1. 日志級别

    日志級别定義在

    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,啟用所有消息的日志記錄
           

日志架構原理

Java日志(一):JULJava日志架構JUL簡介JUL使用日志架構原理JUL配置
  • 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