logback使用3-logback配置
配置文件的语法
logback的配置文件主要由以下三个部分,appender,logger,root!
logback的配置文件很灵活,他不需要特别声明一个DTD或者XML Schama,它基本可以被描述为这样:<configuration>元素下,有0个或则会多个的appender,有0个或者多个的logger,以及最多一个的root元素!
注意点:1logback的配置文件标签名大小写敏感,例如:<logger>
, <Logger>
和<LOGGER>是不可用的
.
1配置logger
在学习这个配置之前,你首先应该理解级别继承,以及基本的选择规则!
logger的结构如下(name属性必选,level属性可选(TRACE,INFO,DEBUG,WARN,ERROR,ALL ,OFF,The special case-insensitive value INHERITED, or its synonym NULL, will force the level of the logger to be inherited from higher up in the hierarchy.),additivity为true或者false,):
<logger name="test1" level="info" additivity=”true”> <appender-ref name=""> </logger>
注意点:不像log4j,logback classic在添加新的appender之前不会删除或者关闭之前引用的appender!
2配置root
root元素配置root级别的logger,他有一个level的属性,他没有别的其他属性,因为additivity 不会应用于root logger上,也不需要name属性,因为他的name就是root!
root的level不能够使用 INHERITED 或者 NULL.
例如:
<root level="DEBUG"> <appender-ref ref="STDOUT" /> </root>
3配置appender
appender有两个必选属性name和class,其中是class属性的值为应用实例的有效类路径!
appender有0个或者多个layout标签,encoder标签和filter标签!
appender包含若干应用于javabean的属性,这个会在之后讨论到,但是注意这些属性是不可见的!
layout标签有一个属性class,这个属性值是layout对应实例化的类全名!layout还包含实例化类的若干参数!例如:PatternLayout!
encoder标签有一个属性class,属性值是encoder class的类全名!例如:PatternLayoutEncoder!
<configuration>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>myApp.log</file>
<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>
注意:一个encoder只能属于一个appender,不能被多个appender共享,layout也是一样的~
appender累积
同一个appender被root使用,同时被其他logger使用,到时候输出日志可能会重复输出!即日志会向上级logger输出!
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder> <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> </encoder>
</appender>
<logger name="chapters.configuration">
<appender-ref ref="STDOUT" />
</logger>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
重写累积特性
通过设置additivity="false"可以让日志不向上一级别的logger输出!
设置context name
默认的context name 是default,你可以通过如下的设置更改:
<configuration> <contextName>myAppName</contextName>
输出比较:
2012-03-25 15:43:52,041 default [main] INFO Test1 – info
添加后:
2012-03-25 15:47:09,303 myapp [main] INFO Test1 – info
Propertity 替代
和其他一些脚本语言一样,logback配置文件支持定义或者替代属性,可以配置在logback本身的配置文件,外部文件,其他外部资源甚至是云计算中!
可以使用${开头,以}结束,当出现${key}将被对应的值替代!
propertity可以被定义在local,context ,system 范围!
local scope是默认的,他是从配置位置开始到配置文件结束!
context scope范围是:配置开始到他被清除!一旦定义一个context scope,它将是context的一部分!因此他可以被任何log event使用,包括通过序列化的方式到远程主机上!
system scope范围是:配置在JVM的属性里,直到JVM停止或则它被清除!
HOSTNAME 和CONTEXT_NAME 这两个属性是cotext scope,被经常使用!
logback查找的顺序:local—>context—>System—>OS环境变量
定义属性
下面是一个local scope例子
<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>
下面是一个System scope例子:
java -DUSER_HOME="/home/sebastien" MyApp2
使用外部文件
<configuration>
<property file="src/main/java/chapters/configuration/variables1.properties" />
属性范围
使用scope的属性来指令范围
<property scope="context" name="nodeId" value="node1" />
嵌套变量属性
<define name="rootLevel" class="a.class.implementing.PropertyDefiner">
<aProperty>of a.class.implementing.PropertyDefiner</aProperty>
</define>
配置文件的条件语句
开发者可以配置不同的logback的文件,以方便用来开发,测试,以及形成产品;这些配置信息可能大部分是相同的,但是有一部分不相同,为了避免重复配置,可以使用if,then,else进行条件判断来满足不同目标的环境!
下面是一个例子:
<!-- if-then form --> <if condition="some conditional expression"> <then> ... < /then> </if> <!-- if-then-else form --> <if condition="some conditional expression"> <then> ... </then> <else> ... </else> </if>
例子见:http://logback.qos.ch/manual/configuration.html#definingPropsOnTheFly
从JNDI获得变量
<configuration> <insertFromJNDI env-entry-name="java:comp/env/appName" as="appName" />
<contextName>${appName}</contextName>
<configuration>
文件包含
<configuration> <include file="src/main/java/chapters/configuration/includedConfig.xml"/>
注意:目标文件必须包含<included>标签
添加Context Listener