亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot集成slf4j2日志配置的實現(xiàn)示例

 更新時間:2024年08月31日 14:30:47   作者:碼至終章  
本文主要介紹了SpringBoot集成slf4j2日志配置的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

簡介

本章節(jié)主要介紹springboot項目集成slf4j2,看完本章內(nèi)容可以輕松完成集成。另外說一下,在對日志輸出場景比較多的情況下可以考慮將logback更換為log4j2。

1、pom引入依賴

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-log4j2</artifactId>
            <version>3.1.0</version>
        </dependency>

2、剔除依賴

在springboot 中默認的日志管理就是logback,需要剔除原來的日志包引用,凡是相關(guān)的springboot都需要exclusion日志包,下面舉例說明

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
            <version>2.7.13</version>
            <exclusions><!-- 去掉springboot默認配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.7.13</version>
            <exclusions><!-- 去掉springboot默認配置 -->
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

3、創(chuàng)建log4j2.xml配置文件

在resource目錄下創(chuàng)建log4j2.xml文件,log4j2.xml配置詳情如下:

3.1、配置文件內(nèi)容

<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,這個用于設(shè)置log4j2自身內(nèi)部的信息輸出,可以不設(shè)置,當(dāng)設(shè)置成trace時,你會看到log4j2內(nèi)部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設(shè)置間隔秒數(shù)-->
<configuration >
    <!--日志級別以及優(yōu)先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

    <!--變量配置-->
    <Properties>
        <!-- 格式化輸出:%date表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度 %msg:日志消息,%n是換行符-->
        <!-- %logger{36} 表示 Logger 名字最長36個字符 -->
        <property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
        <!-- 定義日志存儲的路徑 -->
        <property name="FILE_PATH" value="E:/logss" />
        <property name="FILE_NAME" value="share" />
      

    </Properties>

    <appenders>

        <console name="Console" target="SYSTEM_OUT">
            <!--輸出日志的格式-->
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <!--控制臺只輸出level及其以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
        </console>

        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,適合臨時測試用-->
        <File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
            <PatternLayout pattern="${LOG_PATTERN}"/>
        </File>

        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 這個會打印出所有的warn及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

        <!-- 這個會打印出所有的error及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面并進行壓縮,作為存檔-->
        <RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
            <!--控制臺只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="${LOG_PATTERN}"/>
            <Policies>
                <!--interval屬性用來指定多久滾動一次,默認是1 hour-->
                <TimeBasedTriggeringPolicy interval="1"/>
                <SizeBasedTriggeringPolicy size="10MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設(shè)置,則默認為最多同一文件夾下7個文件開始覆蓋-->
            <DefaultRolloverStrategy max="15"/>
        </RollingFile>

    </appenders>

    <!--Logger節(jié)點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。-->
    <!--然后定義loggers,只有定義了logger并引入的appender,appender才會生效-->
    <loggers>

        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <logger name="org.mybatis" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </logger>
        <!--監(jiān)控系統(tǒng)信息-->
        <!--若是additivity設(shè)為false,則 子Logger 只會在自己的appender里輸出,而不會在 父Logger 的appender里輸出。-->
        <Logger name="org.springframework" level="info" additivity="false">
            <AppenderRef ref="Console"/>
        </Logger>

        <root level="info">
            <appender-ref ref="Console"/>
            <appender-ref ref="Filelog"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>

</configuration>

3.2、配置參數(shù)詳解

日志等級說明

等級說明
trace追蹤,就是程序推進一下,可以寫個trace輸出
debug調(diào)試,一般作為最低級別,trace基本不用
info輸出重要的信息,使用較多
warn警告,有些信息不是錯誤信息,但也要給程序員一些提示。
error錯誤信息。用的也很多
fatal致命錯誤

輸出源

類別說明
CONSOLE輸出到控制臺
FILE輸出到文件

格式

類別說明
SimpleLayout以簡單的形式顯示
HTMLLayout以HTML表格顯示
PatternLayout自定義形式顯示

PatternLayout自定義日志布局:

格式說明
%d{HH:mm:ss.SSS}表示輸出到毫秒的時間
%t輸出當(dāng)前線程名稱
%-5level輸出日志級別,-5表示左對齊并且固定輸出5個字符,如果不足在右邊補0
%logger輸出logger名稱
%msg日志文本
%n換行
%F輸出所在的類文件名,如Test.java
%L輸出行號
%M輸出所在方法名
%l輸出語句所在的行數(shù), 包括類名、方法名、文件名、行數(shù)

4、application.yml文件配置

需要指定加在的配置文件,因為默認加載的文件名為log4j2-spring.xml

logging:
  config: classpath:log4j2.xml
  level:
    root: trace

5、測試

寫一段測試代碼打印日志,啟動項目進行測試即可

@Slf4j
public class Test {

    @GetMapping(value = "/testFeign", produces = MediaType.APPLICATION_JSON_VALUE)
    public Result<Boolean> testFeign() {
        log.info("測試feign調(diào)用------biz");
        return Result.success(true);
    }

}

6、附錄

6.1、集成異常一

如果啟動的時候出現(xiàn)如下錯誤,則需要

在這里插入圖片描述

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: Defaulting to no-operation (NOP) logger implementation

解決方法:引入如下依賴即可

<!--slf4j-nop 日志開關(guān),一旦引入依賴,所有日志實現(xiàn)框架將失效-->
 		<dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.36</version>
        </dependency>

6.2、 log4j2特性

(1)數(shù)據(jù)丟失少,可以用來做審計功能。自身內(nèi)部報的exception會被發(fā)現(xiàn),但是logback和log4j不會;
(2)log4j2使用了disruptor技術(shù),在多線程環(huán)境下,性能高于logback等10倍以上;
(3)(garbage free)之前的版本會產(chǎn)生非常多的臨時對象,會造成GC頻繁,log4j2則在這方面上做了優(yōu)化,減少產(chǎn)生臨時對象。盡可能少的GC,其實也是基于disruptor技術(shù);
(4)支持lambda表達式;
(5)對filter的功能支持的更強大;
(6)系統(tǒng)日志(Syslog)協(xié)議支持TCP 和 UDP
(7)支持kafka queue

6.3、 log4j2異步日志的四種隊列

列出了log4j2異步日志的四種隊列,有興趣可以深入了解

ArrayBlockingQueue -- 默認的隊列,通過 java 原生的 ArrayBlockingQueue 實現(xiàn)。
LinkedTransferQueue -- 通過 java7 以上原生支持的 LinkedTransferQueue 實現(xiàn)。
DisruptorBlockingQueue -- disruptor 包實現(xiàn)的高性能隊列。
JCToolsBlockingQueue -- JCTools 實現(xiàn)的無鎖隊列。

6.4 、log4j2使用了disruptor技術(shù)

Disruptor有三大殺器 CAS、消除偽共享、RingBuffer
Disruptor通過以下設(shè)計來解決隊列速度慢的問題:

環(huán)形數(shù)組結(jié)構(gòu)

為了避免垃圾回收, 采用數(shù)組而非鏈表. 同時, 數(shù)組對處理器的緩存機制更加友好。
類似的實現(xiàn)思想還有其他應(yīng)用:

disruptormysqllinux 內(nèi)核
RingBuffer 環(huán)形隊列實現(xiàn)redolog通過一個環(huán)形的存儲區(qū)域?qū)崿F(xiàn)其循環(huán)寫入進程間通信所使用的 fifo 通過環(huán)形存儲區(qū)域
  • 元素位置定位

    數(shù)組長度2^n, 通過位運算, 加快定位的速度. 下標(biāo)采取遞增的形式. 不用擔(dān)心index溢出的問題. index是long類型, 即使100萬QPS的處理速度, 也需要30萬年才能用完。

  • 無鎖設(shè)計

    每個生產(chǎn)者或者消費者線程, 會先申請可以操作的元素在數(shù)組中的位置, 申請到之后, 直接在該位置寫入或者讀取數(shù)據(jù)。

到此這篇關(guān)于SpringBoot集成slf4j2日志配置的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)SpringBoot slf4j2日志配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解

    java并發(fā)編程專題(十一)----(JUC原子類)數(shù)組類型詳解

    這篇文章主要介紹了JAVA JUC原子類 數(shù)組類型詳解的相關(guān)資料,文中示例代碼非常詳細,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • java 8 lambda表達式list操作分組、過濾、求和、最值、排序、去重代碼詳解

    java 8 lambda表達式list操作分組、過濾、求和、最值、排序、去重代碼詳解

    java8的lambda表達式提供了一些方便list操作的方法,主要涵蓋分組、過濾、求和、最值、排序、去重,本文通過實例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01
  • SpringBoot3.0整合chatGPT的完整步驟

    SpringBoot3.0整合chatGPT的完整步驟

    ChatGPT是OpenAI推出的一個語言模型系統(tǒng),它能夠?qū)崟r回答用戶提問,包括聊天、糾正語法錯誤,甚至是寫代碼、寫劇本等,由于可玩性很高,迅速在全球范圍內(nèi)風(fēng)靡起來,下面這篇文章主要給大家介紹了關(guān)于SpringBoot3.0整合chatGPT的完整步驟,需要的朋友可以參考下
    2022-12-12
  • 搭建Springboot框架并添加JPA和Gradle組件的方法

    搭建Springboot框架并添加JPA和Gradle組件的方法

    這篇文章主要介紹了搭建Springboot框架并添加JPA和Gradle組件的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-07-07
  • Java實現(xiàn)常見排序算法的優(yōu)化

    Java實現(xiàn)常見排序算法的優(yōu)化

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java實現(xiàn)常見排序算法的優(yōu)化展開,文中有非常詳細的介紹及代碼示例,需要的朋友可以參考下
    2021-01-01
  • java.lang.ExceptionInInitializerError異常的解決方法

    java.lang.ExceptionInInitializerError異常的解決方法

    這篇文章主要為大家詳細介紹了java.lang.ExceptionInInitializerError異常的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Springboot接口參數(shù)校驗的方法

    Springboot接口參數(shù)校驗的方法

    在設(shè)計接口時我們通常需要對接口中的非法參數(shù)做校驗,以降低在程序運行時因為一些非法參數(shù)而導(dǎo)致程序發(fā)生異常的風(fēng)險,這篇文章給大家介紹Springboot接口參數(shù)校驗的方法,感興趣的朋友一起看看吧
    2024-03-03
  • Java中Arrays工具類的一些常見方法總結(jié)

    Java中Arrays工具類的一些常見方法總結(jié)

    在Java中Arrays類是一個實用工具類,用于在數(shù)組上執(zhí)行各種操作,包括排序、搜索、比較等,這篇文章主要給大家介紹了關(guān)于Java中Arrays工具類的一些常見方法,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2024-02-02
  • Spring簡明分析Bean作用域

    Spring簡明分析Bean作用域

    scope用來聲明容器中的對象所應(yīng)該處的限定場景或者說該對象的存活時間,即容器在對象進入其 相應(yīng)的scope之前,生成并裝配這些對象,在該對象不再處于這些scope的限定之后,容器通常會銷毀這些對象,這篇文章主要介紹了Spring中的Bean作用域,需要的朋友可以參考下
    2022-07-07
  • Map 使用 Lambda 的 forEach 實現(xiàn)跳出循環(huán)操作

    Map 使用 Lambda 的 forEach 實現(xiàn)跳出循環(huán)操作

    這篇文章主要介紹了Map 使用 Lambda 的 forEach 實現(xiàn)跳出循環(huán)操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09

最新評論