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

Logback的使用及如何配置

 更新時間:2021年03月30日 09:32:34   作者:江湖段小二  
這篇文章主要介紹了Logback的使用及如何配置,幫助大家更好的理解和學(xué)習(xí)使用Logback,感興趣的朋友可以了解下

日志在項目開發(fā)過程的作用不言而喻,項目上線后,我們需要根據(jù)日志文件定位問題發(fā)生的位置以及產(chǎn)生的原因。以前在項目開發(fā)中,已經(jīng)有前人在工程中配置過日志,所以完全不需要自己再進行日志的配置。這次在新的項目中自己來配置日志時,還是遇到了一些波折,下面慢慢道來。

1 為什么選用Logback?

目前,在Springboot工程體系中,使用較多的日志組件是Slf4j、Logback以及Log4j2。而Slf4j本身只是一個接口類,具體的實現(xiàn)還是由Logback或Log4j2來完成的。由于Springboot自身就集成了Logback,默認使用的日志組件是Logback,Logback的體系結(jié)構(gòu)具有足夠的通用性,可以在不同的場景下使用。因此,在我們的DRS工程中,使用了Logback進行日志的打印。

目前,Logback包含三個部分:logback-core, logback-classic, logback-access。 Logback-core: 為其他兩個模塊奠定了基礎(chǔ) Logback-classic: 可以被同化為log4j的一個顯著改進的版本,此外, logback-classic實現(xiàn)了slf4japi,因此您可以方便地在logback和其他日志框架(如log4j或log4j)之間來回切換java.util.logging文件 Logback-access: 集成了Servlet容器(如Tomcat和Jetty),以提供HTTP訪問日志功能。

如果使用的是Springboot是2.4版本及以上,則不需要另外引入logback-core, logback-classic, logback-access和slf2j-api的依賴包的。

2 Logback的配置

首先,看一下我們在DRS工程中使用的Logback配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <property name="log.path" value="/duan/drs-server/logs" />
  <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
 
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
  </appender>
 
  <!-- 系統(tǒng)debug日志輸出 -->
  <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/drs-server-debug.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/drs-server-debug.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>DEBUG</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!-- 系統(tǒng)info日志輸出 -->
  <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/drs-server-info.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/drs-server-info.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>INFO</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!-- 系統(tǒng)warn日志輸出 -->
  <appender name="FILE_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/drs-server-warn.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/drs-server-warn.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>WARN</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <!-- 系統(tǒng)error日志輸出 -->
  <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/drs-server-error.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <fileNamePattern>${log.path}/drs-server-error.%d{yyyy-MM-dd}.log</fileNamePattern>
      <maxHistory>30</maxHistory>
    </rollingPolicy>
    <encoder>
      <pattern>${log.pattern}</pattern>
    </encoder>
    <filter class="ch.qos.logback.classic.filter.LevelFilter">
      <level>ERROR</level>
      <onMatch>ACCEPT</onMatch>
      <onMismatch>DENY</onMismatch>
    </filter>
  </appender>
 
  <logger name="com.nuonuo.middleware.drsserver" level="INFO" />
  <logger name="org.springframework" level="warn" />
 
  <root level="INFO">
    <appender-ref ref="STDOUT" />
    <appender-ref ref="FILE_DEBUG" />
    <appender-ref ref="FILE_INFO" />
    <appender-ref ref="FILE_WARN" />
    <appender-ref ref="FILE_ERROR" />
  </root>
</configuration>

說明:

屬性 說明
log.path 定義日志文件的輸出路徑
log.pattern 定義日志文件輸出格式
appender 定義了日志的輸出文件,日志文件保留時長,使用何種模式輸出,以及過濾規(guī)則。在上述文件中,分別針對DEBUG、INFO、WARN和ERROR日志進行了定義了四個Appender
logger 用來設(shè)置某一個類或某個包的日志打印級別。在上述配置中,我們將DRS工程的日志輸出級別定義為INFO,那么,如果只想打印出DRS工程中的日志,則只需將打印級別level設(shè)置為WARN
root 是一個根logger,root下可以包含零個或多個appender。如果一個appender沒有在root下引入,則不會生成對應(yīng)的日志文件

3 Logback的輸出格式

針對以上述配置中的格式進行說明:

%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n
字段 說明
%d{HH:mm:ss.SSS} 用于輸出日志事件的日期,其中%d也可以替換成%date,該設(shè)置對應(yīng)下圖中的紅色標記部分
[%thread] 輸出對應(yīng)的線程名。在上面的截圖中可以看到,輸出線程是主線程main
%-5level 輸出日志級別,其中-5表示如果記錄器名稱長度小于5個字符,則右鍵填充空格
%logger{20} 輸出日志事件起源處記錄器的名稱。其中20表示輸出記錄的名稱長度限制,超過這個長度,記錄器名將會進行縮寫。但是,記錄器名稱中最右邊的段從不縮寫,即使其長度比“長度”選項長。其他段可以縮短到最多一個字符,但永遠不會刪除
[%method,%line] %method 輸出發(fā)出日志記錄請求的方法名稱,%method也可替換成%M; %line——輸出發(fā)出日志記錄請求的行號,%line也可替換成%L
%msg 輸出應(yīng)用程序提供的與日志事件關(guān)聯(lián)的消息。其中%msg也可替換成%m或%message
%n 輸出平臺相關(guān)的行分隔符字符

4 Appender

Appender子類包含F(xiàn)ilter、Encoder、ConsoleAppender、FileAppender、以及RollingFileAppender。其類圖關(guān)系如下所示。

顧名思義目標文件由file選項指定。如果該文件已存在,則根據(jù)append屬性的值將其追加或截斷。RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能。

類名 encoder immediateFlush target withJansi append file prudent rollingPolicy triggeringPolicy
OutputStreamAppender
ConsoleAppender
FileAppender - -
RollingFileAppender - -

OutputStreamAppender 這個類提供了其他附加程序構(gòu)建的基本服務(wù)。該類包含兩個屬性設(shè)置: encoder—— 確定日志寫入的編碼格式。 immediateFlush——布爾值,默認為true, 立即刷新輸出流可確保立即寫出日志事件,并且在應(yīng)用程序退出而未正確關(guān)閉附加器時不會丟失這些事件。 另一方面,將此屬性設(shè)置為“false”可能會使日志吞吐量增加四倍。同樣,如果immediateFlush設(shè)置為“false”,并且應(yīng)用程序退出時appender未正確關(guān)閉,則尚未寫入磁盤的日志事件可能會丟失。

ConsoleAppender 將日志附加在控制臺上,其包含三個屬性: encoder——略 target—— System.out或者 System.err字符串值之一 默認目標是 System.out withJansi——布爾值,默認false。 將withJansi設(shè)置為true將激活Jansi庫,該庫為Windows機器上的ANSI顏色代碼提供支持。在Windows主機上,如果此屬性設(shè)置為true,則應(yīng)將網(wǎng)址:org.fusesource.jansi:jansi:1.17“在類路徑上進行設(shè)置。請注意,基于Unix的操作系統(tǒng)(如Linux和macosx)默認支持ANSI顏色代碼。一般我們很少用到,使用默認值即可。

FileAppender 它將日志事件附加到文件中,其包含四個屬性: append——布爾值,默認為true, 表示事件附加在現(xiàn)有文件的末尾。如果append為false,則任何現(xiàn)有文件都將被截斷。 encoder——略 file—— 要寫入的文件的名稱, 如果文件不存在,則創(chuàng)建該文件。 如果文件的父目錄不存在,F(xiàn)ileAppender將自動創(chuàng)建它,包括任何必要但不存在的父目錄。 prudent——布爾值,默認值為false。如果設(shè)置為true, FileAppender將安全地寫入指定的文件,即使存在運行在不同jvm(可能運行在不同主機上)中的其他FileAppender實例。

RollingFileAppender 擴展了FileAppender,具有滾動更新日志文件的功能,其包含以下幾個屬性: file——略 append——略 encoder——略 rollingPolicy—— 此選項是在發(fā)生滾動時指定RollingFileAppender行為的組件,包含SizeAndTimeBasedRollingPolicy、FixedWindowRollingPolicy、TimeBasedRollingPolicy。在上述配置中我們使用的是最為廣泛的TimeBasedRollingPolicy。 triggeringPolicy—— 此選項是通知RollingFileAppender何時激活滾動更新過程的組件 prudent——布爾值,當(dāng)為true時,不支持FixedWindowRollingPolicy。

5 Logback使用過程中遇到的問題

起初,在配置完logback.xml文件后,始終無法將日志輸出到指定目錄。 第一步,調(diào)試確認使用的是logback組件; 第二步,引入logback-core、logback-classic、logback-access和slf4j-api對應(yīng)的jar包,驗證是否可以將日志輸出到指定目錄。驗證后發(fā)現(xiàn),仍然無法解決問題,于是將引入的jar包刪除。 第三步,排除springboot中包含的log4j2相關(guān)的jar,驗證后仍無法解決問題。 第四步,在網(wǎng)上查到可能跟配置文件的命名有關(guān),有說logback-spring.xml加載的優(yōu)先級最高,于是將文件名由logback.xml改為logback-spring.xml,但是仍然無法解決問題。官網(wǎng)上看到的加載順序是: logback-test.xml> logback.groovy> logback.xml。具體可見官方文檔logback.qos.ch/manual/conf… 第五步,懷疑可能沒加載logback.xml文件,于是在application.properties中加入logging.config=classpath:logback.xml,啟動工程時報錯,錯誤信息是: class path resource [logback.xml] cannot be resolved to URL because it does not exist。

根據(jù)錯誤信息可以看到,系統(tǒng)中根本沒有加載到logback.xml文件。 第六步,由于第五步驗證系統(tǒng)根本沒有加載到logback.xml文件,于是檢查了一下pom.xml文件,發(fā)現(xiàn)在build時,沒有引入資源文件,于是修改pom.xml文件,添加如下內(nèi)容,成功將日志輸出到指定目錄。

<resource>
  <directory>src/main/resources</directory>
  <includes>
    <include>**/*.xml</include>
  </includes>
  <filtering>false</filtering>
</resource>

以上就是Logback的使用及如何配置的詳細內(nèi)容,更多關(guān)于Logback的使用和配置的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口

    Java深入數(shù)據(jù)結(jié)構(gòu)理解掌握抽象類與接口

    在類中沒有包含足夠的信息來描繪一個具體的對象,這樣的類稱為抽象類,接口是Java中最重要的概念之一,它可以被理解為一種特殊的類,不同的是接口的成員沒有執(zhí)行體,是由全局常量和公共的抽象方法所組成,本文給大家介紹Java抽象類和接口,感興趣的朋友一起看看吧
    2022-05-05
  • ZooKeeper Java API編程實例分析

    ZooKeeper Java API編程實例分析

    本文主要通過實例給大家詳細分析了ZooKeeper用JAVA實現(xiàn)API編程的知識要點。
    2017-11-11
  • SpringBoot 圖形驗證碼的生成和校驗

    SpringBoot 圖形驗證碼的生成和校驗

    隨著系統(tǒng)和業(yè)務(wù)的不停升級,前后端代碼放在一起的項目越來越臃腫,已經(jīng)無法快速迭代和職責(zé)區(qū)分了,于是紛紛投入了前后端分離的懷抱,發(fā)現(xiàn)代碼和職責(zé)分離以后,開發(fā)效率越來越高了,但是以前的驗證碼登錄方案就要更改了。本文來看一下SpringBoot 圖形驗證碼的生成和校驗
    2021-05-05
  • Java教程package和import訪問控制的步驟詳解

    Java教程package和import訪問控制的步驟詳解

    這篇文章主要為大家介紹了Java教程package和import訪問控制的步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • Java中的Native關(guān)鍵字講解

    Java中的Native關(guān)鍵字講解

    本文介紹了Java中的Native關(guān)鍵字,native關(guān)鍵字是架起本機語言和JAVA之間鴻溝的橋梁。如果我們的軟件與硬件的交互在使用預(yù)先存在的代碼時更有效,那么這可以作為一個關(guān)鍵環(huán)節(jié)。與從頭開始設(shè)計新的應(yīng)用程序代碼相比,只要可以避免,它就可以使實現(xiàn)工作更少,下面來了解集體內(nèi)容
    2021-12-12
  • java使用文件流實現(xiàn)查看下載次數(shù)

    java使用文件流實現(xiàn)查看下載次數(shù)

    這篇文章主要為大家詳細介紹了java使用文件流實現(xiàn)查看下載次數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • elasticsearch節(jié)點的transport請求發(fā)送處理分析

    elasticsearch節(jié)點的transport請求發(fā)送處理分析

    這篇文章主要為大家介紹了elasticsearch節(jié)點的transport請求發(fā)送處理分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-04-04
  • java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例

    java實現(xiàn)1M圖片壓縮優(yōu)化到100kb實現(xiàn)示例

    這篇文章主要為大家介紹了java實現(xiàn)1M圖片壓縮優(yōu)化到100kb示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Java?IO網(wǎng)絡(luò)模型實現(xiàn)解析

    Java?IO網(wǎng)絡(luò)模型實現(xiàn)解析

    這篇文章主要為大家介紹了Java?IO網(wǎng)絡(luò)模型實現(xiàn)解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    Java實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址

    這篇文章主要介紹了如何利用Java語言實現(xiàn)獲取內(nèi)網(wǎng)的所有IP地址,文中的示例代碼講解詳細,對我們學(xué)習(xí)有一定的參考價值,快跟隨小編一起學(xué)習(xí)一下吧
    2022-06-06

最新評論