logback快速入門

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.html

簡單日誌門面(SLF4J)爲各類日誌框架提供了一個簡單的接口,使得用戶可以在部署的時候配置其所但願的日誌系統。java

在實際的開發過程當中,可能會使用各類不一樣的日誌系統,每一個日誌系統的風格、樣式和佈局也不盡相同,在不一樣日誌系統之間進行切換耗時耗力。使用slf4j無需考慮具體使用哪一個日誌系統,統一使用slf4j的API進行開發。當要在不一樣日誌系統之間進行切換時,只須要選擇對應的日誌系統包便可,十分靈活方便(固然,日誌系統自己的jar包和配置文件仍是須要的)。還有一點好處是,slf4j可以支持多個參數,而且經過{}佔位符進行替換,避免了各類各樣的判斷條件,從而提高了性能。spring

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

官網地址api

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

2、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。this

官網地址

3、下載與配置

到官網下載最新版本的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>

4、配置說明

配置文件以<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>

詳細的配置說明

5、用法

一般,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,這樣就切換到該日誌系統。最終,在部署時實現不一樣日誌系統之間的自由切換,與開發分離。

相關文章
相關標籤/搜索