Spring5.x與日志框架的整合


一、spring整合logback

logback介紹

(1)、根節點<configuration>有三個屬性debug 、scan 、scanPeriod 

  • debug : 默認為false ,設置為true時,將打印出logback內部日志信息,實時查看logback運行狀態。
  • scan : 配置文件如果發生改變,將會重新加載,默認值為true。
  • scanPeriod : 檢測配置文件是否有修改的時間間隔,如果沒有給出時間單位,默認單位時毫秒,當scan為true時,這個屬性生效,默認時間間隔為1min。

<configuration>有<appender>、<logger>、<root>三個子節點。

基本結構可以描述為:以<configuration>開頭,后面有零個或多個<appender>元素,有零個或多個<logger>元素,有最多一個<root>元素

(2)、<appender> 是負責寫日志的組件。

appender 有兩個必要屬性 name ,class 。name指定appender 的名稱, class 指定appender的全限定名
class 包括 :ch.qos.logback.core.ConsoleAppender / ch.qos.logback.core.FileAppender/ ch.qos.logback.core.RollingFileAppender。

  • ConsoleAppender:把日志添加到控制台
    • <encoder> : 對日志進行格式化。
    • <target> : 字符串System.out 或者 System.err, 默認 System.out;
  • FileAppender:把日志添加到文件
    • <file>: 被寫入的文件名,可以是相對目錄 , 也可以是絕對目錄 , 如果目錄不存在則會自動創建
    • <append> : 如果是true , 日志被追加到文件結尾 , 如果是false,清空現存文件 , 默認是true
    • <encoder> : 對日志進行格式化
    • <prodent> : 如果是true,日志會被安全的寫入文件 , 即使其他的FileAppender也會向此文件做寫入操作 , 默認是false
  • RollingFileAppender [常用]:滾動記錄文件,先將日志記錄到指定文件,當符合某種條件時,將日志記錄到其他文件
    • <file> : 被寫入的文件名,可以是相對目錄,也可以解決目錄,如果目錄不存在則自動創建。
    • <append> : 如果是true,日志被追加到文件結尾,如果是false,清空現存文件,默認是true;
    • <encoder> : 對日志進行格式化
    • <rollingPolicy> : 當發生滾動時,決定 RollingFileAppender 的行為,涉及文件移動和重命名。
      • TimeBaseRollingPolicy :最常用的滾動策略,根據時間來制定滾動策略,即負責滾動也負責觸發滾動。
        • <fileNamePattern> :必要節點,包含文件及“%d” 轉換符,“%d”可以包含一個java.text.SimpleDateFormat 制定的時間格式,如:%d{yyyy-MM},如果直接使用 %d ,默認格式是 yyyy-MM-dd。必須包含“%i” 例如:設置最小值,和最大值分別為1和2,命名模式為 log%i.log,會產生歸檔文件log1.log和log2.log,還可以指定文件壓縮選項,例如:log%i.log.gz 或者 log%i.log.zip
        • <maxHistory>:可選節點,控制保留的歸檔文件的最大數量,超出數量就刪除舊文件,假設設置每個月滾動,且<maxHistory> 是6,則只保存最近6個月的文件,刪除之前的舊文件,注意:刪除舊文件是哪些為了歸檔而創建的目錄也會被刪除。
        • <triggeringPolicy> :告知RollingFileAppender   激活RollingFileAppender滾動
      • SizeBasedTriggeringPolicy :查看當前活動文件的大小 , 如果超過指定大小會告知 RollingFileAppender , 觸發當前活動滾動 , 只有一個節點 , 用來規定文件大小
        • <maxFileSize> : 活動文件的大小 , 默認10MB

(3) logger節點用來設置某一個包或者具體的某一個類的日志打印級別,以及指定<appender>, logger 僅有一個name屬性,兩個可選屬性 level/addtivity 。

  • name : 用來指定受此loger約束的某一個包或者具體的某一個類
  • level:用來設置打印級別,大小寫無關,TRACE,DEBUG,INFO,WARE,ERROR,ALL和OFF,還有一個特殊值INHERITED 或者 同義詞NULL,代表強制執行上級的級別。
    • 如果未設置此屬性,那么當前logger將會繼承上級的級別。
    • level大小:ERROR > WARN > INFO > DEBUG > TRACE,程序會打印高於或等於所設置級別的日志。
  • addtivity : 是否向上級loger傳遞打印信息,默認為true;

<logger> 可以包含零個或多個<appender-ref>元素,表示這個appender將會添加到logger。 

(4)、root節點:元素配置根 logger。該元素有一個 level 屬性。沒有 name 屬性,因為已經被命名 為“root”

level 屬性的值大小寫無關,其值為下面其中一個字符串:TRACE、DEBUG、INFO、 WARN、ERROR、ALL 和 OFF。注意不能設置為“INHERITED” 或“NULL”。 元素可以包含零個或多個元素。與元素類似,聲明 元素后,會先關閉然后移除全部當前 appender,只引用聲明了的 appender。如果 root 元素沒 有引用任何 appender,就會失去所有 appender。 

(5)、filter過濾節點

Logback 的過濾器基於三值邏輯(ternary logic),允許把它們組裝或成鏈,從而組成任 意的復合過濾策略。

這里的所謂三值邏輯是說,過濾器的返回值只能是 ACCEPT、DENY 和 NEUTRAL 的其中一個。

過濾器一般分為如下幾類 :

  • 級別過濾器(LevelFilter):LevelFilter 根據記錄級別對記錄事件進行過濾。如果事件的級別等於配置的級別,過濾器會根據 onMatch 和 onMismatch 屬性接受或拒絕事件。
  • 臨界值過濾器(ThresholdFilter):ThresholdFilter 過濾掉低於指定臨界值的事件 . 當記錄的級別等於或高於臨界值時 , ThresholdFilter 的decide()方法會返回NEUTRAL ; 當記錄級別低於臨界值時 , 事件會被拒絕。
  • 求值過濾器(EvaluatorFilter):EvaluatorFilter 封裝了 EventEvaluator(ch.qos.logback.core.boolex.EventEvaluator) , 評估 是否符合指定的條件。
添加logback依賴
<!-- 日志文件管理包 -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.logback-extensions</groupId>
    <artifactId>logback-ext-spring</artifactId>
    <version>0.1.5</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>jcl-over-slf4j</artifactId>
    <version>1.7.30</version>
</dependency>
<!-- 日志文件管理包 -->

logback-classic:包含了logback本身所需的slf4j-api.jar、logback-core.jar及logback-classsic.jar。 

logback-ext-spring:由官方提供的對Spring的支持,它的作用就相當於log4j中的Log4jConfigListener。

jcl-over-slf4j:用來把Spring源代碼中大量使用到的commons-logging替換成slf4j,只有在添加了這個依賴之后才能看到Spring框架本身打印的日志–即info文件中打印出的spring啟動日志信息,否則只能看到開發者自己打印的日志。

掃描xml

盡量的在pom的build標簽中加入如下內容,以掃描到logback.xml文件。

<build>
        <!--掃描全局xml, 以便掃描到相關配置文件-->
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.xml</include>
                    <include>**/*.properties</include>
                </includes>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>
引入logback.xml日志配置文件

這里特別注意引入位置(maven工程)在src/main/resource這個根目錄下。

logback.xml配置信息

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <!-- 模塊名 -->
    <contextName>OS_PRO</contextName>

    <!--定義日志文件的存儲地址 logs為當前項目的logs目錄 還可以設置為../logs -->
    <property name="LOG_HOME" value="logs" />

    <!--控制台日志, 控制台輸出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <fileNamePattern>${LOG_HOME}/error-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志文件保留天數-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        <!-- 過濾掉 低於ERROR級別的-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>WARN</level>
        </filter>
    </appender>

    <!--文件日志, 按照每天生成日志文件 -->
    <appender name="FILE_DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件輸出的文件名-->
            <fileNamePattern>${LOG_HOME}/debugAndInfo-%d{yyyy-MM-dd}.log</fileNamePattern>
            <!--日志文件保留天數-->
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        <!-- 過濾掉 低於DEBUG級別的-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>DEBUG</level>
        </filter>
    </appender>

    <!-- spring及apache-->
    <logger name="org.springframework" level="INFO" />
    <logger name="org.apache.http" level="INFO" />

    <!-- show parameters for hibernate sql 專為 Hibernate 定制 -->
    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
    <logger name="org.hibernate.SQL" level="DEBUG" />
    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

    <!-- mybatis log configure-->
    <logger name="com.apache.ibatis" level="TRACE"/>
    <logger name="java.sql.Connection" level="DEBUG"/>
    <logger name="java.sql.Statement" level="DEBUG"/>
    <logger name="java.sql.PreparedStatement" level="DEBUG"/>

    <!--日志的輸出級別由低到高(越來問題越嚴重)trace->debug->info->warn->error -->
    <!-- 日志輸出級別 生成上禁止DEBUG, 至少INFO級別-->
    <root level="INFO">
        <!-- 生產上 STDOUT 要注釋掉 -->
        <appender-ref ref="STDOUT" />
        <appender-ref ref="FILE_DEBUG"/>
        <appender-ref ref="FILE_ERROR"/>
    </root>
</configuration>

這樣使用:

private static Logger logger = LoggerFactory.getLogger(當前類.class);

二、spring整合log4j

log4j介紹
關於配置文件的名稱以及在項目中的存放位置

log4j 2.x版本不再支持像1.x中的.properties后綴的文件配置方式,2.x版本配置文件后綴名只能為".xml",".json"或者".jsn"。

系統選擇配置文件的優先級(從先到后)如下:

(1)、classpath下的名為log4j2-test.json 或者log4j2-test.jsn的文件.

(2)、classpath下的名為log4j2-test.xml的文件.

(3)、classpath下名為log4j2.json 或者log4j2.jsn的文件.

(4)、classpath下名為log4j2.xml的文件.

我們一般默認使用log4j2.xml進行命名。如果本地要測試,可以把log4j2-test.xml放到classpath,而正式環境使用log4j2.xml,則在打包部署的時候不要打包log4j2-test.xml即可。

缺省默認配置文件
<?xml version="1.0" encoding="UTF-8"?>
 <Configuration status="WARN">
   <Appenders>
     <Console name="Console" target="SYSTEM_OUT">
       <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
     </Console>
   </Appenders>
   <Loggers>
     <Root level="error">
       <AppenderRef ref="Console"/>
     </Root>
   </Loggers>
 </Configuration>
配置文件節點解析

(1)、根節點Configuration有兩個屬性:status和monitorinterval,有兩個子節點:Appenders和Loggers(表明可以定義多個Appender和Logger)。

  • status用來指定log4j本身的打印日志的級別。
  • monitorinterval用於指定log4j自動重新配置的監測間隔時間,單位是s,最小是5s。

(2)、Appenders節點,常見的有三種子節點:Console、RollingFile、File

  • Console節點用來定義輸出到控制台的Appender
    • name:指定Appender的名字。
    • target:SYSTEM_OUT 或 SYSTEM_ERR,一般只設置默認SYSTEM_OUT。
    • PatternLayout:輸出格式,不設置默認為:%m%n.
  • File節點用來定義輸出到指定位置的文件的Appender
    • name:指定Appender的名字。
    • fileName:指定輸出日志的目的文件帶全路徑的文件名。
    • PatternLayout:輸出格式,不設置默認為:%m%n。
  • RollingFile節點用來定義超過指定大小自動刪除舊的創建新的的Appender
    • name:指定Appender的名字.
    • fileName:指定輸出日志的目的文件帶全路徑的文件名.
    • PatternLayout:輸出格式,不設置默認為:%m%n.
    • filePattern:指定新建日志文件的名稱格式.
    • Policies:指定滾動日志的策略,就是什么時候進行新建日志文件輸出日志
      • TimeBasedTriggeringPolicy:Policies子節點,基於時間的滾動策略,interval屬性用來指定多久滾動一次,默認是1hour。modulate=true用來調整時間:比如現在是早上3am,interval是4,那么第一次滾動是在4am,接着是8am,12am...而不是7am。
      • SizeBasedTriggeringPolicy:Policies子節點,基於指定文件大小的滾動策略,size屬性用來定義每個日志文件的大小。
    • DefaultRolloverStrategy:用來指定同一個文件夾下最多有幾個日志文件時開始刪除最舊的,創建新的(通過max屬性)。

(3)、Loggers節點,常見的有兩種:Root和Logger。

  • Root節點用來指定項目的根日志,如果沒有單獨指定Logger,那么就會默認使用該Root日志輸出。
    • level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
    • AppenderRef:Root的子節點,用來指定該日志輸出到哪個Appender.
  • Logger節點用來單獨指定日志的形式,比如要為指定包下的class指定不同的日志級別等。
    • level:日志輸出級別,共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF.
    • name:用來指定該Logger所適用的類或者類所在的包全路徑,繼承自Root節點.
    • AppenderRef:Logger的子節點,用來指定該日志輸出到哪個Appender,如果沒有指定,就會默認繼承自Root.如果指定了,那么會在指定的這個Appender和Root的Appender中都會輸出,此時我們可以設置Logger的additivity="false"只在自定義的Appender中進行輸出。

(4)、關於日志level。

共有8個級別,按照從低到高為:All < Trace < Debug < Info < Warn < Error < Fatal < OFF。

  • All:最低等級的,用於打開所有日志記錄.
  • Trace:是追蹤,就是程序推進以下,你就可以寫個trace輸出,所以trace應該會特別多,不過沒關系,我們可以設置最低日志級別不讓他輸出.
  • Debug:指出細粒度信息事件對調試應用程序是非常有幫助的.
  • Info:消息在粗粒度級別上突出強調應用程序的運行過程.
  • Warn:輸出警告及warn以下級別的日志.
  • Error:輸出錯誤信息日志.
  • Fatal:輸出每個嚴重的錯誤事件將會導致應用程序的退出的日志.
  • OFF:最高等級的,用於關閉所有日志記錄.

程序會打印高於或等於所設置級別的日志,設置的日志等級越高,打印出來的日志就越少。

引入log4j依賴
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-slf4j-impl</artifactId>
    <version>2.14.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.14.0</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.14.0</version>
</dependency>
log4j.xml配置信息

在src/main/resource這個根目錄下創建,比較完整的內容如下:

<?xml version="1.0" encoding="UTF-8"?>
<!--日志級別以及優先級排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--Configuration后面的status,這個用於設置log4j2自身內部的信息輸出,可以不設置,當設置成trace時,你會看到log4j2內部各種詳細輸出-->
<!--monitorInterval:Log4j能夠自動檢測修改配置 文件和重新配置本身,設置間隔秒數-->
<configuration status="WARN" monitorInterval="30">
    <!--先定義所有的appender-->
    <appenders>
        <!--這個輸出控制台的配置-->
        <console name="Console" target="SYSTEM_OUT">
            <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日志消息,%n是換行符-->
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
        </console>
        <!--文件會打印出所有信息,這個log每次運行程序會自動清空,由append屬性決定,這個也挺有用的,適合臨時測試用-->
        <File name="log" fileName="logs/test.log" append="false">
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
        </File>
        <!-- 這個會打印出所有的info及以下級別的信息,每次大小超過size,則這size大小的日志會自動存入按年份-月份建立的文件夾下面並進行壓縮,作為存檔-->
        <RollingFile name="RollingFileInfo" fileName="./logs/info.log"
                     filePattern="${sys:user.home}/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">
            <!--控制台只輸出level及以上級別的信息(onMatch),其他的直接拒絕(onMismatch)-->
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>

        </RollingFile>
        <RollingFile name="RollingFileWarn" fileName="./logs/debug.log"
                     filePattern="./logs/$${date:yyyy-MM}/debug-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
            <!-- DefaultRolloverStrategy屬性如不設置,則默認為最多同一文件夾下7個文件,這里設置了20 -->
            <DefaultRolloverStrategy max="20"/>
        </RollingFile>
        <RollingFile name="RollingFileError" fileName="./logs/error.log"
                     filePattern="./logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">
            <ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="100 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <!--然后定義logger,只有定義了logger並引入的appender,appender才會生效-->
    <loggers>
        <!--過濾掉spring和mybatis的一些無用的DEBUG信息-->
        <logger name="org.springframework" level="INFO"></logger>
        <logger name="org.mybatis" level="INFO"></logger>
        <root level="all">
            <appender-ref ref="Console"/>
            <appender-ref ref="RollingFileInfo"/>
            <appender-ref ref="RollingFileWarn"/>
            <appender-ref ref="RollingFileError"/>
        </root>
    </loggers>
</configuration>

使用方法:

private static final Logger log = LoggerFactory.getLogger(當前類.class);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM