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

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

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

前言

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

1.概述

日志框架的核心問題:

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

  • 記錄哪些信息?

  • 記錄到哪里去?

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

  • 如何進(jìn)行方便的配置

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

log4j給出的答案是:

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

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

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

jul是一模一樣的,其只是把a(bǔ)ppender改成了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");
    }
}

日志為什么是紅色的?因?yàn)榈讓诱{(diào)用了system.erro,所以會(huì)輸出的字體是紅色的。

3.配置

可以用代碼的方式對JUL進(jìn)行配置:

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表示一個(gè)唯一的數(shù)值,%g表示循環(huán)計(jì)數(shù)器。這里是 %h/java%u.log。

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

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

    • 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的配置之后還推出了專門指定某個(gè)包路徑下日志級別的配置。是因?yàn)閘ogger之間是有父子關(guān)系的。.level會(huì)對根logger生效,其余l(xiāng)ogger是繼承自根logger的,但肯定工程上不一定是全局日志級別都是一致的,會(huì)有需求需要單獨(dú)定制某一個(gè)或者某一些的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è)計(jì)的時(shí)候會(huì)存在父子關(guān)系?

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    springboot~nexus項(xiàng)目打包要注意的地方示例代碼詳解

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

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

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

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

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

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

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

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

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

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

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

    Spring中的ConversionService源碼解析

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

    java實(shí)現(xiàn)單機(jī)版五子棋

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

最新評論

乌兰浩特市| 彩票| 和田县| 青冈县| 富阳市| 上林县| 宣汉县| 会理县| 苏尼特右旗| 穆棱市| 崇仁县| 前郭尔| 丽江市| 越西县| 天全县| 大庆市| 白玉县| 宜都市| 阜阳市| 安岳县| 方城县| 铁岭县| 肥乡县| 潞西市| 察哈| 广西| 渝北区| 正宁县| 北安市| 云霄县| 南城县| 延安市| 安陆市| 阳山县| 思南县| 铁力市| 神农架林区| 瑞金市| 郁南县| 宜川县| 白城市|