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

SpringBoot集成slf4j日志配置的方法

 更新時(shí)間:2021年09月28日 16:24:25   作者:灑家肉山大魔王  
本文主要介紹了SpringBoot集成slf4j日志配置的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

日志,作為一個(gè)應(yīng)用系統(tǒng)的重要部分,然而并不會(huì)在項(xiàng)目預(yù)研或需求設(shè)計(jì)階段就作為一個(gè)功能模塊單獨(dú)規(guī)劃設(shè)計(jì),但這絲毫不影響它在任何一個(gè)系統(tǒng)中的重要的地位。

為了保證服務(wù)的高可用,及時(shí)發(fā)現(xiàn)問(wèn)題,迅速解決問(wèn)題等訴求,所以生產(chǎn)環(huán)境一旦出現(xiàn)問(wèn)題,預(yù)警系統(tǒng)就會(huì)通過(guò)郵件、短信甚至電話的方式實(shí)施多維轟炸模式,確保相關(guān)負(fù)責(zé)人不錯(cuò)過(guò)每一個(gè)可能的bug。

預(yù)警系統(tǒng)判斷疑似bug大部分源于日志。比如某個(gè)微服務(wù)接口由于各種原因?qū)е骂l繁調(diào)用出錯(cuò),此時(shí)調(diào)用端會(huì)捕獲這樣的異常并打印ERROR級(jí)別的日志,當(dāng)該錯(cuò)誤日志達(dá)到一定次數(shù)出現(xiàn)的時(shí)候,就會(huì)觸發(fā)報(bào)警。

其次,在以往項(xiàng)目開發(fā)過(guò)程中,我們往往習(xí)慣性使用System.out.println()這個(gè)常用的打印輸出語(yǔ)句來(lái)顯示斷點(diǎn)信息或業(yè)務(wù)運(yùn)行對(duì)象信息或控制臺(tái)日志記錄,其實(shí)大量的使用System.out.println()在一定程度上會(huì)增加資源的消耗。Java日志框架眾多,常用的有java.util.logging,log4j,logback,commons-logging等等。而且SpringBoot 提供了一套日志系統(tǒng),logback是最優(yōu)的選擇。因此本文根據(jù)實(shí)際項(xiàng)目中使用slf4j 的logback來(lái)輸出日志,效率很高。

日志的重要性,不言而喻。

OK,接下來(lái),本文主要總結(jié)一下項(xiàng)目中目前使用的SpringBoot集成slf4j日志配置。

1、slf4j概述

slf4j,即(Simple Logging Facade for Java,簡(jiǎn)單門面日志)。它是對(duì)所有日志框架制定的一種規(guī)范、標(biāo)準(zhǔn)、接口,并不是一個(gè)框架的具體的實(shí)現(xiàn),它只服務(wù)于各種各樣的日志系統(tǒng)。

slf4j提供了統(tǒng)一的記錄日志的接口,對(duì)不同日志系統(tǒng)的具體實(shí)現(xiàn)進(jìn)行了抽象化,只要按照其提供的方法記錄即可,最終日志的格式、記錄級(jí)別、輸出方式等通過(guò)綁定具體的日志系統(tǒng)來(lái)實(shí)現(xiàn)。在項(xiàng)目中使用了slf4j記錄日志,并且綁定了log4j(pom.xml中配置了相應(yīng)的jar包依賴),則日志會(huì)以log4j的風(fēng)格輸出;后期需要改為以logback的風(fēng)格輸出日志,只需要將jar包log4j替換成logback即可,根本不需要修改日志文件的代碼。

首先看下日志打印,如下,在啟動(dòng)類中引入Logger日志記錄:

@SpringBootApplication
public class SpringbootSlf4jApplication {
 
    private static final Logger logger = LoggerFactory.getLogger(SpringbootSlf4jApplication.class);
 
    public static void main(String[] args) {
        logger.info("===============項(xiàng)目啟動(dòng)了===============");
        SpringApplication app = new SpringApplication(SpringbootSlf4jApplication.class);
        app.run(args);
        logger.info("===============啟動(dòng)成功了===============");
    }
}

日志信息:

2020-03-21 11:28:18.017 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - ===============項(xiàng)目啟動(dòng)了===============
2020-03-21 11:28:18.447 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - Starting SpringbootSlf4jApplication on DESKTOP-V8RSTKO with PID 17476
2020-03-21 11:28:18.447 [main] DEBUG com.hl.magic.slf4j.SpringbootSlf4jApplication - Running with Spring Boot v2.1.8.RELEASE, Spring v5.1.9.RELEASE
2020-03-21 11:28:18.447 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - No active profile set, falling back to default profiles: default
2020-03-21 11:28:19.077 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8080 (http)
2020-03-21 11:28:19.087 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
2020-03-21 11:28:19.097 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
2020-03-21 11:28:19.097 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/9.0.24]
2020-03-21 11:28:19.157 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
2020-03-21 11:28:19.157 [main] INFO  org.springframework.web.context.ContextLoader - Root WebApplicationContext: initialization completed in 680 ms
2020-03-21 11:28:19.287 [main] INFO  o.s.scheduling.concurrent.ThreadPoolTaskExecutor - Initializing ExecutorService 'applicationTaskExecutor'
2020-03-21 11:28:19.387 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
2020-03-21 11:28:19.397 [main] INFO  o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
2020-03-21 11:28:19.397 [main] INFO  org.springframework.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
2020-03-21 11:28:19.407 [main] INFO  org.springframework.web.servlet.DispatcherServlet - Completed initialization in 10 ms
2020-03-21 11:28:19.410 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
2020-03-21 11:28:19.410 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - Started SpringbootSlf4jApplication in 1.323 seconds (JVM running for 2.024)
2020-03-21 11:28:19.410 [main] INFO  com.hl.magic.slf4j.SpringbootSlf4jApplication - ===============啟動(dòng)成功了===============

getLogger(xxxxxxx.class);這個(gè)方法將當(dāng)前所在的類作為入?yún)鬟f,輸出日志就會(huì)顯示對(duì)應(yīng)的xxx類名。這樣聲明的好處就是方便定位日志,準(zhǔn)確編寫class信息能夠提供快速定位日志的效率。

然鵝,SpringBoot內(nèi)部雖然提供了slf4j,但是日志記錄是需要根據(jù)項(xiàng)目實(shí)地需要進(jìn)行配置后,才能發(fā)揮它的最大功效。OK,接下來(lái)一起來(lái)了解下SpringBoot項(xiàng)目集成slf4j日志的配置。

2、pom.xml的日志依賴

pom.xml中日志依賴配置如下:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
    <dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.30</version>
</dependency>

3、application.yml的日志配置

SpringBoot框架內(nèi)部已經(jīng)集成slf4j,在使用時(shí),根據(jù)項(xiàng)目實(shí)地需要,還是須對(duì)slf4j進(jìn)行指定配置。

application.yml文件是SpringBoot的一個(gè)及其重要、核心的配置文件。yml 文件的層次感較強(qiáng)且直觀,但對(duì)格式要求比較高,英文冒號(hào)后面必須要有一個(gè)空格,如果換行配置子項(xiàng),須定格輸入兩個(gè)空格后再進(jìn)行配置,否則項(xiàng)目估計(jì)無(wú)法啟動(dòng),而且也不報(bào)錯(cuò)。本文測(cè)試項(xiàng)目的application.yml中日志配置如下:

logging:
  config: /HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/src/main/resources/logback.xml
  level:
    com.hl.magic: trace

注意:

【1】這里logback.xml的配置不同于一般日志配置;

因?yàn)樵趩为?dú)的一個(gè)SpringBoot工程中,配置config標(biāo)簽處為:locbak.xml即可;

這里在SpringBoot工程的一個(gè)子Module中集成日志配置,因此config標(biāo)簽處,設(shè)置為絕對(duì)路徑。

【2】logging.config是用來(lái)指定項(xiàng)目啟動(dòng)的時(shí)候,讀取哪個(gè)配置文件,這里指定的是日志配置文件,即子module項(xiàng)目根路徑下的 logback.xml文件,該文件是日志的主要配置信息。

【3】level用來(lái)配置指定包的路徑下應(yīng)用程序的日志記錄,及其日志級(jí)別。

logging.level用來(lái)指定具體的包中應(yīng)用程序日志的輸出級(jí)別。上面的配置表示com.hl.magic包下的所有日志輸出級(jí)別為 trace,會(huì)將操作數(shù)據(jù)庫(kù)的 sql 打印出來(lái),開發(fā)時(shí)設(shè)置成 trace 方便定位問(wèn)題,在生產(chǎn)環(huán)境上,將這個(gè)日志級(jí)別再設(shè)置成 error 級(jí)別即可。

日志常用的五個(gè)級(jí)別,根據(jù)嚴(yán)重程度由低到高,依次為:debug(調(diào)試 ) < info(消息) < warn(警告) < error(錯(cuò)誤) < fatal(嚴(yán)重錯(cuò)誤)。通??梢愿鶕?jù)實(shí)際所需要的顆粒度的大小選擇其中的幾個(gè),當(dāng)前常用debug,info,warn,error4個(gè)級(jí)別。

4、logback.xml配置文件定義

在引入日志配置后,需要制定日志的配置文件內(nèi)容,這樣系統(tǒng)運(yùn)行后,根據(jù)定制化需求才能輸出我們所需的指定日志記錄信息。

本文測(cè)試用例的日志配置內(nèi)容logback.xml文件,詳細(xì)內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑-->
    <property name="LOG_HOME" value="/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>
    <!-- 定義日志格式  -->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>
    <!-- 控制臺(tái)輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <FileNamePattern>${LOG_HOME}/SpringBoot-Slf4j_%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天數(shù)-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>
 
    <!-- 日志輸出級(jí)別 -->
    <logger name="org.springframework" level="INFO"/>
    <logger name="com.hl.magic" level="INFO"/>
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
    </root>
</configuration>

 有上邊可以看出,我們可以輕松的在logback.xml中定義日志輸出的格式、路徑、控制臺(tái)輸出格式、文件大小、保存時(shí)長(zhǎng)等內(nèi)容。接下來(lái),就這些內(nèi)容進(jìn)行分析。

5、logback.xml配置文件解析

5.1 定義日志的存儲(chǔ)路徑

logback.xml文件中日志存儲(chǔ)路徑定義:

<!--定義日志文件的存儲(chǔ)地址 勿在 LogBack 的配置中使用相對(duì)路徑-->
<property name="LOG_HOME" value="/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log"/>

分析:

首先,定義日志的名稱:LOG_HOME;

其次,設(shè)置輸出value定義為日志的存儲(chǔ)路徑,日志都會(huì)存儲(chǔ)在該路徑下。

注意:這里勿在logback文件中使用相對(duì)路徑,不管是 windows 系統(tǒng)還是 Linux 系統(tǒng),日志存儲(chǔ)的路徑必須要是絕對(duì)路徑。

5.2 定義日志的輸出格式

<!-- 定義日志格式  -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%thread] [%-30.30logger{30}] %msg%n"/>

分析:

 首先,定義日志格式的名稱:LOG_PATTERN

其次,設(shè)置日志的具體格式value。

"%d" 表示日期(也可以使用"%date");

"%-5level" 表示級(jí)別從左顯示5個(gè)字符寬度;

"%thread" 表示線程名;

"%-30.30logger{30}"  表示如果logger的名稱小于30,就“-”指定左對(duì)齊;如果其名稱長(zhǎng)于30字符,就從左邊較遠(yuǎn)輸出的字符截掉,保持logger的名字長(zhǎng)度最終限制為30個(gè)字符;

"%msg" 表示日志消息,`%n` 是換行符。

5.3 定義控制臺(tái)輸出

<!-- 定義控制臺(tái)輸出 -->
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
        <!-- 變量引入  -->
        <pattern>${LOG_PATTERN}</pattern>
            
        <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
        <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>-->
    </encoder>
</appender>

分析:

使用 <appender>標(biāo)簽設(shè)置控制臺(tái)輸出(`class="ch.qos.logback.core.ConsoleAppender"`)的配置,定義為 “CONSOLE”。使用引入變量的方式: <pattern>${LOG_PATTERN}</pattern>引進(jìn)來(lái)即可。引入上面定義好的輸出格式(LOG_PATTERN)來(lái)輸出

這里,也可以直接配置格式化輸出結(jié)果的方式,不過(guò)體力工作。

5.4 定義日志相關(guān)參數(shù)

在<appender>標(biāo)簽內(nèi)定義一個(gè)名為 “FILE” 的文件參數(shù)配置。主要是配置日志文件的輸出文件名、日志文件保留時(shí)間、日志文件保存的路徑和日志的輸出格式、及單個(gè)日志文件存儲(chǔ)的大小。

<!-- 按照每天生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!--日志文件輸出的文件名-->
        <FileNamePattern>${LOG_HOME}</FileNamePattern>
        <!--日志文件保留天數(shù)-->
        <MaxHistory>30</MaxHistory>
    </rollingPolicy>
    <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
         <!-- 變量引入  -->
         <pattern>${LOG_PATTERN}</pattern>
            
         <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級(jí)別從左顯示5個(gè)字符寬度%msg:日志消息,%n是換行符-->
         <!-- <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern> -->
    </encoder>
    <!--日志文件最大的存儲(chǔ)-->
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
         <MaxFileSize>10MB</MaxFileSize>
    </triggeringPolicy>
</appender>

分析:

 這里,根據(jù)前面配置的日志變量,引入到配置日志文件的輸出文件名、日志文件保留時(shí)間、日志文件保存的路徑和日志的輸出格式、及單個(gè)日志文件存儲(chǔ)的大小的各個(gè)標(biāo)簽項(xiàng)即可。

5.5 定義日志的輸出級(jí)別

在完成前邊的準(zhǔn)備工作后,最后來(lái)定義一下日志的輸出級(jí)別:

<!-- 日志輸出級(jí)別 -->
<logger name="org.springframework" level="ERROR"/>
<logger name="com.hl.magic" level="ERROR"/>
<root level="ERROR">
    <appender-ref ref="CONSOLE"/>
    <appender-ref ref="FILE"/>
</root>

分析:

在<logger>標(biāo)簽中來(lái)項(xiàng)目默認(rèn)的日志輸出級(jí)別,這里定義級(jí)別為ERROR(用在生產(chǎn)環(huán)境中),然后針對(duì)ERROR級(jí)別的日志,使用<root>引用上面定義好的控制臺(tái)日志輸出和日志文件的參數(shù)。這樣 logback.xml 文件中的配置就設(shè)置完了。

注意:

<logger>標(biāo)簽并不是只能添加一個(gè),我們還可以指定項(xiàng)目特定包路徑的日志輸出級(jí)別。

本文測(cè)試類配置日志輸出級(jí)別為:DEBUG,使用最低日志輸出級(jí)別,確保后邊測(cè)試時(shí)能夠打印出所有測(cè)試項(xiàng)。如果需要改變?nèi)罩炯?jí)別就在上面配置內(nèi)容修改即可。

6、測(cè)試日志輸出

在程序中,一般使用 Logger(注意引jar包為slf4j) 對(duì)象來(lái)打印出一些日志信息,可以指定打印出的日志級(jí)別,也支持占位符。

定義一個(gè)測(cè)試類:LoggerItemController.java

/**
 * 日志輸出測(cè)試的controller
 */
@RestController
@RequestMapping("/loggerItem")
public class LoggerItemController {
 
    private static final Logger logger = LoggerFactory.getLogger(LoggerItemController.class);
 
    @GetMapping("/logInfo")
    public ResponseMessage logTest(){
 
        logger.debug("=====>測(cè)試日志debug級(jí)別打印<====");
        logger.info("=====>測(cè)試日志info級(jí)別打印<=====");
        logger.error("=====>測(cè)試日志error級(jí)別打印<====");
        logger.warn("=====>測(cè)試日志warn級(jí)別打印<=====");
 
        // 使用占位符打印出一些參數(shù)信息
        String csdn = "https://blog.csdn.net/qq_27706119";
        String git = "https://github.com/JohnnyHL";
        logger.info("======>AndOne丶的CSDN博客:{};AndOne丶的GitHub地址:{};", csdn, git);
 
        return new ResponseMessage(ResponseStatus.SUCCESS.getStatus(),ResponseStatus.SUCCESS.getMessage());
    }
}

先啟動(dòng)項(xiàng)目,瀏覽器訪問(wèn)地址:127.0.0.1:8080/loggerItem/logInfo

查看控制臺(tái)打印信息:

=====>測(cè)試日志debug級(jí)別打印<====
=====>測(cè)試日志info級(jí)別打印<=====
=====>測(cè)試日志error級(jí)別打印<====
=====>測(cè)試日志warn級(jí)別打印<=====
======>AndOne丶的CSDN博客:https://blog.csdn.net/qq_27706119;AndOne丶的GitHub地址:https://github.com/JohnnyHL;

日志的輸出級(jí)別中,DEBUG為最低級(jí)別,這樣能打印出全部信息。如果提高日志輸出級(jí)別,比如選擇INFO。則DEBUG 這條記錄將不會(huì)被打印出來(lái),這個(gè)大家可自行測(cè)試即可。同時(shí),查看下前邊配置的日志存儲(chǔ)路徑:“/HL/IdeaProjects/SpringBoot-Item/springboot-slf4j/log”目錄,該目錄下記錄了項(xiàng)目啟動(dòng),以及后面生成的所有日志記錄。在日常開發(fā)過(guò)程中,項(xiàng)目部署后,可通過(guò)查看日志文件來(lái)定位問(wèn)題。

7、小結(jié)

本文首先簡(jiǎn)述slf4j,詳細(xì)地分析了logback.xml 文件中對(duì)日志相關(guān)信息的配置;然后對(duì)SpringBoot集成slf4j 輸出日志做了詳細(xì)的分析說(shuō)明;最后,根據(jù)日志配置,利用一個(gè)demo進(jìn)行測(cè)試分析。在實(shí)地項(xiàng)目中,日志都是排查問(wèn)題的過(guò)程中非常重要的資料。

本文測(cè)試源碼下載地址:springboot集成slf4j日志配置

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

相關(guān)文章

最新評(píng)論