最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JAVA日志框架之JUL、JDK原生日志框架詳解

 更新時間:2024年01月02日 15:30:57   作者:_BugMan  
Java語言的強大之處就是因為它強大而且成熟的生態(tài)體系,其中包括日志框架,下面這篇文章主要給大家介紹了關(guān)于JAVA日志框架之JUL、JDK原生日志框架的相關(guān)資料,需要的朋友可以參考下

前言

Java日志體系混亂?Java日志框架系列,清晰簡潔整理好整個Java的日志框架體系。第一篇,JDK原生日志框架——JUL。

1.概述

日志框架的核心問題:

日志是用來記錄應(yīng)用的一些運行信息的。假設(shè)沒有日志框架,我們要在應(yīng)用里手動實現(xiàn)日志相關(guān)功能,我們需要關(guān)注些什么?其實仔細(xì)想想無非兩點:

  • 記錄哪些信息?

  • 記錄到哪里去?

當(dāng)然作為日志框架來說,為了方便使用,它還要關(guān)注一點就是:

  • 如何進行方便的配置

java日志體系中是先有的log4j,后面才有了JDK自帶的jul,兩者是兩套體系,互不兼容。但其實本質(zhì)上jul就是抄的log4j,其架構(gòu)上都是一模一樣的。以上三點核心問題,我們看作為日志框架的開山鼻祖的log4j是怎樣解決的:

log4j給出的答案是:

  • 記錄哪些信息——日志級別(level)

  • 記錄到哪里去——提供不同的輸出方式(appender),文件、控制臺、其它等等

  • 如何進行方便的配置——除硬編碼外,提供配置文件

jul是一模一樣的,其只是把appender改成了handler而已。

2.日志級別

package com.eryi;

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;

import java.util.logging.Level;
import java.util.logging.Logger;

public class Test {
    @org.junit.Test
    public void test1() {
    	//級別由低到高,默認(rèn)輸出info以上級別
        Logger logger = Logger.getLogger("abc");
        logger.log(Level.FINEST,"FINEST level");
        logger.log(Level.FINER,"FINER level");
        logger.log(Level.FINE,"FINE level");
        logger.log(Level.CONFIG,"CONFIG level");
        logger.log(Level.INFO,"INFO level");
        logger.log(Level.WARNING,"WARNING level");
        logger.log(Level.SEVERE,"SEVERE level");
        logger.log(Level.FINEST,"FINEST level");
        System.out.println("hello");
    }
}

日志為什么是紅色的?因為底層調(diào)用了system.erro,所以會輸出的字體是紅色的。

3.配置

可以用代碼的方式對JUL進行配置:

public static void main(String[] args) {
        // 獲取根記錄器
        Logger rootLogger = Logger.getLogger("");

        // 移除默認(rèn)處理器
        rootLogger.setUseParentHandlers(false);

        // 創(chuàng)建控制臺處理器
        ConsoleHandler consoleHandler = new ConsoleHandler();
        
        // 設(shè)置級別
        consoleHandler.setLevel(Level.INFO);

        // 設(shè)置自定義格式器
        consoleHandler.setFormatter(new SimpleFormatter());

        // 設(shè)置自定義過濾器
        consoleHandler.setFilter(new CustomFilter());

        // 將處理器添加到根記錄器
        rootLogger.addHandler(consoleHandler);

        // 輸出日志
        Logger logger = Logger.getLogger(JULConfigExample.class.getName());
        logger.severe("Severe message");
        logger.warning("Warning message");
        logger.info("Info message");
        logger.config("Config message");
        logger.fine("Fine message");
        logger.finer("Finer message");
        logger.finest("Finest message");
    }

    // 自定義格式器
    static class SimpleFormatter extends Formatter {
        @Override
        public String format(LogRecord record) {
            return "[" + record.getLevel() + "] - " + record.getMessage() + "\n";
        }
    }

    // 自定義過濾器
    static class CustomFilter implements Filter {
        @Override
        public boolean isLoggable(LogRecord record) {
            // 在這里可以添加自定義的過濾邏輯
            return record.getLevel().intValue() >= Level.INFO.intValue();
        }
    }

當(dāng)然更合理、更方便的方式肯定是配置文件。配置文件的示例模板在jre/lib目錄下:

把它拷貝過來改一下:

#默認(rèn)配置
handlers= java.util.logging.ConsoleHandler
.level= FINEST

#file hander配置
java.util.logging.FileHandler.pattern = %h/java%u.log
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.formatter = java.util.logging.XMLFormatter

#console handler配置
java.util.logging.ConsoleHandler.level = FINEST
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# 具體包路徑下的日志級別
com.eryi.level = FINEST

解讀一下配置:

  • 默認(rèn)配置:

    • handlers: 指定默認(rèn)的處理器,這里是java.util.logging.ConsoleHandler,表示使用控制臺輸出。

    • .level: 設(shè)置默認(rèn)的日志級別,這里是FINEST,表示記錄最詳細(xì)的日志。

  • File Handler配置:

    • java.util.logging.FileHandler.pattern: 設(shè)置文件處理器的日志文件的命名模式,%h表示用戶主目錄,%u表示一個唯一的數(shù)值,%g表示循環(huán)計數(shù)器。這里是 %h/java%u.log。

    • java.util.logging.FileHandler.limit: 設(shè)置文件處理器的每個日志文件的大小限制,這里是 50000 字節(jié)。

    • java.util.logging.FileHandler.count: 設(shè)置文件處理器循環(huán)的文件數(shù),這里是 1 個。

    • java.util.logging.FileHandler.formatter: 設(shè)置文件處理器的日志格式,這里是 java.util.logging.XMLFormatter,表示使用 XML 格式。

  • Console Handler配置:

    • java.util.logging.ConsoleHandler.level: 設(shè)置控制臺處理器的日志級別,這里是 FINEST。

    • java.util.logging.ConsoleHandler.formatter: 設(shè)置控制臺處理器的日志格式,這里是 java.util.logging.SimpleFormatter,表示使用簡單格式。

  • 具體包路徑下的日志級別:

    • com.eryi.level: 設(shè)置特定包路徑下的日志級別,這里是 FINEST,表示 com.eryi 包下的日志級別為最詳細(xì)。

這里要說一下為什么有了.level的配置之后還推出了專門指定某個包路徑下日志級別的配置。是因為logger之間是有父子關(guān)系的。.level會對根logger生效,其余l(xiāng)ogger是繼承自根logger的,但肯定工程上不一定是全局日志級別都是一致的,會有需求需要單獨定制某一個或者某一些的logger的日志級別。

使用效果如下:

4.繼承關(guān)系

logger之間存在父子關(guān)系。

root logger是最頂層的父logger:

Logger a = Logger.getLogger("a");
Logger b = Logger.getLogger("b");
System.out.println(a.getParent());
System.out.println(b.getParent());

通過父名·子名定義父子關(guān)系:

Logger a = Logger.getLogger("a");
Logger b = Logger.getLogger("a.b");
System.out.println(a.getParent());
System.out.println(b.getParent()==a);

為什么在設(shè)計的時候會存在父子關(guān)系?

Java Util Logging(JUL)的Logger之間存在父子關(guān)系,這是為了實現(xiàn)日志記錄的層次結(jié)構(gòu)和更方便的配置管理。這種父子關(guān)系的設(shè)計使得日志記錄器可以繼承和繼承配置。

總結(jié)

到此這篇關(guān)于JAVA日志框架之JUL、JDK原生日志框架的文章就介紹到這了,更多相關(guān)JUL JDK原生日志框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot中HTTP請求不通的原因級解決方法

    SpringBoot中HTTP請求不通的原因級解決方法

    HTTP 請求是指從客戶端到服務(wù)器的請求消息,對于一個 Spring Boot 項目而言,服務(wù)器就是 Spring Boot,客戶端就是用戶本地的瀏覽器,但是會遇到SpringBoot HTTP請求不通的問題,本文介紹了一些常見問題及解決方法,需要的朋友可以參考下
    2025-02-02
  • java實現(xiàn)簡單超市管理系統(tǒng)

    java實現(xiàn)簡單超市管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)簡單超市管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • springboot~nexus項目打包要注意的地方示例代碼詳解

    springboot~nexus項目打包要注意的地方示例代碼詳解

    這篇文章主要介紹了springboot~nexus項目打包要注意的地方,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-07-07
  • SpringBoot整合Dubbo+Zookeeper實現(xiàn)RPC調(diào)用

    SpringBoot整合Dubbo+Zookeeper實現(xiàn)RPC調(diào)用

    這篇文章主要給大家介紹了Spring Boot整合Dubbo+Zookeeper實現(xiàn)RPC調(diào)用的步驟詳解,文中有詳細(xì)的代碼示例,對我們的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2023-07-07
  • SpringBoot MongoDB詳細(xì)使用教程

    SpringBoot MongoDB詳細(xì)使用教程

    這篇文章主要介紹了SpringBoot整合Mongodb實現(xiàn)簡單的增刪查改,MongoDB是一個以分布式數(shù)據(jù)庫為核心的數(shù)據(jù)庫,因此高可用性、橫向擴展和地理分布是內(nèi)置的,并且易于使用。況且,MongoDB是免費的,開源的,感興趣的朋友跟隨小編一起看看吧
    2022-10-10
  • SpringBoot如何實現(xiàn)讀取.config文件

    SpringBoot如何實現(xiàn)讀取.config文件

    文章介紹如何在Java中讀取XML文件:通過創(chuàng)建XML數(shù)據(jù)源、定義POJO類(含父類Menudata和子類Menudatas)、編寫解析工具、實現(xiàn)Service層及Controller調(diào)用,最終使用Layui框架展示數(shù)據(jù),強調(diào)文件后綴轉(zhuǎn)換及層級結(jié)構(gòu)處理
    2025-08-08
  • Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)的示例

    Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)的示例

    本文主要介紹了Spring?Cloud?Gateway編碼實現(xiàn)任意地址跳轉(zhuǎn)的示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Java模擬棧和隊列數(shù)據(jù)結(jié)構(gòu)的基本示例講解

    Java模擬棧和隊列數(shù)據(jù)結(jié)構(gòu)的基本示例講解

    這篇文章主要介紹了Java模擬棧和隊列數(shù)據(jù)結(jié)構(gòu)的基本示例,棧的后進先出和隊列的先進先出是數(shù)據(jù)結(jié)構(gòu)中最基礎(chǔ)的知識,本文則又對Java實現(xiàn)棧和隊列結(jié)構(gòu)的方法進行了細(xì)分,需要的朋友可以參考下
    2016-04-04
  • Spring中的ConversionService源碼解析

    Spring中的ConversionService源碼解析

    這篇文章主要介紹了Spring中的ConversionService源碼解析,ConversionService是類型轉(zhuǎn)換服務(wù)的接口,從名字就可以看出ConverterRegistry是要實現(xiàn)轉(zhuǎn)換器注冊表的接口,添加和移除Converter和GenericConverter,需要的朋友可以參考下
    2023-11-11
  • java實現(xiàn)單機版五子棋

    java實現(xiàn)單機版五子棋

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)單機版五子棋源碼,以及五子棋游戲需要的實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-03-03

最新評論

武鸣县| 新晃| 昌宁县| 重庆市| 阿克陶县| 维西| 桑植县| 辽宁省| 巴林左旗| 萍乡市| 通州区| 依兰县| 鹰潭市| 安阳市| 云龙县| 仁怀市| 阜康市| 清徐县| 昌黎县| 灵寿县| 乌拉特前旗| 黄浦区| 元氏县| 丁青县| 张家界市| 公安县| 临海市| 拜城县| 长沙市| 甘洛县| 淄博市| 大兴区| 田东县| 潞城市| 武冈市| 临汾市| 和平县| 开鲁县| 剑川县| 铜陵市| 海晏县|