logback使用3-logback配置

配置文件的语法

logback的配置文件主要由以下三个部分,appender,logger,root!

basicSyntax

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

appenderSyntax

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

posted on 2012-03-25 16:54  mpf  阅读(1630)  评论(0编辑  收藏  举报

导航