Logback背景
Logback是一个开源的日志组件,是log4j的作者开发的用来替代log4j的。logback由三个部分组成,logback-core, logback-classic, logback-access。其中logback-core是其他两个模块的基础。slf4j 定义日志接口及基本实现,而具体的实现由其他日志组件提供log4j、 commons-logging、logback。因此,如果想替换成其他的日志组件,只需要替换jar包即可。
logback中三个重要概念: Logger,Appender,Layout
Logger: 日志记录器,把它关联到应用对应的context上后,主要用于存放日志对象,定义日志类型,级别。
Appender: 指定日志输出的目的地,目的地可以是控制台,文件,或者数据库等
Layout: 负责把事件转换成字符串,格式化日志信息的输出
寻找logback.xml
- logback首先在classpath寻找logback.groovy文件,
- 如果没找到,继续寻找logback-test.xml文件
- 如果没找到,继续寻找logback.xml文件
- 如果仍然没找到,则使用默认配置(打印到控制台)
为什么使用Logback
1、更快的实现。Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
2、Logback-classic非常自然实现了SLF4j。Logback-classic实现了SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J, 所以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
3、自动重新加载配置文件。当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。
4、Lilith。Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。
5、配置文件可以处理不同的情况。开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。
6、Filters(过滤器) 有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续 保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需 加4行XML配置。可以参考MDCFIlter 。
7、自动压缩。已经打出来的log RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。
8、堆栈树带有包版本。Logback在打出堆栈树日志时,会带上包的数据。
9、自动去除旧的日志文件 通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory 12,那那些log文件超过12个月的都会被自动移除。
Logback配置
一:根节点<configuration>包含的属性:
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
例如:
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 其他配置省略-->
</configuration>
二:根节点<configuration>的子节点:
2.1设置上下文名称:<contextName>
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>myAppName</contextName>
<!-- 其他配置省略-->
</configuration>
2.2设置变量: <property>
用来定义变量值的标签,<property> 有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过<property>定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。
2.3设置logger:
<logger>:用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<loger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
name:用来指定受此loger约束的某一个包或者具体的某一个类。
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,还有一个特俗值INHERITED或者同义词NULL,代表强制执行上级的级别。如果未设置此属性,那么当前loger将会继承上级的级别。
addtivity:是否向上级loger传递打印信息。默认是true。
<loger>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。<root>也是<logegr>元素,但是它是根logger。只有一个level属性,应为已经被命名为"root".默认是DEBUG。<root>可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个loger。
例如:
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"); } }