OK,如今咱們整理Logback的配置。關於Logback的使用比較簡單,和使用log4j也沒什麼太大區別,這裏就不作贅述了。html
這裏先來貼出一份完整的logback.xml的配置文件,之後若是用到相關配置直接這裏複製就行了。java
<?xml version="1.0" encoding="UTF-8"?> <!-- debug:打印logback內部日誌信息,實時查看logback的運行狀態,默認爲false --> <!-- scan:配置文件若是發生改變,是否被從新加載,默認爲true。 --> <!-- scanPeriod:設置檢測配置文件是否有修改的時間間隔,若是沒有給出時間單位,默認單位是毫秒,默認的時間間隔爲1分鐘,默認爲true。 --> <configuration debug="true" scan="true" scanPeriod="30 seconds"> <contextName>Application</contextName> <!-- 時間戳定義,timeReference:使用日誌產生日期爲時間基準 --> <timestamp key="byDay" datePattern="yyyy-MM-dd" timeReference="contextBirth" /> <!--定義日誌文件的存儲地址 勿在 LogBack 的配置中使用相對路徑,可使用系統變量 --> <!-- <property name="LOG_HOME" value="${app.home}/log" /> --> <property name="LOG_HOME" value="log" /> <!-- 控制檯輸出,生產環境將請stdout去掉 --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度,%msg:日誌消息,%n是換行符 --> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <!-- 按照天天生成日誌文件 --> <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 日誌輸出文件 --> <file>${LOG_HOME}/LoggingBack-${byDay}.log</file> <!-- 追加日誌到原文件結尾 --> <append>false</append> <!-- timebasedrollingpolicy:演示時間和大小爲基礎的日誌文件歸檔 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 歸檔的日誌文件的路徑,例現在天是2013-12-21日誌,當前寫的日誌文件路徑爲file節點指定。 --> <!--能夠將此文件與file指定文件路徑設置爲不一樣路徑,從而將當前日誌文件或歸檔日誌文件置不一樣的目錄。 --> <!--而2013-12-21的日誌文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <!-- 文件滾動日期格式:天天:.YYYY-MM-dd(默認);每星期:.YYYY-ww;每個月:.YYYY-MM --> <!-- 每隔半天:.YYYY-MM-dd-a;每小時:.YYYY-MM-dd-HH;每分鐘:.YYYY-MM-dd-HH-mm --> <fileNamePattern>${LOG_HOME}/log-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 控制歸檔文件的最大數量的保存,刪除舊的文件,默認單位天數 --> <maxHistory>7</maxHistory> <!-- 設置當前日誌的文件的大小,決定日誌翻滾 --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <!-- 除按日誌記錄以外,還配置了日誌文件不能超過10M(默認),若超過10M,日誌文件會以索引0開始, --> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n </pattern> </encoder> </appender> <!-- 能夠寫多個日誌文件appender,而後區分多個模塊的日誌 --> <appender name="LOGGINGBACK2" class="ch.qos.logback.core.rolling.RollingFileAppender"> <file>${LOG_HOME}/LoggingBack2.log</file> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <fileNamePattern>${LOG_HOME}/LOG-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <maxHistory>7</maxHistory> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>10MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger - %msg%n </pattern> </encoder> </appender> <!-- 指定一個包,name必填,additivity選填:控制是否繼承父類appender,默認true --> <!-- level選填,若是木有指定從最近的父類繼承,頂級爲root的級別 --> <logger name="org.linkinpark.commons.logbackLogging" level="INFO" additivity="true"> <appender-ref ref="FILE" /> </logger> <!-- 指定一個具體的文件 --> <logger name="org.linkinpark.commons.logbackLogging.LoggingBack2" level="ERROR" additivity="false"> <appender-ref ref="LOGGINGBACK2" /> </logger> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration>
1,日誌級別的繼承。咱們能夠配置多個日誌,頂級是root日誌。而後每一個日誌均可以從距離本身最近的父類來繼承父類的日誌級別,固然本身也能夠重寫。關於繼承看下面這個例子:數據庫
值得注意的是:咱們在定義包或者文件類的日誌級別的時候,寫包名必須從頭至尾寫,不能從中間寫。好比x.y.z,咱們寫的要x.y或者x這樣子寫,不能y.z這樣。本身不當心掉坑半天,我暈。服務器
Logger name | Assigned level | Effective level |
---|---|---|
root | DEBUG | DEBUG |
X | INFO | INFO |
X.Y | none | INFO |
X.Y.Z | ERROR | ERROR |
2,默認狀況下子類會從距離本身最近的父類繼承父類的appender,即便本身從新定義了<appender-ref>,因此若是咱們不想繼承的時候,設置additivity屬性爲false就行了。app
3,實際的項目中,通常狀況下項目發佈到Linux服務器上,因此這個時候沒有必要設置控制檯的輸出,爲了避免影響性能,因此咱們通常都直接定義root,而後也只定義root的日誌級別就夠了。性能
上面的配置文件中,我只是爲了在平時編碼過程當中來控制檯看日誌輸出而已。測試
4,上面的appender屬性我配置了不論是true,仍是false,每次仍是老是給我添加到日誌結尾了,鬱悶,這個屬性實際編碼中能夠忽略了。編碼
5,日誌的滾動通常都是有了最新的文件,而後將原來舊的文件從新命名,而後新的日誌輸出到最新的日誌文件裏面的,也就是說file屬性指定文件每次都是最新的日誌輸出文件呢,別搞混了。spa
6,實際編碼中,若是須要爲不一樣的模塊,或者某一個模塊中要配置不一樣的日誌文件,這個時候就能夠定義多個appender,而後定義多個logger,而後設置additivity屬性爲false,appender-ref指向不一樣的日誌append,OK,這樣子就實現了不一樣文件的不一樣日誌備份。線程
最後,咱們就寫一個具體的例子,來看下爲不一樣的日誌文件生成不一樣的項目日誌,配置文件仍是用上面的OK了,2個測試代碼以下:
package org.linkinpark.commons.logbackLogging; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingBack { private static Logger logger = LoggerFactory.getLogger(LoggingBack.class); @Test public void test() { logger.debug("LoggingBack.debug()。。。"); logger.info("LoggingBack.info()。。。"); logger.error("LoggingBack.error()。。。"); } }
package org.linkinpark.commons.logbackLogging; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class LoggingBack2 { private static Logger logger = LoggerFactory.getLogger(LoggingBack2.class); @Test public void test() { LoggingBack huhu = new LoggingBack(); huhu.test(); logger.debug("LoggingBack2.debug()。。。"); logger.info("LoggingBack2.info()。。。"); logger.error("LoggingBack2.error()。。。"); } }
LoggingBack-2016-03-01.log和LoggingBack2.log2個文件。
先打開LoggingBack-2016-03-01.log看下,該文件是默認的包下面的日誌文件,設置的級別爲info級別:
01:10:17.485 [main] INFO org.linkinpark.commons.logbackLogging.LoggingBack - LoggingBack.info()。。。 01:10:17.487 [main] ERROR org.linkinpark.commons.logbackLogging.LoggingBack - LoggingBack.error()。。。
而後再打開
LoggingBack2.log看下,該文件是我指定的一個特殊的類,設置的級別是error級別:
01:10:17.487 [main] ERROR org.linkinpark.commons.logbackLogging.LoggingBack2 - LoggingBack2.error()。。。
OK,沒有問題,成功的區分了2種不一樣的文件,咱們在實際編碼中,若是多個模塊中須要輸出到不一樣的日誌文件的話就可使用這種方式。
總結:
Logback的核心對象:Logger、Appender、Layout。Logback主要創建於Logger、Appender 和 Layout 這三個類之上。
1,Logger:日誌的記錄器,把它關聯到應用的對應的context上後,主要用於存放日誌對象,也能夠定義日誌類型、級別。Logger對象通常多定義爲靜態常量,如:
2,Appender:用於指定日誌輸出的目的地,目的地能夠是控制檯、文件、遠程套接字服務器、 MySQL、 PostreSQL、Oracle和其餘數據庫、 JMS和遠程UNIX Syslog守護進程等。
3,Layout:負責把事件轉換成字符串,格式化的日誌信息的輸出。具體的Layout通配符,能夠直接查看幫助文檔。
上面的3個核心對象和log4j同樣的,因此我這裏就不作贅述了。