logback 配置

  1. logback 配置

logback的配置方式包括:編程配置、XML文件配置、Groovy文件配置。對於使用log4j的用戶,還能夠經過logback提供的工具( http://logback.qos.ch/translator/ ) log4j.properties配置文件轉換爲logback.xml格式。java

logback 初始化配置的步驟以下:node

  1. 在類路徑下依次查找 logback.groovy, logback-test.xml, logback.xml文件;
  2. 若找到配置文件,則讀取文件,配置logback
  3. 若是沒找到任何配置文件,且JVM包含ServiceLoader(JDK 6以上),則由ServiceLoader解析com.qos.logback.classic.spi.Configurator的實現。
  4. 若是以上均失敗,則使用BasicConfigurator的默認配置,輸出日誌到控制檯。

 

34兩步用於在沒找到配置文件時提供默認配置。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.LoggerFactoryorg.slf4j.Logger類和logback鏈接,除了配置logback的代碼(徹底能夠沒有),在代碼上沒有任何調用logback的類,在編譯時依賴slf4j,但不依賴logback,因此很容易移植到其餘的日誌框架。

 

1.2 使用logback-test.xmllogback.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.xmllogback-test.xml放在類路徑下,運行MyApp1,能夠得出和上面相同的輸出。

 

1.3 出現warningerrors時輸出狀態信息

若是在解析配置文件時出錯,logback會自動將解析錯誤信息輸出到控制檯;若是代碼裏已指定狀態監聽器,爲了不重複輸出,logback會禁用自動輸出功能。

下面演示如何主動查詢logback的解析狀態信息(除了查詢內部狀態的兩行代碼,其餘和MyApp1徹底一致)

public static void main(String[] args) {

// 假設SLF4Jlogback綁定

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能夠自動掃描配置文件,在配置文件改變時自動從新配置。配置方法:

configurationscan屬性設置爲true:

<configuration scan="true">

  

</configuration>

掃描時間間隔默認1 min 1次,經過configurationscanPeriod屬性能夠修改時間間隔:

<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的內容,以下所示:

clip_image001

將下面的內容添加到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();

對網絡應用,則調用ServletContextListenercontextDestroyed方法。

 

  1. 配置文件語法

clip_image002

如上圖所示,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,不區分大小寫,另有額外的兩個值:INHERITEDNULL,表示從父logger繼承。

子元素:

元素名

minOccurs

maxOccurs

描述

appender-ref

0

unbounded

表示將對應的appender添加到該logger

 

<root>

用於配置root loggerroot logger爲特殊類型的logger,由於root logger名恆爲"ROOT",因此無name屬性,additivity對其無效,因此只剩下一個屬性須要配置:level。其可用值爲:TRACE,DEBUG,INFO,WARN,ALL,OFF,不能爲INHERITEDNULL

相似於<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信息被抑制。

 

能夠按照本身的想法隨意設置多個loggerlevel,好比,將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

因而可知,MyApp3INFOFoo.doIt()DEBUG都啓用了。而root logger老是爲非NULL的,其默認值爲DEBUG

 

<appender>

clip_image003

<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 定義變量

能夠在配置文件中定義變量,也能夠從外部導入。在logbackXML配置文件中能夠用<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, contextsystem,分別對應配置範圍,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}}"

相關文章
相關標籤/搜索