logback之pattern详解以及源码分析

目录

(一)pattern关键字介绍

(二)源码分析


(一)pattern关键字介绍

%d或%date:表示日期,可配置格式化%d{yyyy-MM-dd HH:mm:ss}

%r或%relative:也是日期,不过显示的是相对时间,是相对于日志框架加载开始的时间,单位是ms。

%level或%le或%p:表示日志级别

%t或%thread:表示线程名

%lo或%logger或%c(小写c):表示logger的名称,即 LoggerFactory.getLogger传入的名称,如果传入的是class则为类全限定名。

%m或%msg或%message:表示日志消息

%C(大写C)或%class:日志写入调用所在类名

%M或%method:日志写入调用所在的方法

 %L或者%line:日志写入调用所在的行数

%F或者%file:日志写入调用所在的文件

%X或%mdc:mdc写入的信息,记得mdc设置后,需要在finally中删除,避免内存泄漏。

%ex或%exception或%throwable:异常信息

%rEx或%rootException:带根因的异常信息

%xEx或%xException或%xThrowable:显示继承的异常信息

显示的异常信息量:%rootException > %xException > %exception;如果pattern中没有指定异常显示,那么默认会在末尾添加异常显示,根据上下文中的packagingDataEnabled设置,如果为true,加的是%xException,false为%exception(默认为false); %nopex或%nopexception:表示不打印异常信息。%ex在有异常的情况下回自动添加,而如果配置了这个那么就不会输出异常,所以和%ex是互斥的

%cn或%contextName:日志上下文的名称

%caller:表示日志详细的调用链

%maker:显示日志的标记,marker主要用于日志的分类和过滤。打印日志时可以调带Marker参数的方法,实现Marker的传递。

%property: 显示配置,会先查日志上下文的配置,如果没有从系统配置中获取,如:%property{java.version}就是打印java版本

%n: 表示换行

以下面格式的pattern,我们打印一个带异常的日志,看看效果,也好对应:

%d{yyyy-MM-dd HH:mm:ss} -%r [%thread] %-5level %logger{50} %class.%method-%line %F [%X{logTrackId}][%cn] [%caller] [%marker] %property{java.version} - %msg%n

使用下面代码进行比较全的日志打印,这样和日志对照起来,对关键字就有了更具体的理解:

public void doNothing() {String logTrackId = UUID.randomUUID().toString();MDC.put("logTrackId", logTrackId);try {RuntimeException causeException = new RuntimeException("this is a cause exception");Marker marker = MarkerFactory.getMarker("basicMarker");ImpossibleLogger.warn(marker, "some exception happen:", new RuntimeException("this is encosing exception", causeException));} finally {MDC.remove("logTrackId");}
}

(二)源码分析

日志是如何根据pattern进行转化的呢?

下面我们看一下源码:

首先是<pattern>标签对应的PatternLayout类:这里定义了很多默认的转换器类:

可以看到关键字d和date都匹配的DateConverter。所以我们在pattern中定义的每个关键字都会有一个对应的转换器,既然是转换器那么一定会有转换的方法:convert,可以看一下DateConverter的convert方法,看一下它是如何转换的:

很简单只是把ILoggingEvent中获取时间戳,然后使用cachingDateFormatter进行转换,cachingDateFormatter实际上只是包装了一个SimpleDateFormat对象,因为其是线程不安全的,所以使用cachingDateFormatter将其包了一层,调用format时使用synchronized进行同步保证线程安全。

对于一个日志的格式化转换就是循环调用每个转换器然后将转换的信息添加到字符串中

那么转换器又是怎么加载到PatternLayout中的呢?可以看PatternLayoutBase.start方法,这个方法在Context初始化创建Pattern后会被调用。

核心的步骤有3个:

(1)创建一个解析器Parser,然后调用parse对pattern字符串进行解析,解析出的结果是一个Node层级对象,里面包含了%d、%thread等都被解析成对应的Node

(2)getEffectiveConverterMap获取有效的Converter集合,它主要把默认的转换器和以及context中PATTERN_RULE_REGISTRY存储自定义的转换器获取过来。

所以我们实际上可以通过往context中的PATTERN_RULE_REGISTRY这个key对应的map中写入自己的转换器类实现。key是关键字,值是自定义的转换器类名,而实现方式实际上是在配置文件中configuration节点下定义conversionRule标签,这个标签会被解析成converter,可参见ConversionRuleAction这个类

但要注意的是,xml的解析是有顺序的,所以conversionRule自定义的转换器需要在使用此转换器对应关键字的pattern之前,否则pattern解析时从PATTERN_RULE_REGISTRY获取不到对应的转换器。

(3)调用p.compile:这里就是转换器实际实例化创建的地方

第一步解析的Node有3中类型,分别是Node.LITERAL(字面量)、Node.COMPOSITE_KEYWORD(组合关键字)、Node.SIMPLE_KEYWORD(简单关键字)。字面量就是对应我们的pattern中的一些常量,如空格、-等会直接输出到日志中,不做转换。而组合转换器是比较复杂的转换器,会有子转换器的嵌套。我们常用的大部分都是SIMPLE_KEYWORD。

主要到DynamicConverter都会调用setFormattingInfo以及setOptionList,这些两个可能会被转换器用到。

如我们经常在%d后会加日期格式化yyyy-MM-dd HH:mm:ss,这个就会放到OptionList中,通过,分隔,如日期还可以设置时区%d{yyyy-MM-dd HH:mm:ss,GMT-8:00},这是OptionList中就有两个值

而%-5level中的-5则会设置到FormattingInfo,FormattingInfo主要设置关键字转换的字符串的最小长度和最大长度,用.分隔,如:%-5,7level,这里5就是最小值,7是最大值,表示日志级别最小显示长度为5,最大长度为7。最小值和最大值都可以带符号,最小值的正负号表示字符串长度不够时补齐的方向,-号是右边补齐,所以level如果是warn,那么不够5个字符串,那么右边会补一个空格。而最大值正负号则字符串超出,需要截取掉超出最大值的字符串,表示截取的方向,-号是截取左边的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497345.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【期末复习】JavaEE(下)

1. MVC开发模式 1.1. 运行流程 1.2. SpringMVC 核心组件 1.3. 注解解释 2. ORM与MyBatis 2.1. ORM—对象关系映射 2.2. MyBatis 2.2.1. 创建步骤 会话是单例的&#xff0c;不能跨方法。&#xff08;单例的原因主要是从数据安全角度出发&#xff09; import org.apache.ibatis…

作业帮基于 Apache DolphinScheduler 3_0_0 的缺陷修复与优化

文|作业帮大数据团队&#xff08;阮文俊、孙建业&#xff09; 背 景 基于 Apache DolphinScheduler &#xff08;以下简称DolphinScheduler&#xff09;搭建的 UDA 任务调度平台有效支撑了公司的业务数据开发需求&#xff0c;处理着日均百万级别的任务量。 整个 UDA 的架构如…

电脑缺失sxs.dll文件要怎么解决?

一、文件丢失问题&#xff1a;以sxs.dll文件缺失为例 当你在运行某个程序时&#xff0c;如果系统提示“找不到sxs.dll文件”&#xff0c;这意味着你的系统中缺少了一个名为sxs.dll的动态链接库文件。sxs.dll文件通常与Microsoft的.NET Framework相关&#xff0c;是许多应用程序…

Web开发:ORM框架之使用Freesql的分表分页写法

一、自动分表&#xff08;高版本可用&#xff09; 特性写法 //假如是按月分表&#xff1a;[Table(Name "log_{yyyyMM}", AsTable "createtime2022-1-1(1 month)")]注意&#xff1a;①需包含log_202201这张表 ②递增规律是一个月一次&#xff0c;确保他们…

【数据结构与算法】单向链表

一、什么是链表 链表由一系列节点组成&#xff0c;每个节点都包含一个 data 域&#xff08;存放数据&#xff09;和一个 next 域&#xff08;指向下一节点&#xff09;。链表中的节点可以按照任意顺序存放在内存中&#xff0c;它们之间并不连续。每个节点都记录了下一个节点的地…

【ACCSS】2024年亚信安全云认证专家题库

文件包含&#xff1a; 亚信安全ACCSS认证2019年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;2&#xff09; 亚信安全ACCSS认证2019年真题&#xff08;3&#xff09; 亚信安全ACCSS认证2020年真题&#xff08;1&#xff09; 亚信安全ACCSS认证2020年…

OpenCV-Python实战(10)——形态学

1、腐蚀 cv2.erode() 可以删除图像中的噪音点。 可以删除毛边。 分割图像&#xff08;当图像连接的不够紧密时&#xff09; 。 img cv2.erode(src*,kernel*,anchor*,iterations*,borderType*,borderValue*)img&#xff1a;目标图像。 src&#xff1a;原始图像。 kernel&…

用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容

有一种epub文件&#xff0c;其中的注释以弹窗形式显示&#xff0c;如下图&#xff1a; 点击注释引用后&#xff0c;对应的注释内容会弹出在页面中显示&#xff0c;再次点击弹窗外的任意位置该弹窗即关闭&#xff0c;关闭后点击任意注释引用&#xff0c;对应的注释内容会弹窗显示…

Ngnix介绍、安装、实战及用法!!!

一、Nginx简介 1、Nginx概述 Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理服务器&#xff0c;特点是占有内存少&#xff0c;并发能力强&#xff0c;能经受高负载的考验,有报告表明能支持高达 50,000 个并发连接数 。 2、正向代理 正向代理&#xff1a;如果把局…

【超详细】Git的基本概念和基本使用方式

Git是程序开发中非常重要的工具&#xff0c;是一种分布式版本控制系统&#xff0c;可用于管理和追踪软件开发过程中的变化。那么关于Git的基本操作你知道吗&#xff1f;下面是Git的基本概念和使用方式的解释&#xff1a; 仓库&#xff08;Repository&#xff09;&#xff1a;Gi…

springboot503基于Sringboot+Vue个人驾校预约管理系统(论文+源码)_kaic

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装个人驾校预约管理系统软件来发挥其高效地信息处理的作用&am…

【Rust自学】7.4. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.4.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例&#xff1a; m…

Pandas03

Pandas01 Pandas02 文章目录 内容回顾1 排序和统计函数2 缺失值处理2.1 认识缺失值2.2 缺失值处理- 删除2.3 缺失值处理- 填充非时序数据时序数据 3 Pandas数据类型3.1 数值类型和字符串类型之间的转换3.2 日期时间类型3.3 日期时间索引 4 分组聚合4.1 分组聚合的API使用4.2 分…

平凉一窝丝:丝丝缕缕的舌尖风情

在平凉的美食版图中&#xff0c;食家巷一窝丝以其独特的工艺和诱人的口感&#xff0c;占据着重要的一席之地&#xff0c;成为了平凉人心目中的经典美食之一。从外观上看&#xff0c;平凉食家巷一窝丝如同一盘精心雕琢的金丝&#xff0c;根根细丝紧密盘绕&#xff0c;整齐而美观…

Wordly Wise 3000 国际背单词01 介绍 + 测词汇量

&#x1f4da; Wordly Wise 3000 国际背单词01 介绍 测词汇量 &#x1f31f; 大家好&#xff01;我们正式启动背Wordly Wise 3000单词&#xff0c;旨在利用国际资源和科学的学练方法&#xff0c;帮助大家更得效地坚持学练单词。我们将通过图文和Video等多种形式与大家分享经验…

C++进阶重点知识(一)|智能指针|右值|lambda|STL|正则表达式

目录 1智能指针1.shared_ptr1.1 shared_ptr的基本用法使用shared_ptr要注意的问题运用 2.unique_ptr独占的智能指针示例&#xff1a;管理动态内存 3.weak_ptr弱引用的智能指针weak_ptr的基本用法lock 的作用&#xff1a;weak_ptr返回this指针weak_ptr解决循环引用问题weak_ptr使…

计算机网络 (9)数据链路层

前言 计算机网络中的数据链路层&#xff08;Data Link Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;参考模型中的第二层&#xff0c;位于物理层和网络层之间。它在物理层提供的服务基础上&#xff0c;负责在相邻节点之间建立、维护和终止链路&#xff0c;确保数…

【Elasticsearch】DSL查询文档

目录 1.DSL查询文档 1.1.DSL查询分类 1.2.全文检索查询 1.2.1.使用场景 1.2.2.基本语法 1.2.3.示例 1.2.4.总结 1.3.精准查询 1.3.1.term查询 1.3.2.range查询 1.3.3.总结 1.4.地理坐标查询 1.4.1.矩形范围查询 1.4.2.附近查询 1.5.复合查询 1.5.1.相关性算分 …

国内独立开发者案例及免费送独立开发蓝图书

独立开发者在国内越来越受到关注&#xff0c;他们追求的是一种自由且自给自足的工作状态。 送这个&#xff1a; 少楠light&#xff08;Flomo、小报童、如果相机&#xff09;&#xff1a;他们是独立开发者的典范&#xff0c;不仅开发了多款产品&#xff0c;还坚信“剩者为王”…

Browser Use:AI智能体自动化操作浏览器的开源工具

Browser Use:AI智能体自动化操作浏览器的开源工具 Browser Use 简介1. 安装所需依赖2. 生成openai密钥3. 编写代码4. 运行代码5. 部署与优化5.1 部署AI代理5.2 优化与扩展总结Browser Use 简介 browser-use是一个Python库,它能够帮助我们将AI代理与浏览器自动化操作结合起来;…