1 概述
LogBack是一个日志框架,它与Log4j可以说是同出一源,都出自Ceki Gülcü之手。(log4j的原型是早前由Ceki Gülcü贡献给Apache基金会的)
2 LogBack、Slf4j和Log4j之间的关系
Slf4j是The Simple Logging Facade for Java的简称,是一个简单日志门面抽象框架,它本身只提供了日志Facade API和一个简单的日志类实现,一般常配合Log4j,LogBack,java.util.logging使用。Slf4j作为应用层的Log接入时,程序可以根据实际应用场景动态调整底层的日志实现框架(Log4j/LogBack/JdkLog…)。
LogBack和Log4j都是开源日记工具库,LogBack是Log4j的改良版本,比Log4j拥有更多的特性,同时也带来很大性能提升。详细数据可参照下面地址:Reasons to prefer logback over log4j。
3 LogBack的结构
LogBack被分为3个组件,logback-core, logback-classic 和 logback-access。
其中logback-core提供了LogBack的核心功能,是另外两个组件的基础。
logback-classic则实现了Slf4j的API,所以当想配合Slf4j使用时,需要将logback-classic加入classpath。
logback-access是为了集成Servlet环境而准备的,可提供HTTP-access的日志接口。
4 配置详解
4.1 根节点包含的属性
- scan:当此属性设置为 true 时,配置文件如果发生变化,将会被重新加载,默认值为 true。
- scanPeriod:设置监测配置文件是否修改的时间间隔,当 scan 为 true 时,此配置生效,默认时间为 1 分钟
- debug:当此属性设置为 true 时,将打印出 logback 内部日志信息,实时查看 logback 运行状态。默认值为 false
XML代码
<configuration scan="true" scanPeriod="60 second" debug="false">
...
</configuration>
4.2 根节点 的子节点
LogBack 的配置大概包括 3 部分:appender、logger 和 root
设置上下文名称 <contextName>
每个 logger 都关联到 logger 上下文,默认上下文名称为 “default”。但可以使用 <contextName>
设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
<configuration scan="true" scanPeriod="60 second" debug="false">
<contextName>myAppName</contextName>
...
</configuration>
设置变量 <property>
用来定义变量值的标签,<property>
有两个属性,name 和 value;其中 name 值是变量的名称,value 是值。通过 <property>
定义的值会被插入到 logger 上下文中,定义变量后,可以使用 “${}” 来使用变量。
<configuration scan="true" scanPeriod="60 second" debug="false">
<property name="APP_Name" value="myAppName" />
<contextName>${APP_Name}</contextName>
<!-- 其他配置省略-->
</configuration>
获取时间戳字符串 timestamp
4.2.1 logger
用来设置某一个包或者具体的类的日志打印级别,以及指定 <appender>
。<logger>
仅有一个 name 属性,一个可选的 level 和一个可选的 addtivity 属性。
- name:用来指定受此 logger 约束的某一个包或者具体的某一个类
- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前 logger 将会继承上级的级别。
- addtivity:是否向上级 logger 传递打印信息。默认值为 true
<logger>
可以包含零个或多个 <appender-ref>
元素,标识这个 appender 将会添加到这个 logger。
4.2.2 root
只有一个 level 属性
- level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,不能设置为INHERITED或者同义词NULL。默认是DEBUG。
<root>
可以包含零个或多个 <appender-ref>
元素,标识这个 appender 将会添加到这个 logger
案例介绍
首先是 java 类如下:
package logback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogbackDemo {
private static Logger log = LoggerFactory.getLogger(LogbackDemo.class);
public static void main(String[] args) {
log.trace("======trace");
log.debug("======debug");
log.info("======info");
log.warn("======warn");
log.error("======error");
}
}
logback.xml 配置文件
只配置root
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="STDOUT" />
</root>
</configuration>
其中 appender 的配置表示打印到控制台(稍后详细讲解appender )。<root level="INFO">
将root的打印级别设置为 “INFO”,指定了名字为 “STDOUT” 的 appender。
当执行logback.LogbackDemo类的main方法时,root将级别为 “INFO” 及大于 INFO 的日志信息交给已经配置好的名为 STDOUT 的appender处理,STDOUT appender将信息打印到控制台;
输出结果:
13:30:38.484 [main] INFO logback.LogbackDemo - ======info
13:30:38.500 [main] WARN logback.LogbackDemo - ======warn
13:30:38.500 [main] ERROR logback.LogbackDemo - ======error
带有logger的配置,不指定级别,不指定appender
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback为java中的包 -->
<logger name="logback"/>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
</configuration>
输出结果:
13:19:15.406 [main] DEBUG logback.LogbackDemo - ======debug
13:19:15.406 [main] INFO logback.LogbackDemo - ======info
13:19:15.406 [main] WARN logback.LogbackDemo - ======warn
13:19:15.406 [main] ERROR logback.LogbackDemo - ======error
<logger name="logback" />
将控制logback包下的所有类的日志的打印,但是并没有设置打印级别,所以继承他的上级的日志级别“DEBUG”。
没有设置addtivity,默认为true,将此logger的打印信息向上级传递。
没有设置appender,此logger本身不打印任何信息。
<root level="DEBUG">
将root的打印级别设置为“DEBUG”,指定了名字为“STDOUT”的appender。
当执行logback.LogbackDemo类的main方法时,因为LogbackDemo 在包logback中,所以首先执行 <logger name="logback" />
,将级别为“DEBUG”及大于“DEBUG”的日志信息传递给root,本身并不打印。
root接到下级传递的信息,交给已经配置好的名为“STDOUT”的appender处理,“STDOUT”appender将信息打印到控制台。
带有多个logger的配置,指定级别,指定appender
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- logback为java中的包 -->
<logger name="logback"/>
<!--logback.LogbackDemo:类的全路径 -->
<logger name="logback.LogbackDemo" level="INFO" additivity="false">
<appender-ref ref="STDOUT"/>
</logger>
<root level="ERROR">
<appender-ref ref="STDOUT" />
</root>
</configuration>