logback–进阶–03–日志打印步骤
代码位置
https://gitee.com/DanShenGuiZu/learnDemo/tree/master/logback-learn
1、步骤
当用户调用 logger 的日志打印方法时,logback 框架所采取的步骤是怎么样的呢?
现在我们分析当用户调用名为 “com.nobody.UserService” 的 logger 的 info() 方法时,logback 采取的步骤
步骤1、获得过滤器链决策
- 如果过滤器存在,那么 TurboFilter 链会被调用。
- TurboFilter可以设置一个上下文范围阈值,或过滤掉某些日志
- 如果过滤器链的答复是 FilterReply.DENY,那么日志记录请求会被抛弃。
- 如果过滤器链的答复是 FilterReply.NEUTRAL,走步骤2。
- 如果过滤器链的答复是 FilterReply.ACCEPT,则跳过步骤2,直接跳至步骤3。
步骤2、logger 级别比较规则
在此步骤中,logback 将 logger 的有效级别与打印请求级别进行比较。
1. 如果根据级别规则禁用了日志记录请求,丢弃该请求
2. 如果请求打印日志的级别 小于 logger 设定的级别,丢弃该请求
3. 如果请求打印日志的级别 大于等于 logger 设定的级别,走步骤3。
步骤3、创建一个 LoggingEvent 对象
- 如果请求在先前的过滤器中存活下来了,则 logback 将创建一个 ch.qos.logback.classic.LoggingEvent 对象
- LoggingEvent 对象 包含请求的所有相关参数,例如
- 请求的 logger
- 请求级别
- 日志消息
- 可能与请求一起传递的异常
- 当前时间
- 当前线程
- 跟发出日志记录请求相关的类的各种数据以及MDC
步骤4、调用 appenders
创建 LoggingEvent 对象后,logback 将调用所有能用的 appenders 的 doAppend() 方法。
步骤5、格式化输出
- 被调用的 appender 负责格式化日志记录事件。但是,一些但不是全部 appender 将格式化日志记录事件的任务委托给 layout。
- layout 会格式化 LoggingEvent 实例,并以字符串形式返回结果。
- 注意:某些 appender,例如 SocketAppender 不会将日志记录事件转换为字符串,而是将其序列化。因此,它们没有 layout,也不需要 layout。
步骤6、发出 LoggingEvent
日志记录事件被完全格式化后,每个 appender 会将其发送到其目的地