博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
logback基本架构和运作逻辑以及一些常用的自定义方式
阅读量:5925 次
发布时间:2019-06-19

本文共 2268 字,大约阅读时间需要 7 分钟。

hot3.png

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

${outPattern}

5.logback热部工具Jordan

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

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

你可能感兴趣的文章
powershell 修改笔记本的电源设置
查看>>
Methods of quick exploitation of blind SQL Injection Vulnerabilities in Oracle
查看>>
Django 路由系统简述
查看>>
Liferay Dynamic CSS Filter方法的研究 - 计算资源文件的缓存base名
查看>>
DataGridView 判断新增行:
查看>>
Apache配置实现cgi
查看>>
基于OHCI的USB主机 —— 中断向量处理
查看>>
【干货】如何排查移动站点流量异常
查看>>
ubuntu 升级后没有载入vboxdrv 模块
查看>>
Angular企业级开发(5)-项目框架搭建
查看>>
.Net Micro Framework开发板用户简明手册
查看>>
一步一步SharePoint 2007之四十五:实现自定义Workflow(4)——运行Workflow
查看>>
DataGrid Web Control 连载之六
查看>>
敏捷个人手机应用:如何使用时中法习惯
查看>>
python写的简单发送邮件的脚
查看>>
Spring MVC应用web.xml两种配置
查看>>
linux shell 菜单
查看>>
一步一步SharePoint 2007之三十六:在SharePoint中实现Workflow(2)——创建一个Workflow...
查看>>
Redhat的Linux产品版本AS/ES/WS的联系与区别
查看>>
Windows Vista重要资源库 - Springboard 系列资源
查看>>