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
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
到官網下載最新版本的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一同使用。
全部的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,這樣就切換到該日誌系統。最終,在部署時實現不一樣日誌系統之間的自由切換,與開發分離。