溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

怎么在Spring Boot中異步輸出Logback日志

發(fā)布時(shí)間:2021-05-21 16:25:47 來源:億速云 閱讀:262 作者:Leah 欄目:編程語言

這篇文章給大家介紹怎么在Spring Boot中異步輸出Logback日志,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。

一、介紹

1.1 Logback

Logback是由log4j創(chuàng)始人設(shè)計(jì)的另一個(gè)開源日志組件,它分為下面下個(gè)模塊:

  • logback-core:其它兩個(gè)模塊的基礎(chǔ)模塊

  • logback-classic:它是log4j的一個(gè)改良版本,同時(shí)它完整實(shí)現(xiàn)了slf4j API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging

  • logback-access:訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能

1.2 日志級(jí)別

包括:TRACE、DEBUG、INFO、WARN 和 ERROR。

1.2.1 TRACE

特別詳細(xì)的系統(tǒng)運(yùn)行完成信息,業(yè)務(wù)代碼中,不要使用。(除非有特殊用意,否則請(qǐng)使用DEBUG級(jí)別替代)

1.2.2 DEBUG

  • 可以填寫所有的想知道的相關(guān)信息(但不代表可以隨便寫,debug信息要有意義,最好有相關(guān)參數(shù));

  • 生產(chǎn)環(huán)境需要關(guān)閉DEBUG信息

  • 如果在生產(chǎn)情況下需要開啟DEBUG,需要使用開關(guān)進(jìn)行管理,不能一直開啟。

1.2.3 INFO

系統(tǒng)運(yùn)行信息

  • Service方法中對(duì)于系統(tǒng)/業(yè)務(wù)狀態(tài)的變更;

  • 主要邏輯中的分步驟。

外部接口部分

  • 客戶端請(qǐng)求參數(shù)(REST/WS);

  • 調(diào)用第三方時(shí)的調(diào)用參數(shù)和調(diào)用結(jié)果。

說明

  1. 并不是所有的service都進(jìn)行出入口打點(diǎn)記錄,單一、簡(jiǎn)單service是沒有意義的;

  2. 對(duì)于復(fù)雜的業(yè)務(wù)邏輯,需要進(jìn)行日志打點(diǎn),以及埋點(diǎn)記錄,比如電商系統(tǒng)中的下訂單邏輯,以及OrderAction操作(業(yè)務(wù)狀態(tài)變更);

  3. 對(duì)于整個(gè)系統(tǒng)的提供出的接口(REST/WS),使用INFO記錄入?yún)ⅲ?/p>

  4. 如果所有的service為SOA架構(gòu),那么可以看成是一個(gè)外部接口提供方,那么必須記錄入?yún)ⅲ?/p>

  5. 調(diào)用其他第三方服務(wù)時(shí),所有的出參和入?yún)⑹潜仨氁涗浀?因?yàn)槟愫茈y追溯第三方模塊發(fā)生的問題)。

1.2.4 WARN

  • 不應(yīng)該出現(xiàn)但是不影響程序、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:

    • 有容錯(cuò)機(jī)制的時(shí)候出現(xiàn)的錯(cuò)誤情況;

    • 找不到配置文件,但是系統(tǒng)能自動(dòng)創(chuàng)建配置文件;

  • 即將接近臨界值的時(shí)候,例如:緩存池占用達(dá)到警告線;

  • 業(yè)務(wù)異常的記錄,比如:當(dāng)接口拋出業(yè)務(wù)異常時(shí),應(yīng)該記錄此異常。

1.2.5 ERROR
影響到程序正常運(yùn)行、當(dāng)前請(qǐng)求正常運(yùn)行的異常情況:

  • 打開配置文件失敗;

  • 所有第三方對(duì)接的異常(包括第三方返回錯(cuò)誤碼);

  • 所有影響功能使用的異常,包括:SQLException和除了業(yè)務(wù)異常之外的所有異常(RuntimeException和Exception)。

不應(yīng)該出現(xiàn)的情況:
如果進(jìn)行了拋出異常操作,請(qǐng)不要記錄ERROR日志,由最終處理方進(jìn)行處理:

反例(不要這么做):

try{
 ....
}catch(Exception ex){
 String errorMessage=String.format("Error while reading information of user [%s]",userName);
 logger.error(errorMessage,ex);
 throw new UserServiceException(errorMessage,ex);
}

1.3 SpringBoot 中 logback

  1. SpringBoot工程自帶logback和slf4j的依賴,所以重點(diǎn)放在編寫配置文件上,需要引入什么依賴,日志依賴沖突統(tǒng)統(tǒng)都不需要我們管了;

  2. logback框架會(huì)默認(rèn)加載classpath下命名為logback-spring或logback的配置文件。

  3. 將所有日志都存儲(chǔ)在一個(gè)文件中文件大小也隨著應(yīng)用的運(yùn)行越來越大并且不好排查問題,正確的做法應(yīng)該是將ERROR日志和其他日志分開,并且不同級(jí)別的日志根據(jù)時(shí)間段進(jìn)行記錄存儲(chǔ)。

二、logback 配置

2.1 配置文件logback-spring.xml示例

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- 屬性文件:在配置文件中找到對(duì)應(yīng)的配置項(xiàng) -->
  <springProperty scope="context" name="logPath" source="logging.path"/>

  <!-- 輸出到控制臺(tái) -->
  <appender name="CONSOLE-LOG" class="ch.qos.logback.core.ConsoleAppender">
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </layout>
  </appender>

  <!-- 獲取比info級(jí)別高(包括info級(jí)別)但除error級(jí)別的日志 -->
  <appender name="INFO-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 指定過濾策略 -->
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>DENY</onMatch>
      <onMismatch>ACCEPT</onMismatch>
    </filter>
    <encoder>
      <!-- 指定日志輸出格式 -->
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </encoder>

    <!-- 指定收集策略:滾動(dòng)策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- 指定生成日志保存地址 -->
      <fileNamePattern>${logPath}/info.%d.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>

  <appender name="ERROR-LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <!-- 指定過濾策略 -->
    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
      <level>ERROR</level>
    </filter>
    <encoder>
      <!-- 指定日志輸出格式 -->
      <pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%L] [%-5p] %m%n</pattern>
    </encoder>
    <!-- 指定收集策略:滾動(dòng)策略-->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--指定生成日志保存地址 -->
      <fileNamePattern>${logPath}/error.%d.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
  </appender>

  <!-- 異步輸出 -->
  <appender name="ASYNC-INFO" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
    <queueSize>256</queueSize>
    <!-- 添加附加的appender,最多只能添加一個(gè) -->
    <appender-ref ref="INFO-LOG"/>
  </appender>

  <appender name="ASYNC-ERROR" class="ch.qos.logback.classic.AsyncAppender">
    <!-- 不丟失日志.默認(rèn)的,如果隊(duì)列的80%已滿,則會(huì)丟棄TRACT、DEBUG、INFO級(jí)別的日志 -->
    <discardingThreshold>0</discardingThreshold>
    <!-- 更改默認(rèn)的隊(duì)列的深度,該值會(huì)影響性能.默認(rèn)值為256 -->
    <queueSize>256</queueSize>
    <!-- 添加附加的appender,最多只能添加一個(gè) -->
    <appender-ref ref="ERROR-LOG"/>
  </appender>

  <!-- 指定最基礎(chǔ)的日志輸出級(jí)別 -->
  <root level="info">
    <appender-ref ref="CONSOLE-LOG" />
    <appender-ref ref="INFO-LOG" />
    <appender-ref ref="ERROR-LOG" />
  </root>

</configuration>

項(xiàng)目配置文件中配置日志輸出地址

logging:
 path: ./logs

2.2 標(biāo)簽說明

  • <root>標(biāo)簽:指定最基礎(chǔ)的日志輸出級(jí)別;

    • <appender-ref>標(biāo)簽,添加append

  • <appender>標(biāo)簽:指定日志的收集策略

    • name屬性指定appender命名

    • class屬性指定輸出策略,通常有兩種,控制臺(tái)輸出和文件輸出,文件輸出就是將日志進(jìn)行一個(gè)持久化。ConsoleAppender將日志輸出到控制臺(tái)。

  • <filter>標(biāo)簽:指定過濾策略

    • <level>:指定過濾的類型。

  • <encoder>標(biāo)簽:使用該標(biāo)簽下的<pattern>標(biāo)簽指定日志輸出格式。

  • <rollingPolicy>標(biāo)簽:指定收集策略,比如基于時(shí)間進(jìn)行收集

    • 標(biāo)簽指定生成日志保存地址,實(shí)現(xiàn)了按天分類以及日志的目標(biāo)了。

springboot是什么

springboot一種全新的編程規(guī)范,其設(shè)計(jì)目的是用來簡(jiǎn)化新Spring應(yīng)用的初始搭建以及開發(fā)過程,SpringBoot也是一個(gè)服務(wù)于框架的框架,服務(wù)范圍是簡(jiǎn)化配置文件。

關(guān)于怎么在Spring Boot中異步輸出Logback日志就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI