欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

前言

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

1.概述

日志框架的核心問題:

日志是用來記錄應(yīng)用的一些運(yùn)行信息的。假設(shè)沒有日志框架,我們要在應(yī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");
    }
}

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

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表示一個唯一的數(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的,但肯定工程上不一定是全局日志級別都是一致的,會有需求需要單獨(dú)定制某一個或者某一些的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)系,這是為了實(shí)現(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)文章

  • mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決

    mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決

    這篇文章主要介紹了mybatis?實(shí)體類字段大小寫問題?字段獲取不到值的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • 使用Idea快速搭建SpringMVC項目的詳細(xì)步驟記錄

    使用Idea快速搭建SpringMVC項目的詳細(xì)步驟記錄

    這篇文章主要給大家介紹了關(guān)于使用Idea快速搭建SpringMVC項目的詳細(xì)步驟,Spring?MVC是一種基于MVC模式的框架,它是Spring框架的一部分,它提供了一種更簡單和更有效的方式來構(gòu)建Web應(yīng)用程序,需要的朋友可以參考下
    2024-05-05
  • IDEA中SpringBoot項目的yml多環(huán)境配置方式

    IDEA中SpringBoot項目的yml多環(huán)境配置方式

    這篇文章主要介紹了IDEA中SpringBoot項目的yml多環(huán)境配置,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2023-10-10
  • Java的GUI編程之列表和組合框的設(shè)計使用

    Java的GUI編程之列表和組合框的設(shè)計使用

    這篇文章主要介紹了Java的GUI編程之列表和組合框的設(shè)計使用,是Java圖形界面編程中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例

    SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例

    規(guī)則引擎其實(shí)是一種組件,它可以嵌入到程序當(dāng)中,將程序復(fù)雜的判斷規(guī)則從業(yè)務(wù)代碼中剝離出來,使得程序只需要關(guān)心自己的業(yè)務(wù),而不需要去進(jìn)行復(fù)雜的邏輯判斷,本文給大家介紹了SpringBoot+URule實(shí)現(xiàn)可視化規(guī)則引擎的方法示例,需要的朋友可以參考下
    2024-12-12
  • SpringBoot后端進(jìn)行數(shù)據(jù)校驗JSR303的使用詳解

    SpringBoot后端進(jìn)行數(shù)據(jù)校驗JSR303的使用詳解

    這篇文章主要介紹了SpringBoot后端進(jìn)行數(shù)據(jù)校驗JSR303的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • Spring Cloud Gateway實(shí)現(xiàn)灰度發(fā)布方案

    Spring Cloud Gateway實(shí)現(xiàn)灰度發(fā)布方案

    灰度發(fā)布是在微服務(wù)中的表現(xiàn)為同一服務(wù)同時上線不同版本,讓一部分用戶使用新版本來驗證新特性,如果驗證沒有問題,則將所有用戶都遷移到新版本上,本文就來介紹一下如何實(shí)現(xiàn),感興趣的可以了解一下
    2023-12-12
  • 深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    深入學(xué)習(xí)Java單元測試(Junit+Mock+代碼覆蓋率)

    在做單元測試時,代碼覆蓋率常常被拿來作為衡量測試好壞的指標(biāo),甚至,用代碼覆蓋率來考核測試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。下面我們就來詳細(xì)學(xué)習(xí)下java單元測試吧
    2019-06-06
  • java中的內(nèi)存溢出方式

    java中的內(nèi)存溢出方式

    文章介紹了如何使用jmap和IBMHeapAnalyzer等工具分析OutOfMemoryError: Compressedclassspace錯誤,發(fā)現(xiàn)問題出在/org/pf4j/PluginClassLoader加載了大量類
    2024-12-12
  • Spring Retry 重試實(shí)例詳解

    Spring Retry 重試實(shí)例詳解

    這篇文章主要介紹了Spring Retry 重試,使用方式有兩種分別是命令式和聲明式,本文通過實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下
    2022-10-10

最新評論