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

SpringBoot應用自定義logback日志詳解

 更新時間:2022年10月08日 11:49:43   作者:JAVA旭陽  
默認情況下,SpringBoot內(nèi)部使用logback作為系統(tǒng)日志實現(xiàn)的框架,將日志輸出到控制臺,不會寫到日志文件。本篇文章主要講解下如何自定義logabck.xml以及對logback文件中配置做一個詳解,需要的可以參考一下

概述

默認情況下,SpringBoot內(nèi)部使用logback作為系統(tǒng)日志實現(xiàn)的框架,將日志輸出到控制臺,不會寫到日志文件。如果在application.properties或application.yml配置,這樣只能配置簡單的場景,保存路徑、日志格式等。復雜的場景(區(qū)分 info 和 error 的日志、每天產(chǎn)生一個日志文件等)滿足不了,只能自定義配置文件logback-spring.xml或者logback.xml。本篇文章主要講解下如何自定義logabck.xml以及對logback文件中配置做一個詳解。

logback配置詳解

首先我們先了解下logback。

logback 主要分為三個模塊:

  • logback-core:是其他兩個模塊的基礎模塊
  • logback-classic:是對 core 模塊的擴展,相當于 log4j 的改良版。classic 模塊實現(xiàn)了 Slf4j 的 API 因此可以便于和其他日志框架直接切換
  • logback-access:與Servlet容器集成,以提供http訪問日志功能。

官網(wǎng)配置文檔地址:https://logback.qos.ch/manual/configuration.html

配置內(nèi)容概念介紹

Logger Context

LoggerContext負責制造logger,也負責以樹結構排列各logger。其他所有l(wèi)ogger也通過org.slf4j.LoggerFactory 類的靜態(tài)方法getLogger取得。 getLogger方法以 logger名稱為參數(shù)。

Logger

Logger作為日志的記錄器,把它關聯(lián)到應用的對應的context上后,主要用于存放日志對象,也可以定義日志類型、級別。

Appender

Appender主要用于指定日志輸出的目的地,目的地可以是控制臺、文件、遠程套接字服務器、 MySQL、PostreSQL、 Oracle和其他數(shù)據(jù)庫、 JMS和遠程UNIX Syslog守護進程等。

Layout

負責把事件轉(zhuǎn)換成字符串,格式化的日志信息的輸出。

配置介紹

配置文件的基本結構:以開頭,后面有零個或多個元素,有零個或多個元素,有最多一個元素。

默認配置的步驟

  • 嘗試在 classpath下查找文件logback-test.xml;
  • 如果文件不存在,則查找文件logback.xml;
  • 如果兩個文件都不存在,logback用BasicConfigurator自動對自己進行配置,這會導致記錄輸出到控制臺。
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan:當此屬性設置為true時,配置文件如果發(fā)生改變,將會被重新加載,默認值為true。 scanPeriod:設置監(jiān)測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位是毫秒。當scan為true時,此屬性生效。默認的時間間隔為1分鐘。 
    debug:當此屬性設置為true時,將打印出logback內(nèi)部日志信息,實時查看logback運行狀態(tài)。默認值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 運行環(huán)境,dev:開發(fā),test:測試,pre:預生產(chǎn),pro:生產(chǎn) -->
    <property name="system_host" value="dev" />
    <property file="system.properties" />
    <!-- 上下文變量設置,用來定義變量值,其中name的值是變量的名稱,value的值時變量定義的值。 通過<property>定義的值會被插入到logger上下文中。定義變量后,可以使“${}”來使用變量。 -->
    <property name="CONTEXT_NAME" value="logback-test" />
    <!-- 日志文件存放路徑設置,絕對路徑 -->
    <property name="logs.dir" value="/opt/logs" />
    <!-- 日志文件存放路徑設置,tomcat路徑 -->
    <property name="logs.dir" value="${catalina.base}/logs" />
    <!-- 定義日志文件 相對輸入位置 -->  
    <property name="log_dir" value="log" />
    <!-- 日志輸出格式設置 -->
    <!-- 
    %d{yyyy-MM-dd HH:mm:ss} [%level] - %msg%n
      Logger: %logger
      Class: %class
      File: %file
      Caller: %caller
      Line: %line
      Message: %m
      Method: %M
      Relative: %relative
      Thread: %thread
      Exception: %ex
      xException: %xEx
      nopException: %nopex
      rException: %rEx
      Marker: %marker
      newline:%n
    -->
    <property name="CUSTOM_LOG_PATTERN"
        value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{90} - %msg%n" />
    <!-- 上下文名稱:<contextName>, 每個logger都關聯(lián)到logger上下文, 默認上下文名稱為“default”。但可以使用<contextName>設置成其他名字,用于區(qū)分不同應用程序的記錄。 
        一旦設置,不能修改。 -->
    <contextName>${CONTEXT_NAME}</contextName>
    <!-- <appender>是<configuration>的子節(jié)點,是負責寫日志的組件。 有兩個必要屬性name和class。 name指定appender名稱, 
        class指定appender的實現(xiàn)類。 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- 對日志進行格式化。 -->
        <encoder>
            <pattern>${CUSTOM_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
    <appender name="file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 按天來回滾,如果需要按小時來回滾,則設置為{yyyy-MM-dd_HH} -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>log/testC.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- 如果按天來回滾,則最大保存時間為30天,30天之前的都將被清理掉 -->
            <maxHistory>30</maxHistory>
            <!-- 按時間回滾的同時,按文件大小來回滾 -->
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!-- 過濾器,只記錄WARN級別的日志 -->
        <!-- 果日志級別等于配置級別,過濾器會根據(jù)onMath 和 onMismatch接收或拒絕日志。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 設置過濾級別 -->
            <level>WARN</level>
            <!-- 用于配置符合過濾條件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用于配置不符合過濾條件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 日志輸出格式 -->
        <encoder>
            <pattern>${CUSTOM_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
	
    <appender name="log_file"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。 -->
        <file>${logs.dir}/logback-test.log</file>
        <!-- 按照固定窗口模式生成日志文件,當文件大于20MB時,生成新的日志文件。窗口大小是1到3,當保存了3個歸檔文件后,將覆蓋最早的日志 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <!-- 必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產(chǎn)生歸檔文件mylog1.log和mylog2.log。還可以指定文件壓縮選項,例如,mylog%i.log.gz 
                或者 沒有l(wèi)og%i.log.zip -->
            <FileNamePattern>${logs.dir}/logback-test.%i.log</FileNamePattern>
            <!-- 窗口索引最小值 -->
            <minIndex>1</minIndex>
            <!-- 窗口索引最大值 -->
            <maxIndex>3</maxIndex>
        </rollingPolicy>
        <!-- 日志級別過濾器 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 日志級別過濾器 -->
            <level>INFO</level>
            <!-- 符合要求的日志級別,過濾,ACCEPT:接受 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不符合要求的日志級別,過濾,DENY:拒絕 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 激活滾動的條件。 -->
        <triggeringPolicy
            class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <!-- 活動文件的大小,默認值是10MB -->
            <maxFileSize>30MB</maxFileSize>
        </triggeringPolicy>
        <!-- 對記錄事件進行格式化。 -->
        <encoder>
            <pattern>${CUSTOM_LOG_PATTERN}</pattern>
            <charset>UTF-8</charset>
        </encoder>
    </appender>
	
    <!-- 異步輸出 -->
    <appender name="ASYNC_logback" class="ch.qos.logback.classic.AsyncAppender">
        <!-- 不丟失日志.默認的,如果隊列的80%已滿,則會丟棄TRACT、DEBUG、INFO級別的日志 -->
        <!-- <discardingThreshold>0</discardingThreshold> -->
        <!-- 更改默認的隊列的深度,該值會影響性能.默認值為256 -->
        <!-- <queueSize>256</queueSize> -->
        <!-- 添加附加的appender,最多只能添加一個 -->
        <appender-ref ref="log_file" />
    </appender>
    <!-- 指定包輸出路徑 -->
    <!-- 用來設置某一個 包 或者具體的某一個 類 的日志打印級別、以及指定<appender>, name:用來指定受此logger約束的某一個包或者具體的某一個類。 
        level:用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設置此屬性,那么當前l(fā)oger將會繼承上級的級別。 
        additivity:是否向上級logger傳遞打印信息。默認是true。(這個logger的上級就是上面的root) <logger>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。 -->
    <logger name="org.logback.test" level="DEBUG" additivity="true">
        <appender-ref ref="stdout" />
    </logger>
    <!-- 特殊的<logger>元素,是根logger。只有一個level屬性,應為已經(jīng)被命名為"root". level:設置打印級別,大小寫無關:TRACE, 
        DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。 <root>可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個loger。 -->
    <root>
        <level value="WARN" />
        <!-- if表達式,需要Janino jar -->
        <!-- Janino 2.6.0版本開始,除了janino.jar之外, commons-compiler.jar也需要在類路徑中 -->
        <if condition='property("system_host").contains("dev")'>
            <then>
                <appender-ref ref="stdout" />
            </then>
        </if>
        <appender-ref ref="file" />
    </root>
</configuration>

SpringBoot中自定義logback

SpringBoot啟用自定義logback有3種方式:

  • classpath下存在logback-spring.xml
  • classpath下有l(wèi)ogback.xml
  • 配置文件中通過配置項指定文件:logging.config: ./logback-rule.xml

如果可能,我們建議您為日志記錄配置使用-spring變體或者通過配置項的方式(例如,logback-spring.xml而不是logback.xml)。如果使用標準配置,Spring不能完全控制日志初始化。

我們本例使用logback-spring.xml作為配置文件演示。

在 src/main/resources 下創(chuàng)建 logback-spring.xml 文件,分開記錄系統(tǒng)輸出日志和Error日志。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <!--彩色日志輸出格式-->
    <property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
    <!--非彩色日志輸出格式-->
    <property name="PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />

    <!--dev文件路徑:src同級目錄logs,如果上級目錄不存在會自動創(chuàng)建-->
    <property name="DEV_FILE_PATH" value="./logs" />
    <!-- pro文件路徑 -->
    <property name="PRO_FILE_PATH" value="./logs-prod" />

    <!-- 控制臺輸出 -->
    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 按照每天生成輸出日志文件 -->
    <appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <encoder>
            <!--格式化輸出:%d表示日期,%thread表示線程,%-5level:級別從左顯示五個字符寬度,%logger{36}:logger是class的全名,后面的數(shù)字代表限制最長的字符,%msg:日志消息,%n換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <!--滾動策略按照時間滾動-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!-- rollover daily 文件名稱 -->
            <fileNamePattern>${DEV_FILE_PATH}/output-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- each file should be at most 10MB, keep 60 days worth of history, but at most 2GB -->
            <!--單個文件大小-->
            <maxFileSize>10MB</maxFileSize>
            <!--日志文件保留天數(shù)-->
            <maxHistory>60</maxHistory>
            <!--用來指定日志文件的上限大小,到了這個值就會刪除舊日志-->a
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <!-- 按照每天生成錯誤日志文件 -->
    <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 此日志文件只記錄ERROR級別的 -->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
        <!--輸出日志到src同級目錄logs中的error.log文件中-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--基于大小和時間的輪轉(zhuǎn)策略,當日志內(nèi)容超出文件大小限制后,會自動生成一個文件來繼續(xù)記錄和重命名-->
            <fileNamePattern>${DEV_FILE_PATH}/error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <!-- each file should be at most 10MB, keep 60 days worth of history, but at most 2GB -->
            <maxFileSize>10MB</maxFileSize>
            <maxHistory>60</maxHistory>
            <totalSizeCap>2GB</totalSizeCap>
        </rollingPolicy>
    </appender>

    <root level="INFO">
        <appender-ref ref="consoleAppender" />
        <appender-ref ref="fileAppender" />
        <appender-ref ref="errorAppender" />
    </root>

</configuration>

java中打印日志:

@SpringBootApplication
@Slf4j
public class LogbackApp {

    public static void main(String[] args) {
        SpringApplication.run(LogbackApp.class, args);

        log.trace("Trace 日志...");
        log.debug("Debug 日志...");
        log.info("Info 日志...");
        log.warn("Warn 日志...");
        log.error("Error 日志...");
    }
}

輸出結果:

SpringBoot官方建議使用logback-spring.xml作為logback框架的自定義日志配置文件,使用logback-spring.xml而不是logback.xml,因為帶-spring后綴的配置文件可以使用一些擴展的功能。

多環(huán)境輸出日志文件

Logback 配置文件中的 節(jié)點指令允許您根據(jù)配置文件激活參數(shù)(active) 選擇性的包含和排查部分配置信息。根據(jù)不同環(huán)境來定義不同的日志輸出,在 logback-spring.xml中使用 節(jié)點來定義,方法如下:

<!--開發(fā)環(huán)境:打印控制臺-->
    <springProfile name="dev">
        <root level="DEBUG">
            <appender-ref ref="consoleAppender" />
            <appender-ref ref="fileAppender" />
            <appender-ref ref="errorAppender" />
        </root>
    </springProfile>
 
    <!--生產(chǎn)環(huán)境:輸出到文件-->
    <springProfile name="prod">
        <root level="INFO">
            <appender-ref ref="consoleAppender" />
            <appender-ref ref="fileAppender" />
            <appender-ref ref="errorAppender" />
        </root>
    </springProfile>

配置文件添加配置項:

結果:

打印出了debug日志,說明dev的配置生效了。

讀取配置文件配置

本文通過讀取配置文件中的配置修改輸出的日志文件名來演示。

1.配置文件中添加配置項

2.logback-spring.xml中添加配置內(nèi)容如下:

<springProperty scope="context" name="logFileName" source="log.file.name"
        defaultValue="output"/>
  • scope: 使用范圍
  • name: 變量名
  • source: 讀取的配置項名
  • defaultValue: 默認名稱

3.通過${....}使用配置

4.結果,成功修改了輸出的日志文件名

文章代碼地址:https://github.com/alvinlkk/springboot-demo/tree/master/springboot-log-logback

以上就是SpringBoot應用自定義logback日志詳解的詳細內(nèi)容,更多關于SpringBoot應用自定義logback日志的資料請關注腳本之家其它相關文章!

相關文章

  • JDBC SQL語法

    JDBC SQL語法

    結構化查詢語言(SQL)是一種標準化的語言,它允許你在數(shù)據(jù)庫上執(zhí)行操作,如創(chuàng)建項目,讀取內(nèi)容,內(nèi)容更新和刪除條目
    2014-03-03
  • 如何解決@PutMapping或@PostMapping接收String類型參數(shù)多兩個“引號問題

    如何解決@PutMapping或@PostMapping接收String類型參數(shù)多兩個“引號問題

    這篇文章主要介紹了如何解決@PutMapping或@PostMapping接收String類型參數(shù)多兩個“引號問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-08-08
  • Java實現(xiàn)對象排序的兩種方式詳解

    Java實現(xiàn)對象排序的兩種方式詳解

    這篇文章主要介紹了Java實現(xiàn)對象排序的兩種方式詳解,在Java中經(jīng)常會涉及到對象數(shù)組的排序問題,則就提到對象之間的比較問題,今天我們就來看一下兩種不同排序方式之間的區(qū)別,需要的朋友可以參考下
    2023-09-09
  • 常用數(shù)據(jù)庫的驅(qū)動程序及JDBC URL分享

    常用數(shù)據(jù)庫的驅(qū)動程序及JDBC URL分享

    這篇文章主要介紹了常用數(shù)據(jù)庫的驅(qū)動程序及 JDBC URL,需要的朋友可以看下
    2014-01-01
  • Java中的原子類AtomicInteger使用詳解

    Java中的原子類AtomicInteger使用詳解

    這篇文章主要介紹了Java中的原子類AtomicInteger使用詳解,原子操作是指不會被線程調(diào)度機制打斷的操作,這種操作一旦開始,就一直運行到結束,中間不會有任何線程上下文切換,需要的朋友可以參考下
    2023-12-12
  • Java常用加密算法實例總結

    Java常用加密算法實例總結

    這篇文章主要介紹了Java常用加密算法,結合實例形式總結分析了base64、md5、sha、rsa、des等加密算法實現(xiàn)技巧,需要的朋友可以參考下
    2017-10-10
  • 關于Java虛擬機HotSpot

    關于Java虛擬機HotSpot

    這篇文章主要介紹了關于Java虛擬機HotSpot,在Java類中的一些方法會被由C/C++編寫的HotSpot虛擬機的C/C++函數(shù)調(diào)用,不過由于Java方法與C/C++函數(shù)的調(diào)用約定不同,所以并不能直接調(diào)用,需要JavaCalls::call()這個函數(shù)輔助調(diào)用,下面我們來看看文章對內(nèi)容的具體介紹
    2021-11-11
  • 詳解Spring Data JPA中Repository的接口查詢方法

    詳解Spring Data JPA中Repository的接口查詢方法

    repository代理有兩種方式從方法名中派生出特定存儲查詢:通過直接從方法名派生查詢和通過使用一個手動定義的查詢。本文將通過示例詳細講解Spring Data JPA中Repository的接口查詢方法,需要的可以參考一下
    2022-04-04
  • springboot 實現(xiàn)Http接口加簽、驗簽操作方法

    springboot 實現(xiàn)Http接口加簽、驗簽操作方法

    這篇文章主要介紹了springboot 實現(xiàn)Http接口加簽、驗簽操作,服務之間接口調(diào)用,通過簽名作為安全認證來保證API的安全性,本文結合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-09-09
  • idea配置多環(huán)境啟動方式dev、test、prod

    idea配置多環(huán)境啟動方式dev、test、prod

    這篇文章主要介紹了idea配置多環(huán)境啟動方式dev、test、prod,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評論