1. 程式人生 > >logback快速入門 配置和使用

logback快速入門 配置和使用

https://www.jianshu.com/p/851cba89c37a

logback快速入門

96 凜_冬_將_至 關注

2017.02.26 22:58* 字數 1000 閱讀 313評論 0喜歡 1

一、slf4j

The Simple Logging Facade for Java (SLF4J) serves as a simple facade or abstraction for various logging frameworks, such as java.util.logging, logback and log4j. SLF4J allows the end-user to plug in the desired logging framework at deployment time.

簡單日誌門面(SLF4J)為各種日誌框架提供了一個簡單的介面,使得使用者能夠在部署的時候配置其所希望的日誌系統。

在實際的開發過程中,可能會使用各種不同的日誌系統,每個日誌系統的風格、樣式和佈局也不盡相同,在不同日誌系統之間進行切換耗時耗力。使用slf4j無需考慮具體使用哪個日誌系統,統一使用slf4j的API進行開發。當要在不同日誌系統之間進行切換時,只需要選擇對應的日誌系統包即可,十分靈活方便(當然,日誌系統本身的jar包和配置檔案還是需要的)。還有一點好處是,slf4j能夠支援多個引數,並且通過{}佔位符進行替換,避免了各種各樣的判斷條件,從而提升了效能。

到官網下載最新版本的slf4j,解壓縮。slf4j-api-<version>.jar是slf4j的核心jar包。除此之外,還包含許多與日誌系統對應的jar包。

官網地址

slf4j中與各日誌系統之間的對應關係如下:

二、logback

Logback是一款開源的日誌元件,可以應用在不同的環境下。主要包括三個模組:logback-core、logback-classic和logback-access。

logback-core是其他模組的基礎模組。logback-classic可以看做是log4j的改良版本,完整地實現了slf4j API,使得logback可以與其他日誌系統自由切換。logback-access整合Servlet容器,提供通過http訪問日誌的功能。

Logback由三個主要的類構建而成:Logger、Appender和Layout。Logger是日誌的記錄器,主要用於存放日誌物件,也可以定義日誌型別和級別。Appender主要用於指定日誌的輸出目標,輸出目標可以是控制檯、檔案、資料庫等。Layout主要負責格式化日誌資訊。

Logger的級別按照優先順序的高低順序分為:ERROR、WARN、INFO、DEBUG、TRACE。

官網地址

三、下載與配置

到官網下載最新版本的logback,解壓縮。

通常,在classpath目錄下建立一個logback.xml來進行logback的配置。如果沒有建立配置檔案,logback會呼叫BasicConfigurator,建立一個預設的最小化配置。

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <!-- Assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
    <encoder>
      <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
    </encoder>
  </appender>

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

四、配置說明

配置檔案以<configuration>開始,包含一個<root>元素、若干<appender>元素以及若干<logger>元素。

<?xml version="1.0" encoding="UTF-8"?>
<!--
  scan:當設定為true時,配置檔案如果發生改變,將會被重新載入,預設值為true。
  scanPeriod:設定監測配置檔案是否有修改的時間間隔,預設單位是毫秒。
    當scan為true時,此屬性生效。預設的時間間隔為1分鐘。
  debug:當設定為true時,將打印出logback內部日誌資訊,實時檢視logback執行狀態。
    預設值為false。
-->
<configuration scan="false" scanPeriod="60 seconds" debug="false">
  <!-- 定義日誌的根目錄 -->
  <property name="LOG_HOME" value="/app/log" />
  <!-- 定義日誌檔名稱 -->
  <property name="appName" value="netty"></property>

  <!-- 控制檯輸出 -->
  <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
    <Encoding>UTF-8</Encoding>
    <!-- 日誌輸出格式:
      %d表示日期時間
      %thread表示執行緒名
      %-5level表示級別從左向右顯示5個字元寬度
      %logger{50}表示logger名字最長50個字元,否則按照句點分割
      %msg表示日誌訊息
      %n表示換行符
    -->
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
    </layout>
  </appender>

  <!-- 滾動檔案輸出。當符合某個條件時,將日誌記錄滾動到其他檔案 -->
  <appender name="appLogAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <Encoding>UTF-8</Encoding>
    <!-- 指定日誌檔案的名稱 -->
    <file>${LOG_HOME}/${appName}.log</file>
    <!--
      制定滾動策略,涉及檔案移動和重新命名。
      TimeBasedRollingPolicy: 最常用的滾動策略,它根據時間來制定滾動策略,
      既負責滾動也負責觸發滾動。
    -->
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!--
        滾動時產生的檔案的存放位置及檔名稱
        %d{yyyy-MM-dd}表示按天進行滾動
        %i表示當檔案大小超過maxFileSize時,按照i進行檔案滾動
      -->
      <fileNamePattern>${LOG_HOME}/${appName}-%d{yyyy-MM-dd}-%i.log</fileNamePattern>
      <!--
        可選節點,控制保留的歸檔檔案的最大數量,超出數量就刪除舊檔案。
        假設設定每天滾動,且maxHistory是365,則只儲存最近365天的檔案,
        刪除之前的舊檔案。注意,刪除舊檔案時,那些為了歸檔而建立的目錄也會被刪除。
      -->
      <MaxHistory>365</MaxHistory>
      <!--
        當日志文件超過maxFileSize指定的大小時,根據上面提到的%i進行日誌檔案滾動。
        注意此處配置SizeBasedTriggeringPolicy是無法實現按檔案大小進行滾動的,
        必須配置timeBasedFileNamingAndTriggeringPolicy
      -->
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <maxFileSize>100MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
    </rollingPolicy>
    <!-- 日誌輸出格式 -->
    <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [ %thread ] - [ %-5level ] [ %logger{50} : %line ] - %msg%n</pattern>
    </layout>
  </appender>

  <!--
    name:表示匹配的logger型別字首,也就是包的前半部分
    level:表示要記錄的日誌級別
    additivity:作用在於children-logger是否使用rootLogger配置的appender進行輸出,
      false:表示只用當前logger的appender-ref,
      true:表示當前logger的appender-ref和rootLogger的appender-ref都有效
  -->
  <!-- hibernate logger -->
  <logger name="org.hibernate" level="error" />
  <!-- Spring framework logger -->
  <logger name="org.springframework" level="error" additivity="false"></logger>

  <!--
    root與logger是父子關係,沒有特別定義則預設為root。
    任何一個類只會和一個logger對應,要麼是定義的logger,要麼是root。
    判斷的關鍵在於找到這個logger,然後判斷這個logger的appender和level。
  -->
  <root level="info">
    <appender-ref ref="stdout" />
    <appender-ref ref="appLogAppender" />
  </root>
</configuration>

詳細的配置說明

五、用法

通常,logback與slf4j一同使用。

  1. 建立logback.xml配置檔案
  2. 在Java程式中引入slf4j的jar包:org.slf4j.Logger和org.slf4j.LoggerFactory
  3. 在Java類中使用slf4j的API記錄日誌

所有的logger都關聯到一個LoggerContext物件,由它負責logger的建立和排列。通過LoggerFactory類的靜態方法getLogger()取得所建立的logger例項,引數為當前類名,然後呼叫logger中與級別對應的列印方法來輸出日誌。

final static Logger logger = LoggerFactory.getLogger(this.class);
logger.info("logback info");

如果想檢視logback內部狀態資訊,可以先通過slf4j的LoggerFactory.getLoggerFactory()方法建立一個LoggerContext例項,然後呼叫logback核心包中的靜態類StatusPrinter的print()方法列印日誌資訊。

LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();
StatusPrinter.print(lc);

執行時,將與所希望使用的日誌系統對應的jar包新增到classpath,這樣就切換到該日誌系統。最終,在部署時實現不同日誌系統之間的自由切換,與開發分離。