1. 程式人生 > >java 日誌 logback-spring.xml 檔案配置

java 日誌 logback-spring.xml 檔案配置

 

maven配置:

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-access</artifactId>
    <version>1.1.7</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.1.7</version>
</dependency>

logback.xml配置:

<!-- 級別從高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日誌輸出規則 根據當前ROOT 級別,日誌輸出時,級別高於root預設的級別時 會輸出 -->
<!-- 以下 每個配置的 filter 是過濾掉輸出檔案裡面,會出現高級別檔案,依然出現低級別的日誌資訊,通過filter 過濾只記錄本級別的日誌 -->
<!-- scan 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。 -->
<!-- scanPeriod 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。 -->
<!-- debug 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 動態日誌級別 -->
    <jmxConfigurator />
    <!-- 定義日誌檔案 輸出位置 -->
    <!-- <property name="log_dir" value="f:/home/log" />-->
    <property name="log_dir" value="/home/hadmin/data/logs/src" />
    <!-- 日誌最大的歷史 30天 -->
    <property name="maxHistory" value="30" />

    <!-- ConsoleAppender 控制檯輸出日誌 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>
                <!-- 設定日誌輸出格式 -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- ERROR級別日誌 -->
    <!-- 滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案 RollingFileAppender -->
    <appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄WARN級別的日誌 -->
        <!-- 果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 設定過濾級別 -->
            <level>ERROR</level>
            <!-- 用於配置符合過濾條件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用於配置不符合過濾條件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <!-- 最常用的滾動策略,它根據時間來制定滾動策略.既負責滾動也負責出發滾動 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌輸出位置 可相對、和絕對路徑 -->
            <fileNamePattern>
                ${log_dir}/error/%d{yyyy-MM-dd}/error-log.log
            </fileNamePattern>
            <!-- 可選節點,控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案假設設定每個月滾動,且<maxHistory>是6, 則只儲存最近6個月的檔案,刪除之前的舊檔案。注意,刪除舊檔案是,那些為了歸檔而建立的目錄也會被刪除 -->
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>
                <!-- 設定日誌輸出格式 -->
                %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n
            </pattern>
        </encoder>
    </appender>

    <!-- WARN級別日誌 appender -->
    <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 過濾器,只記錄WARN級別的日誌 -->
        <!-- 果日誌級別等於配置級別,過濾器會根據onMath 和 onMismatch接收或拒絕日誌。 -->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 設定過濾級別 -->
            <level>WARN</level>
            <!-- 用於配置符合過濾條件的操作 -->
            <onMatch>ACCEPT</onMatch>
            <!-- 用於配置不符合過濾條件的操作 -->
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日誌輸出位置 可相對、和絕對路徑 -->
            <fileNamePattern>${log_dir}/warn/%d{yyyy-MM-dd}/warn-log.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- INFO級別日誌 appender -->
    <appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}/info-log.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- DEBUG級別日誌 appender -->
    <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>DEBUG</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_dir}/debug/%d{yyyy-MM-dd}/debug-log.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- TRACE級別日誌 appender -->
    <appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>TRACE</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log_dir}/trace/%d{yyyy-MM-dd}/trace-log.log</fileNamePattern>
            <maxHistory>${maxHistory}</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- root級別 DEBUG -->
    <root>
        <!-- 列印debug級別日誌及以上級別日誌 -->
        <level value="debug" />
        <!-- 控制檯輸出 -->
        <appender-ref ref="console" />
        <!-- 檔案輸出 -->
        <appender-ref ref="ERROR" />
        <appender-ref ref="INFO" />
        <appender-ref ref="WARN" />
        <appender-ref ref="DEBUG" />
        <appender-ref ref="TRACE" />
    </root>
</configuration>

logback.xml常用配置詳解

 

  • (1) 根節點<configuration>,包含下面三個屬性:

    scan: 當此屬性設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
    scanPeriod: 設定監測配置檔案是否有修改的時間間隔,如果沒有給出時間單位,預設單位是毫秒。當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
    debug: 當此屬性設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。預設值為false。
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration> 
  • (2) 子節點<contextName>:用來設定上下文名稱,每個logger都關聯到logger上下文,預設上下文名稱為default。但可以使用<contextName>設定成其他名字,用於區分不同應用程式的記錄。一旦設定,不能修改。

  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
     <contextName>myAppName</contextName> 
    <!--其他配置省略-->
</configuration>    
  • (3) 子節點<property> :用來定義變數值,它有兩個屬性name和value,通過<property>定義的值會被插入到logger上下文中,可以使“${}”來使用變數。

    name: 變數的名稱
    value: 的值時變數定義的值
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
   <property name="APP_Name" value="myAppName" /> 
   <contextName>${APP_Name}</contextName> 
   <!--其他配置省略--> 
</configuration>
  • (4) 子節點<timestamp>:獲取時間戳字串,他有兩個屬性key和datePattern

    key: 標識此<timestamp> 的名字;
    datePattern: 設定將當前時間(解析配置檔案的時間)轉換為字串的模式,遵循java.txt.SimpleDateFormat的格式。
  例如:

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
      <timestamp key="bySecond" datePattern="yyyyMMdd'T'HHmmss"/> 
      <contextName>${bySecond}</contextName> 
      <!-- 其他配置省略--> 
    </configuration>
  • (5) 子節點<appender>:負責寫日誌的元件,它有兩個必要屬性name和class。name指定appender名稱,class指定appender的全限定名

    5.1、ConsoleAppender 把日誌輸出到控制檯,有以下子節點:
      <encoder>:對日誌進行格式化。(具體引數稍後講解 )
      <target>:字串System.out(預設)或者System.err(區別不多說了)
    例如:

<configuration> 
   <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
      <encoder> 
         <pattern>%-4relative [%thread] %-5level %logger{35} - %msg %n</pattern> 
      </encoder> 
   </appender> 

   <root level="DEBUG"> 
      <appender-ref ref="STDOUT" /> 
   </root> 
</configuration>

    上述配置表示把>=DEBUG級別的日誌都輸出到控制檯

    5.2、FileAppender:把日誌新增到檔案,有以下子節點:
      <file>:被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
      <append>:如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
      <encoder>:對記錄事件進行格式化。(具體引數稍後講解 )
      <prudent>:如果是 true,日誌會被安全的寫入檔案,即使其他的FileAppender也在向此檔案做寫入操作,效率低,預設是 false。
    例如:

<configuration> 
      <appender name="FILE" class="ch.qos.logback.core.FileAppender"> 
        <file>testFile.log</file> 
        <append>true</append> 
        <encoder> 
          <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
        </encoder> 
      </appender> 

      <root level="DEBUG"> 
      <appender-ref ref="FILE" /> 
      </root> 
    </configuration>

    上述配置表示把>=DEBUG級別的日誌都輸出到testFile.log

    5.3、RollingFileAppender:滾動記錄檔案,先將日誌記錄到指定檔案,當符合某個條件時,將日誌記錄到其他檔案。有以下子節點:
      <file>:被寫入的檔名,可以是相對目錄,也可以是絕對目錄,如果上級目錄不存在會自動建立,沒有預設值。
      <append>:如果是 true,日誌被追加到檔案結尾,如果是 false,清空現存檔案,預設是true。
      <rollingPolicy>:當發生滾動時,決定RollingFileAppender的行為,涉及檔案移動和重新命名。屬性class定義具體的滾動策略類
      class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy": 最常用的滾動策略,它根據時間來制定滾動策略,既負責滾動也負責出發滾動。有以下子節點:
        <fileNamePattern>:必要節點,包含檔名及“%d”轉換符,“%d”可以包含一個java.text.SimpleDateFormat指定的時間格式,如:%d{yyyy-MM}。
如果直接使用 %d,預設格式是 yyyy-MM-dd。RollingFileAppender的file位元組點可有可無,通過設定file,可以為活動檔案和歸檔檔案指定不同位置,當前日誌總是記錄到file指定的檔案(活動檔案),活動檔案的名字不會改變;
如果沒設定file,活動檔案的名字會根據fileNamePattern 的值,每隔一段時間改變一次。“/”或者“\”會被當做目錄分隔符。
        <maxHistory>:
可選節點,控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案。假設設定每個月滾動,且<maxHistory>是6,則只儲存最近6個月的檔案,刪除之前的舊檔案。注意,刪除舊檔案是,那些為了歸檔而建立的目錄也會被刪除。

      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy": 檢視當前活動檔案的大小,如果超過指定大小會告知RollingFileAppender 觸發當前活動檔案滾動。只有一個節點:
        <maxFileSize>:這是活動檔案的大小,預設值是10MB。
        <prudent>:當為true時,不支援FixedWindowRollingPolicy。支援TimeBasedRollingPolicy,但是有兩個限制,1不支援也不允許檔案壓縮,2不能設定file屬性,必須留空。

      <triggeringPolicy >: 告知 RollingFileAppender 合適啟用滾動。
      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy" 根據固定視窗演算法重新命名檔案的滾動策略。有以下子節點:
        <minIndex>:視窗索引最小值
        <maxIndex>:視窗索引最大值,當用戶指定的視窗過大時,會自動將視窗設定為12。
        <fileNamePattern>:必須包含“%i”例如,假設最小值和最大值分別為1和2,命名模式為 mylog%i.log,會產生歸檔檔案mylog1.log和mylog2.log。還可以指定檔案壓縮選項,例如,mylog%i.log.gz 或者 沒有log%i.log.zip
      例如:         

 

<configuration> 
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
              <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern> 
              <maxHistory>30</maxHistory> 
            </rollingPolicy> 
            <encoder> 
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
            </encoder> 
          </appender> 

          <root level="DEBUG"> 
            <appender-ref ref="FILE" /> 
          </root> 
        </configuration>

 

 備註:上述配置表示每天生成一個日誌檔案,儲存30天的日誌檔案。
        

<configuration> 
          <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
            <file>test.log</file> 

            <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy"> 
              <fileNamePattern>tests.%i.log.zip</fileNamePattern> 
              <minIndex>1</minIndex> 
              <maxIndex>3</maxIndex> 
            </rollingPolicy> 

            <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy"> 
              <maxFileSize>5MB</maxFileSize> 
            </triggeringPolicy> 
            <encoder> 
              <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern> 
            </encoder> 
          </appender> 

          <root level="DEBUG"> 
            <appender-ref ref="FILE" /> 
          </root> 
        </configuration>

        備註:上述配置表示按照固定視窗模式生成日誌檔案,當檔案大於20MB時,生成新的日誌檔案。視窗大小是1到3,當儲存了3個歸檔檔案後,將覆蓋最早的日誌。
<encoder>:對記錄事件進行格式化。負責兩件事,一是把日誌資訊轉換成位元組陣列,二是把位元組陣列寫入到輸出流。
PatternLayoutEncoder 是唯一有用的且預設的encoder ,有一個<pattern>節點,用來設定日誌的輸入格式。使用“%”加“轉換符”方式,如果要輸出“%”,則必須用“\”對“\%”進行轉義。
    5.4、還有SocketAppender、SMTPAppender、DBAppender、SyslogAppender、SiftingAppender,並不常用,這裡就不詳解了。
大家可以參考官方文件(https://logback.qos.ch/documentation.html),還可以編寫自己的Appender。

  • (6)子節點<loger>:用來設定某一個包或具體的某一個類的日誌列印級別、以及指定<appender>。<loger>僅有一個name屬性,一個可選的level和一個可選的addtivity屬性。

可以包含零個或多個<appender-ref>元素,標識這個appender將會新增到這個loger
    name: 用來指定受此loger約束的某一個包或者具體的某一個類。
    level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,還有一個特俗值INHERITED或者同義詞NULL,代表強制執行上級的級別。 如果未設定此屬性,那麼當前loger將會繼承上級的級別。
addtivity: 是否向上級loger傳遞列印資訊。預設是true。同<loger>一樣,可以包含零個或多個<appender-ref>元素,標識這個appender將會新增到這個loger。

  • (7)子節點<root>:它也是<loger>元素,但是它是根loger,是所有<loger>的上級。只有一個level屬性,因為name已經被命名為"root",且已經是最上級了。

    level: 用來設定列印級別,大小寫無關:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,不能設定為INHERITED或者同義詞NULL。 預設是DEBUG。
六、常用loger配置

<!-- 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" />

<!--myibatis 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"/>

 

設定  SizeAndTimeBasedRollingPolicy規則 一天一歸類和多久刪除之前日誌


	<!-- INFO級別日誌 appender SizeAndTimeBasedRollingPolicy規則 -->
	<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
		<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
			<!-- 每天一歸檔 日誌檔案輸出的檔名 -->
			<FileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}/LJWEBInfo.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
			<!-- 單個日誌檔案最多 100MB, 60天的日誌週期,最大不能超過20GB -->
			<maxFileSize>10MB</maxFileSize>
			<maxHistory>60</maxHistory>
			<!-- <totalSizeCap>20GB</totalSizeCap> -->
		</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>
		</encoder>
	</appender>
  • 每天一歸檔: <FileNamePattern>${log_dir}/info/%d{yyyy-MM-dd}/LJWEBInfo.%d{yyyy-MM-dd}.%i.log</FileNamePattern> 
  • 單個日誌檔案最多 100MB: <maxFileSize>100MB</maxFileSize>    
  •  60天的日誌週期,刪除之前的:   <maxHistory>60</maxHistory>
  • 最大不能超過20GB 超過刪除:  <totalSizeCap>20GB</totalSizeCap>
  •  maxHistory    和  totalSizeCap 選擇一個就好

 

java:


import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogBack {
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) {
        logger.debug("print debug log.");
        logger.info("print info log.");
        logger.error("print error log.");
    }
 
}

產生檔案