logback基本架构和运作逻辑以及一些常用的自定义方式

1. logback工程架构

  1. logback基于Maven,分为logback-core,logback-classic,logback-access三个module;
  2. 使用的时候一般需要三个jar包slf4j-api.jar及logback-classic.jar及logback-core.jar;
  3. 当你需要一些于servlet相关的功能的时后可以加入logback-access.jar(实际上用的很少)

2. 概念及运作流程

2.0 ILoggingEvent(实现类为LoggingEvent)

日志行为的抽象封装;

2.1 Logger

程序的API入口,;

2.2 Appender

  1. 具体负责处理日志事件(主要是RegularFilter过滤LoggingEvent,将日志事件格式化,处理成byte[]然后写到具体的位置);
  2. 但是请注意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服务上;你想找出某个请求的全部日志;

你需要这么做:

  1. 日志的layoutPattern 需要有%X{uuid}这段字符串
  2. 过滤器里面加入MDC.put("uuid", UUIDUtil.get());
  3. 获取请求的业务特征,去日志查找到UUID,比如 2w22dsdf2qe;
  4. cat log|grep 2w22dsdf2qe;
  5. 这个请求的全部日志就出来了;

3. Logger层次结构

  1. 每个logger必定有一个name,默认的情况下就是类的全限定名(com.aruforce.test.LogTest);
  2. 每个logger都有一个parent logger;比如名为com.aruforce.test的logger就是com.aruforce.test.LogTest logger的父级
  3. 最顶层有一个名为ROOT的Logger作为根logger,这个时特殊的没有父级logger
  4. 父logger的全部属性都可以被子级logger继承,如果子级不想继承父级的东西,可以配置addtivity=false

4. 一般常用的自定义的点及实现方式

4.1 自定义TurboFilter

  1. extend TurboFilter abstract class
  2. implment decide()
  3. 在logback.cml 里面配置上

4.2 自定义Appender

  1. extend AppenderBase
  2. implement append(Object eventObject)
  3. logback.xml 配置上

4.3 自定义RegularFilter

  1. extend the Filter abstract class
  2. implement the decide() method.
  3. bind to a appender

4.4 自定义PatternLayout

  1. public class CustomConverter extends ClassicConverter{}
  2. 自己写个PaytternLayOut,加入这个Converter
public class CustomPatternLayOut extends PatternLayout{//这样内置的一些格式符号也可以直接使用
		static {
        	defaultConverterMap.put("Cus", CustomConverter.class.getName());
    	}
}

3.logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="false" >
	<property name="outPattern" value="[%-5p] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] [%C] [%Cus]- %m%n" />
	<!-- console appender -->
	<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
		<layout class="CustomPatternLayOut">
			<pattern>${outPattern}</pattern>
		</layout>
	</appender>
	<root level="INFO">
		<appender-ref ref="CONSOLE" />
	</root>
</configuration>

5.logback热部工具Jordan

严格的适配logback的..可以不用细究...好像也不应该出在这里...溜了...

转载于:https://my.oschina.net/Aruforce/blog/2874042

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值