1. logback工程架构
- logback基于Maven,分为logback-core,logback-classic,logback-access三个module;
- 使用的时候一般需要三个jar包slf4j-api.jar及logback-classic.jar及logback-core.jar;
- 当你需要一些于servlet相关的功能的时后可以加入logback-access.jar(实际上用的很少)
2. 概念及运作流程
2.0 ILoggingEvent(实现类为LoggingEvent)
日志行为的抽象封装;
2.1 Logger
程序的API入口,;
2.2 Appender
- 具体负责处理日志事件(主要是RegularFilter过滤LoggingEvent,将日志事件格式化,处理成byte[]然后写到具体的位置);
- 但是请注意AsyncAppender的doAppend 方法,和一般的不一样,它会将LoggingEevent提交给自己attachAppenderImpl list处理;
2.3 LayoutEncoder
日志事件格式化,将逐渐被Encoder接口替代;
实际上Appender默认的encoder是对原本的默认PatternLayOut做了一次封装,类命叫PatternLayOutWrapperEncoder,调用的还是PatternLayOut的dolayOut方法;
2.4 Filter
主要分为全局性质的TurboFilter及RegularFilter;
2.4.1 TurboFilter
bind到loggerContext上,在logger.info(...)等等时,会先调用loggerContext里面的TurboFilterList对Msg进行判定,如果接收则尝试构造Logevent,然后分发给所有的Appender;
2.4.2 RegularFilter
bind到单独Appender上的,在doAppend时进行调用进行loggingEvent的判定;
2.5 MDC
主要是Threadlocal和inheritableThreadLocals那一套(保存线程本地变量可以按名称取出,可以被子线程通过浅拷贝式继承);主要是应对多线程环境查日志蛋疼的情况;
用途的话,举个例子:
在一个高负载的web服务上;你想找出某个请求的全部日志;
你需要这么做:
- 日志的layoutPattern 需要有%X{uuid}这段字符串
- 过滤器里面加入MDC.put("uuid", UUIDUtil.get());
- 获取请求的业务特征,去日志查找到UUID,比如 2w22dsdf2qe;
- cat log|grep 2w22dsdf2qe;
- 这个请求的全部日志就出来了;
3. Logger层次结构
- 每个logger必定有一个name,默认的情况下就是类的全限定名(com.aruforce.test.LogTest);
- 每个logger都有一个parent logger;比如名为com.aruforce.test的logger就是com.aruforce.test.LogTest logger的父级
- 最顶层有一个名为ROOT的Logger作为根logger,这个时特殊的没有父级logger
- 父logger的全部属性都可以被子级logger继承,如果子级不想继承父级的东西,可以配置addtivity=false
4. 一般常用的自定义的点及实现方式
4.1 自定义TurboFilter
- extend TurboFilter abstract class
- implment decide()
- 在logback.cml 里面配置上
4.2 自定义Appender
- extend AppenderBase
- implement append(Object eventObject)
- logback.xml 配置上
4.3 自定义RegularFilter
- extend the Filter abstract class
- implement the decide() method.
- bind to a appender
4.4 自定义PatternLayout
public class CustomConverter extends ClassicConverter{}
- 自己写个PaytternLayOut,加入这个Converter
public class CustomPatternLayOut extends PatternLayout{//这样内置的一些格式符号也可以直接使用 static { defaultConverterMap.put("Cus", CustomConverter.class.getName()); }}
3.logback.xml
${outPattern}
5.logback热部工具Jordan
严格的适配logback的..可以不用细究...好像也不应该出在这里...溜了...