[Log]配置Logback

今天翻筆記的時候突然翻到一個文檔, 上面是logback的相關內(nèi)容,也不知道從哪里搞的,貼到這里吧;噶昂才看到一篇比較好的關于logback的文章,帖在這里吧

一、logback的簡介

  • logback當前分成三個模塊:
    1. logback-core是其它兩個模塊的基礎模塊;
    2. logback-classic是log4j的一個 改良版本。此外logback-classic完整實現(xiàn)SLF4J API使你可以很方便地更換成其它日志系統(tǒng)如log4j或JDK14 Logging;
    3. logback-access訪問模塊與Servlet容器集成提供通過Http來訪問日志的功能;

二、logback的使用

  1. 添加依賴(logback-access.jar用到的時候再添加;實際上引用logback-classic即可,依賴的庫會被maven自動導入):

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>${slf4j.version}</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
        <version>${logback.version}</version>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-classic</artifactId>
        <version>${logback.version}</version>
    </dependency>
    
  2. 添加配置文件,下面是我項目中用到的,做了詳細的注釋:

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!-- 
    根節(jié)點configuration:
        - 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">
    
        <!-- property:用來定義變量值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使"${}"來獲取變量。-->
        <!-- 應用名稱 -->
        <property name="APP_NAME" value="<app-name>" />
        <!-- 日志輸出格式: [%d{HH:mm:ss.SSS}][%p][%c{40}][%t] %m%n -->
        <property name="ENCODER_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{80} - %msg%n" />
        <!--日志文件的保存路徑,首先查找系統(tǒng)屬性-Dlog.dir,如果存在就使用其;否則,在當前目錄下創(chuàng)建名為logs目錄做日志存放的目錄 -->
        <property name="LOG_HOME" value="${log.dir:-logs}/${APP_NAME}" />
        <property name="MAX_HISTORY" value="1" />
        
        <!-- contextName: 用來設置上下文名稱,每個logger都關聯(lián)到logger上下文,默認上下文名稱為default。
        但可以使用<contextName>設置成其他名字,用于區(qū)分不同應用程序的記錄。一旦設置,不能修改。-->
      <contextName>${APP_NAME}</contextName>
    
        <!-- timestamp:獲取時間戳字符串,他有兩個屬性key和datePattern
        key: 標識此<timestamp> 的名字;
        datePattern: 設置將當前時間(解析配置文件的時間)轉換為字符串的模式,遵循java.txt.SimpleDateFormat的格式。
        <timestamp key="XMLParseTime" datePattern="yyyyMMdd'T'HHmmss"/>
        -->
        
        <!-- appender:負責寫日志的組件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名 -->
        <!-- ConsoleAppender 把日志輸出到控制臺 -->
        <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
            <encoding>UTF-8</encoding>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <Pattern>${ENCODER_PATTERN}</Pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>DEBUG</level>
            </filter>
        </appender>
        
        <!-- 各種Appender:
        1. FileAppender:把日志添加到文件,有以下子節(jié)點:
            - <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。
            - <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。
            - <encoder>:對記錄事件進行格式化。負責兩件事,一是把日志信息轉換成字節(jié)數(shù)組,二是把字節(jié)數(shù)組寫入到輸出流。
                * PatternLayoutEncoder 是唯一有用的且默認的encoder ,有一個<pattern>節(jié)點,用來設置日志的輸入格式。
                    使用"%"加"轉換符"方式,如果要輸出"%",則必須用"\"對"\%"進行轉義。
          * <prudent>:如果是 true,日志會被安全的寫入文件,即使其他的FileAppender也在向此文件做寫入操作,效率低,默認是 false。
        -->
        <!-- 
        2. RollingFileAppender:滾動記錄文件,先將日志記錄到指定文件,當符合某個條件時,將日志記錄到其他文件。有以下子節(jié)點:
            - <file>:被寫入的文件名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動創(chuàng)建,沒有默認值。
            - <append>:如果是 true,日志被追加到文件結尾,如果是 false,清空現(xiàn)存文件,默認是true。
            - <rollingPolicy>:當發(fā)生滾動時,決定RollingFileAppender的行為,涉及文件移動和重命名。屬性class定義具體的滾動策略類:
                * class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滾動策略,它根據(jù)時間來制定滾動策略,既負責滾動也負責出發(fā)滾動。有以下子節(jié)點:
                    ~ <fileNamePattern>:必要節(jié)點,包含文件名及"%d"轉換符,"%d"可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
                        如果直接使用 %d,默認格式是 yyyy-MM-dd。RollingFileAppender的file子節(jié)點可有可無,通過設置file,可以為活動文件和歸檔文件指定不同位置,
                        當前日志總是記錄到file指定的文件(活動文件),活動文件的名字不會改變;如果沒設置file,活動文件的名字會根據(jù)fileNamePattern 的值,每隔一段時間改變一次。
                        "/"或者"\"會被當做目錄分隔符。
                    ~ <maxHistory>:可選節(jié)點,控制保留的歸檔文件的最大數(shù)量,超出數(shù)量就刪除舊文件。假設設置每個月滾動,且<maxHistory>是6,則只保存最近6個月的文件,刪除之前的舊文件。
                        注意,刪除舊文件時,那些為了歸檔而創(chuàng)建的目錄也會被刪除。
    
                * class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 查看當前活動文件的大小,如果超過指定大小會告知RollingFileAppender觸發(fā)當前活動文件滾動。只有一個節(jié)點:
                <maxFileSize>:這是活動文件的大小,默認值是10MB。
                * <prudent>:當為true時,不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy,但是有兩個限制,1不支持也不允許文件壓縮,2不能設置file屬性,必須留空。
    
          * <triggeringPolicy>: 告知 RollingFileAppender何時激活滾動。
                    * class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據(jù)固定窗口算法重命名文件的滾動策略。有以下子節(jié)點:
                        ~ <minIndex>:窗口索引最小值
                        ~ <maxIndex>:窗口索引最大值,當用戶指定的窗口過大時,會自動將窗口設置為12。
                        ~ <fileNamePattern>:
                        必須包含"%i",例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產(chǎn)生歸檔文件mylog1.log和mylog2.log。
                        還可以指定文件壓縮選項,例如,mylog%i.log.gz 或者 沒有l(wèi)og%i.log.zip
        其他的Appender(SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender)參考官方文檔:
            http://logback.qos.ch/documentation.html
        -->
        
        <!-- 文件日志:輸出全部日志到文件 -->
        <appender name="ALL_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/${APP_NAME}.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>${MAX_HISTORY}</maxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${ENCODER_PATTERN}</pattern>
            </encoder>
        </appender>
        
        <!-- 警告日志:用于將警告界別以上的日志輸出到獨立文件 -->
        <appender name="WARNING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${LOG_HOME}/warning.%d{yyyy-MM-dd}.log</fileNamePattern>
                <maxHistory>${MAX_HISTORY}</maxHistory>
            </rollingPolicy>
            <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                <pattern>${ENCODER_PATTERN}</pattern>
            </encoder>
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>WARN</level>
            </filter>
        </appender>
        
        <!-- 
        logger:用來設置某一個包或具體的某一個類的日志打印級別、以及指定<appender>。<logger>僅有一個name必選屬性,一個可選的level和一個可選的addtivity屬性。
            可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger
            name: 用來指定受此logger約束的某一個包或者具體的某一個類。
            level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,
                還有一個特俗值INHERITED或者同義詞NULL,代表強制執(zhí)行上級的級別。如果未設置此屬性,那么當前l(fā)ogger將會繼承上級的級別。
            addtivity: 是否向上級logger傳遞打印信息。默認是true。同<logger>一樣,可以包含零個或多個<appender-ref>元素,標識這個appender將會添加到這個logger。
        -->
        <logger name="<package-name>" additivity="false" level="DEBUG" >
            <appender-ref ref="ALL_FILE"/>
        </logger>
    
        <!-- mybatis log 日志 -->
        <logger name="org.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" />
        
        <!-- 
        <root>: 是所有<logger>的上級, 只有一個level屬性
            level: 用來設置打印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設置為INHERITED或者同義詞NULL。默認是DEBUG。
        -->
        <root level="DEBUG">
            <appender-ref ref="STDOUT"/>
            <appender-ref ref="ALL_FILE"/>
            <appender-ref ref="WARNING_FILE"/>
        </root>
    
    </configuration>
    
  3. 在代碼中就可以使用Logger了

    public class LogBackTest{    
      private final static Logger logger = LoggerFactory.getLogger(LogBackTest.class);    
        public static void main(String[] args) {
          logger.info("logback 成功了");
          logger.error("logback 成功了");
                          logger.debug("logback 成功了");
                  }    
    }
    

三、logback的常用配置

  1. 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" />
    
  2. MyBatis專屬配置

    <logger name="org.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"/>
    
  3. 常用的logback.xml

    • 開發(fā)環(huán)境的配置:
      <?xml version="1.0" encoding="UTF-8"?>
      
      <!--
          開發(fā)環(huán)境的日志輸出配置
       -->
      <configuration debug="true">
          
          <property name="LOG_HOME" value="${catalina.base}/logs" />
          <property name="MESSAGE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
          
          <appender name="LOG_STDOUT" class="ch.qos.logback.core.ConsoleAppender">
              <encoder>
                  <pattern>${MESSAGE_PATTERN}</pattern>
                  <charset>UTF-8</charset>
              </encoder>
          </appender>
          
          <logger name="java.sql.Connection" level="DEBUG" />
          <logger name="java.sql.Statement" level="DEBUG" />
          <logger name="java.sql.PreparedStatement" level="DEBUG" />
          <logger name="org.apache.ibatis" level="TRACE" />
          
          <root level="DEBUG">
              <appender-ref ref="LOG_STDOUT" />
          </root>
      
      </configuration>
      
    • 線上環(huán)境的配置:
      <?xml version="1.0" encoding="UTF-8"?>
      
      <!--
          生產(chǎn)環(huán)境的日志輸出配置
       -->
      <configuration debug="true">
          
          <property name="LOG_HOME" value="${catalina.base}/logs" />
          <property name="MESSAGE_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
          
          <!-- 日志記錄器,日期滾動記錄 -->
          <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
              <file>${LOG_HOME}/inquiry_current.log</file>
              <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
                  <fileNamePattern>${LOG_HOME}/inquiry_%d{yyyy-MM-dd}_%i.log</fileNamePattern>
                  <maxFileSize>50MB</maxFileSize>
                  <maxHistory>30</maxHistory>
              </rollingPolicy>
              <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
                  <pattern>${MESSAGE_PATTERN}</pattern>
                  <charset>utf-8</charset>
              </encoder>
          </appender>
          
          <logger name="java.sql.Connection" level="DEBUG" />
          <logger name="java.sql.Statement" level="DEBUG" />
          <logger name="java.sql.PreparedStatement" level="DEBUG" />
          <logger name="org.apache.ibatis" level="TRACE" />
          
          <root level="DEBUG">
              <appender-ref ref="LOG_FILE" />
          </root>
      
      </configuration>
      
      • 需要注意的是,文件名規(guī)則中%d和%i都是不可或缺的部分,如果少了這些配置,日志就會不正常,如:少了%i,就會導致文件到了50M就不會再生成新的文件了...
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容