logback的配置方式包括:編程配置、XML文件配置、Groovy文件配置。對於使用log4j的用戶,還能夠經過logback提供的工具( http://logback.qos.ch/translator/ ) 將log4j.properties配置文件轉換爲logback.xml格式。java
logback 初始化配置的步驟以下:node
3、4兩步用於在沒找到配置文件時提供默認配置。web
1.1 logback的默認配置編程
不提供配置文件,logback使用其默認配置。先給個示例代碼:服務器
package chapters.configuration;網絡
import org.slf4j.Logger;app import org.slf4j.LoggerFactory;框架
public class MyApp1 {工具 final static Logger logger = LoggerFactory.getLogger(MyApp1.class);ui
public static void main(String[] args) { logger.info("Entering application.");
Foo foo = new Foo(); foo.doIt(); logger.info("Exiting application."); } } |
Foo類以下:
package chapters.configuration;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
public class Foo { static final Logger logger = LoggerFactory.getLogger(Foo.class);
public void doIt() { logger.debug("Did it again!"); } } |
假設類路徑下不包含配置文件,logback使用BasicConfigurator的默認配置。該配置root logger使用ConsoleAppender,級別爲DBUEG,輸出格式PatternLayoutEncoder 的pattern爲%d{HH:mm:ss.SSS}[%thread]%-5level%logger{36}-%msg%n。
上例的輸出以下:
15:22:09.106 [main] INFO manual.configuration.MyApp1 - Entering application. 15:22:09.121 [main] DEBUG manual.configuration.Foo - Did it again! 15:22:09.121 [main] INFO manual.configuration.MyApp1 - Exiting application. |
MyApp1經過org.slf4j.LoggerFactory和org.slf4j.Logger類和logback鏈接,除了配置logback的代碼(徹底能夠沒有),在代碼上沒有任何調用logback的類,在編譯時依賴slf4j,但不依賴logback,因此很容易移植到其餘的日誌框架。
1.2 使用logback-test.xml或logback.xml進行配置
下面的XML配置文件等效於BasicConfigurator的默認配置:
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <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> |
將該文件命名爲logback.xml或logback-test.xml放在類路徑下,運行MyApp1,能夠得出和上面相同的輸出。
1.3 出現warning或errors時輸出狀態信息
若是在解析配置文件時出錯,logback會自動將解析錯誤信息輸出到控制檯;若是代碼裏已指定狀態監聽器,爲了不重複輸出,logback會禁用自動輸出功能。
下面演示如何主動查詢logback的解析狀態信息(除了查詢內部狀態的兩行代碼,其餘和MyApp1徹底一致):
public static void main(String[] args) { // 假設SLF4J和logback綁定 LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); // 打印logback的內部狀態 StatusPrinter.print(lc); … } |
其輸出以下:
15:34:26,052 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy] 15:34:26,052 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 15:34:26,052 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.xml] 15:34:26,052 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Setting up default configuration.
15:34:26.099 [main] INFO chapters.configuration.MyApp2 - Entering application. 15:34:26.114 [main] DEBUG chapters.configuration.Foo - Did it again! 15:34:26.114 [main] INFO chapters.configuration.MyApp2 - Exiting application. |
能夠看到,後面的輸出和上個例子徹底同樣,前面的一段輸出爲logback的內部狀態信息。
除了使用StatusPrinter,也在配置文件中設置(前提是配置文件無錯),此時沒有出錯,也能輸出logback內部信息。配置方法:將configuration元素的debug屬性設置爲true,以下所示:
<?xml version="1.0" encoding="UTF-8" ?> <configuration debug="true"> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <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> |
該debug屬性只控制logback內部狀態數據,對其餘不存在任何影響。
1.4 經過系統屬性指定默認配置文件位置
使用系統屬性"logback.configurationFile"能夠指定logback的默認配置文件位置。該屬性值能夠是URL、類路徑下的文件或應用外的文件路徑,以下所示:
java -Dlogback.configurationFile=/path/to/config.xml chapters.configuration.MyApp1 |
文件擴展名必須爲.xml或.groovy。
1.5 修改後自動從新載入配置文件
logback能夠自動掃描配置文件,在配置文件改變時自動從新配置。配置方法:
將configuration的scan屬性設置爲true:
<configuration scan="true"> … </configuration> |
掃描時間間隔默認1 min 1次,經過configuration的scanPeriod屬性能夠修改時間間隔:
<configuration scan="true" scanPeriod="30 seconds"> … </configuration> |
NOTE:若是沒指定時間單位,默認單位爲毫秒
1.6 直接調用JoranConfigurator
logback的配置依賴於Joran庫,該庫爲logback-core的一部分。logback在找到配置文件後會調用JoranConfigurator進行配置,以下所示:
package chapters.configuration;
import org.slf4j.Logger; import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.LoggerContext; import ch.qos.logback.classic.joran.JoranConfigurator; import ch.qos.logback.core.joran.spi.JoranException; import ch.qos.logback.core.util.StatusPrinter;
public class MyApp3 { final static Logger logger = LoggerFactory.getLogger(MyApp3.class);
public static void main(String[] args) { // assume SLF4J is bound to logback in the current environment LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
try { JoranConfigurator configurator = new JoranConfigurator(); configurator.setContext(context); // Call context.reset() to clear any previous configuration, e.g. default // configuration. For multi-step configuration, omit calling context.reset(). context.reset(); configurator.doConfigure(args[0]); } catch (JoranException je) { // StatusPrinter will handle this } StatusPrinter.printInCaseOfErrorsOrWarnings(context);
logger.info("Entering application.");
Foo foo = new Foo(); foo.doIt(); logger.info("Exiting application."); } } |
先得到當前起做用的LoggerContext,而後建立JoranConfigurator實例,設置其做用的context實例,重置context,而後載入配置文件進行配置。
1.7 查看狀態信息
logback的內置狀態數據保存在StatusManager對象中,經過LoggerContext能夠得到。
爲了節省內存,StatusManager將狀態信息分兩部分保存:header部分和tail部分。header部分保存前H個信息,tail部分保存後T個信息,H=T=150。
logback-classic裏一個稱爲ViewStatusMessagesServlet的服務器。該服務器以HTML表格的形式打印StatusManager的內容,以下所示:
將下面的內容添加到WEB-INF/web.xml文件,能夠將該服務器添加到網絡應用:
<servlet> <servlet-name>ViewStatusMessages</servlet-name> <servlet-class>ch.qos.logback.classic.ViewStatusMessagesServlet</servlet-class> </servlet>
<servlet-mapping> <servlet-name>ViewStatusMessages</servlet-name> <url-pattern>/lbClassicStatus</url-pattern> </servlet-mapping> |
1.8 監聽狀態信息
給StatusManager添加StatusListener監聽器,能實時監控狀態信息,特別是logback配置以後的信息。logback自帶的StatusListener的實現稱做OnConsoleStatusListener,即,將全部的狀態信息打印到控制檯。
下面演示爲StatusManger註冊OnConsoleStatusListener的實例:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); StatusManager statusManager = lc.getStatusManager(); OnConsoleStatusListener onConsoleListener = new OnConsoleStatusListener(); statusManager.add(onConsoleListener); |
監聽器只輸出監聽器註冊後的信息,因此將監聽器放在配置文件最前面比較合適(並且能夠在一個配置文件中註冊多個監聽器),配置方法以下:
<configuration debug="false"> <statusListener class="ch.qos.logback.core.status.OnConsoleStatusListener" /> … the rest of the configuration file </configuration> |
1.9 中止 logback-classic
經過中止logback context,能夠釋放logback-classic佔用的資源。中止context會關閉全部和對應logger鏈接的appender,並中止對應的線程:
LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory(); lc.stop(); |
對網絡應用,則調用ServletContextListener的contextDestroyed方法。
如上圖所示,XML配置文件根元素爲<configuration>,能夠包含[0,∞)個<appender>,[0,∞)個<logger>以及[0,1]個<root>元素。
<logger>
屬性:
屬性名 |
類型 |
Use |
描述 |
name |
string |
必須 |
|
additivity |
bool |
可選 |
是否向上級logger傳遞信息,默認爲true |
level |
string |
可選 |
TRACE,DEBUG,INFO,WARN,ERROR,ALL,OFF,不區分大小寫,另有額外的兩個值:INHERITED或NULL,表示從父logger繼承。 |
子元素:
元素名 |
minOccurs |
maxOccurs |
描述 |
appender-ref |
0 |
unbounded |
表示將對應的appender添加到該logger |
<root>
用於配置root logger。root logger爲特殊類型的logger,由於root logger名恆爲"ROOT",因此無name屬性,additivity對其無效,因此只剩下一個屬性須要配置:level。其可用值爲:TRACE,DEBUG,INFO,WARN,ALL,OFF,不能爲INHERITED或NULL。
相似於<logger>,<root>能夠包含0或多個<appender-ref>。
實例:假如不想看到"chapters.configuration"包中任何DEBUG信息,以下
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <encoder> <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender>
<logger name="chapters.configuration" level="INFO" />
<!-- 嚴格的說,下面的level屬性是不須要的,由於root的默認值爲DEBUG --> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root>
</configuration> |
包"chapters.configuration"的level屬性設置爲"INFO",這樣DEBUG信息均被過濾掉了。若是將該配置文件做爲參數傳遞給MyApp3,其輸出以下:
20:59:32.913 [main] INFO chapters.configuration.MyApp3 - Entering application. 20:59:32.917 [main] INFO chapters.configuration.MyApp3 - Exiting application. |
此時由"chapters.configuration.Foo"生成的DEBUG信息被抑制。
能夠按照本身的想法隨意設置多個logger的level,好比,將chapters.configuration 包設置INFO,單獨把Foo設置爲DEBUG,以下所示:
<?xml version="1.0" encoding="UTF-8" ?> <configuration> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <encoder> <pattern> %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> </encoder> </appender> <logger name="chapters.configuration" level="INFO" /> <logger name="chapters.configuration.Foo" level="DEBUG" /> <root level="DEBUG"> <appender-ref ref="STDOUT" /> </root> </configuration> |
用該文件做爲參數運行MyApp3,輸出以下:
21:16:56.913 [main] INFO chapters.configuration.MyApp3 - Entering application. 21:16:56.915 [main] DEBUG chapters.configuration.Foo - Did it again! 21:16:56.916 [main] INFO chapters.configuration.MyApp3 - Exiting application. |
下面列出上面各個logger對應的level:
Logger 名 |
指定的 Level |
實際的 Level |
root |
DEBUG |
DEBUG |
chapters.configuration |
INFO |
INFO |
chapters.configuration.MyApp3 |
null |
INFO |
chapters.configuration.Foo |
DEBUG |
DEBUG |
因而可知,MyApp3的INFO和Foo.doIt()的DEBUG都啓用了。而root logger老是爲非NULL的,其默認值爲DEBUG。
<appender>
<appender>用於配置日誌輸出位置。屬性:
屬性名 |
類型 |
Use |
描述 |
name |
string |
required |
appender名,可隨意取 |
class |
string |
required |
appender對應的類,需包含完整路徑,如輸出到console對應的:class="ch.qos.logback.core.ConsoleAppender" |
子元素:
元素名 |
minOccurs |
maxOccurs |
layout |
0 |
1 |
encoder |
0 |
unbounded |
filter |
0 |
unbounded |
layout
layout元素必須包含class元素,包含layout類的徹底限定名。
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>myApp.log</file> <!-- encoders are assigned by default the type ch.qos.logback.classic.encoder.PatternLayoutEncoder --> <encoder> <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern> </encoder> </appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> <appender-ref ref="STDOUT" /> </root> </configuration> |
2.6 定義變量
能夠在配置文件中定義變量,也能夠從外部導入。在logback的XML配置文件中能夠用<property>和<variable>(1.07以後)定義變量。下面定義一個變量,用於定義輸出文件位置:
<configuration> <property name="USER_HOME" value="/home/sebastien" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> </root> </configuration> |
也能夠用系統變量達到相同的目的:
java -DUSER_HOME="/home/sebastien" MyApp2 |
而後在配置文件中引用該變量:
<configuration> <appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> </root> </configuration> |
若是須要不少變量,則以一個單獨的文件存放全部變量比較合適:
下面的配置文件引用了一個變量:
<configuration> <property file="src/main/java/chapters/configuration/variables1.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> </root> </configuration> |
該文件包含variables1.properties屬性文件的引用。屬性文件中定義的變量會被做爲本地變量引入,variable.properties文件格式以下:
USER_HOME=/home/sebastien |
也能夠直接引用類路徑下的文件:
<configuration> <property resource="resource1.properties" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>${USER_HOME}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> </root> </configuration> |
做用域
還能夠對上面定義的變量進行做用域限制,local, context或system,分別對應配置範圍,logback程序範圍及JVM範圍,定義方式以下:
<configuration> <property scope="context" name="nodeId" value="firstNode" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender"> <file>/opt/${noteId}/myApp.log</file> <encoder> <pattern>%msg%n</pattern> </encoder> </appender>
<root level="debug"> <appender-ref ref="FILE" /> </root> </configuration> |
scope可用值有:local, context 和 system。
默認值
假設變量名爲aName,指定其默認值爲golder,指定語法爲:"${aName:-golden}"。
嵌套變量
嵌套指一個變量能夠引用另外一個變量。包括值嵌套、名嵌套以及默認值嵌套。
值嵌套
USER_HOME=/home/sebastien fileName=myApp.log destination=${USER_HOME}/${fileName} |
destination變量值包含對USER_HOME變量值和fileName變量值的引用。
名嵌套
當引用一個變量時,變量名可能包含對其餘變量的引用。例如,若是變量"userid"的值爲"alice",則"${${userid}.password}"表示名爲"alice.password"的變量。
默認值嵌套
如變量"id"未分配值,變量"userid"值爲"alice",則"${id:-${userid}}"