前言
logbcak相当于log4j的改进版,相对于log4j有一些优点:
更快的实现 Logback的内核重写了,在一些关键执行路径上性能提升10倍以上。而且logback不仅性能提升了,初始化内存加载也更小了。
非常充分的测试 Logback经过了几年,数不清小时的测试。Logback的测试完全不同级别的。在作者的观点,这是简单重要的原因选择logback而不是log4j。
Logback-classic非常自然实现了SLF4j Logback-classic实现了 SLF4j。在使用SLF4j中,你都感觉不到logback-classic。而且因为logback-classic非常自然地实现了SLF4J, 所 以切换到log4j或者其他,非常容易,只需要提供成另一个jar包就OK,根本不需要去动那些通过SLF4JAPI实现的代码。
非常充分的文档 官方网站有两百多页的文档。
自动重新加载配置文件 当配置文件修改了,Logback-classic能自动重新加载配置文件。扫描过程快且安全,它并不需要另外创建一个扫描线程。这个技术充分保证了应用程序能跑得很欢在JEE环境里面。
Lilith Lilith是log事件的观察者,和log4j的chainsaw类似。而lilith还能处理大数量的log数据 。
谨慎的模式和非常友好的恢复 在谨慎模式下,多个FileAppender实例跑在多个JVM下,能 够安全地写道同一个日志文件。RollingFileAppender会有些限制。Logback的FileAppender和它的子类包括 RollingFileAppender能够非常友好地从I/O异常中恢复。
配置文件可以处理不同的情况 开发人员经常需要判断不同的Logback配置文件在不同的环境下(开发,测试,生产)。而这些配置文件仅仅只有一些很小的不同,可以通过,和来实现,这样一个配置文件就可以适应多个环境。
Filters(过滤器) 有些时候,需要诊断一个问题,需要打出日志。在log4j,只有降低日志级别,不过这样会打出大量的日志,会影响应用性能。在Logback,你可以继续 保持那个日志级别而除掉某种特殊情况,如alice这个用户登录,她的日志将打在DEBUG级别而其他用户可以继续打在WARN级别。要实现这个功能只需 加4行XML配置。可以参考MDCFIlter 。
SiftingAppender(一个非常多功能的Appender) 它可以用来分割日志文件根据任何一个给定的运行参数。如,SiftingAppender能够区别日志事件跟进用户的Session,然后每个用户会有一个日志文件。
自动压缩已经打出来的log RollingFileAppender在产生新文件的时候,会自动压缩已经打出来的日志文件。压缩是个异步过程,所以甚至对于大的日志文件,在压缩过程中应用不会受任何影响。
堆栈树带有包版本 Logback在打出堆栈树日志时,会带上包的数据。
自动去除旧的日志文件 通过设置TimeBasedRollingPolicy或者SizeAndTimeBasedFNATP的maxHistory属性,你可以控制已经产生日志文件的最大数量。如果设置maxHistory 12,那那些log文件超过12个月的都会被自动移除。
总之,logback比log4j太优秀了,让我们的应用全部建立logback上吧 !
结构
Logback 的基本结构充分通用,可应用于各种不同环境。目前,logback 分为三个模块:Core、Classic 和 Access。
Core模块是其他两个模块的基础。
Classic 模块扩展了core模块。Classic 模块相当于 log4j的显著改进版。Logback-classic 直接实现了 SLF4J API,因此你可以在 logback 与其他记录系统如 log4j 和 java.util.logging (JUL)之间轻松互相切换。
Access 模块与 Servlet 容器集成,提供 HTTP 访问记录功能。本文不讲述 access 模块。
主要类
Logger
位于 logback-classic模块中,作为日志的记录器,把它关联到应用的对应的context后,主要用于存放日志对象,也可以定义日志类型、级别。详解可以见log4j logger
Appender
位于logback-core中,主要用于指定日志输出的目的地,目的地可以是控制台、文件、远程套接字服务器、MySQL、PostreSQL、Oracle和其他数据库、JMS和远程UNIX Syslog守护进程等。
Layout
位于logback-core中,负责把事件转换成字符串,格式化日志信息的输出,详细可以见log4j的layout详解
filter
Filter主要应用在appeder上,只在appender级别起作用,起到过滤日志相关作用。
日志级别
logback有5种级别,分别是TRACE < DEBUG < INFO < WARN < ERROR,定义于ch.qos.logback.classic.Level类中。
配置文件
logback一般通过logback.xml进行配置
配置读取步骤:
尝试在classpath下查找文件logback-test.xml
如果文件不存在,则查找文件logback.xml
如果两个文件都不存在,则用BasicConfigurator自动对自己进行配置,把记录输出到控制台
configuration
1 | <configuration scan="true" scanPeriod="60 seconds" debug="false"> |
scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
contextName
每个logger都关联到logger上下文,默认上下文名称为“default”。但可以使用contextName标签设置成其他名字,用于区分不同应用程序的记录
1 | <property name="glmapper-name" value="glmapper-demo" /> |
property
用来定义变量值的标签,property标签有两个属性,name和value;其中name的值是变量的名称,value的值时变量定义的值。通过property定义的值会被插入到logger上下文中。定义变量后,可以使“${name}”来使用变量。如上面的xml所示。
logger
用来设置某一个包或者具体的某一个类的日志打印级别以及指定appender。
1 | <logger name="com.xpwi" level="debug" additivity="false" > |
继承,如果level没有设置级别,则继承最近的父 logger(该logger需显示定义level,直到rootLogger)的日志级别。
append累加:默认日志输出到当前logger的appender和所有祖先logger的appender中,可通过配置 “additivity”属性修改默认行为。默认为true。
root
根logger,也是一种logger,且只有一个level属性
1 | <!-- 至多只能配置一个root --> |
appender
负责写日志的组件,下面是其中一种类型配置
1 | <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> |
自定义Appender
继承 AppenderBase 就可以轻松地写自己的 appender。AppenderBase 处理过滤器、状态
信息和大多数 appender 共享的其他功能。派生类只需要实现一个方法:append(Object
eventObject)。
layout
配置日志的输出格式
filter
Logback提供两类Filter,一类是Regular Filter;另外一类是Turbo Filter。
Regular Filter主要应用在appeder上,只在appender级别起作用,Appender实例上可以绑定一个Regular Filter实例链。Regular Filter继承实现”ch.qos.logback.core.filter.Filter”类,自定义自己的regular filter需要继承ch.qos.logback.core.filter.Filter类,并实现decide()方法。
LevelFilter:级别过滤器,根据日志级别进行过滤。
EvaluatorFilter: 求值过滤器,评估、鉴别日志是否符合指定条件。
ThresholdFilter :临界值过滤器,过滤掉低于指定临界值的日志。当日志级别等于或高于临界值时,过滤器返回NEUTRAL;当日志级别低于临界值时,日志会被拒绝。
自定义filter
创建自己的过滤器很容易。只需要继承 Filter 抽象类并实现 decide()方法。将filter引入append即可。