日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

JUL

發(fā)布時(shí)間:2023/12/19 综合教程 41 生活家
生活随笔 收集整理的這篇文章主要介紹了 JUL 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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é)

以上是生活随笔為你收集整理的JUL的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。