首页 > 其他分享 >Log日志的实现原理

Log日志的实现原理

时间:2023-07-30 22:11:28浏览次数:42  
标签:调用 Log Format MDC 线程 原理 日志

log.info(" XXX");

打印日志的时候,Log组件会将“写入”动作封装成一个LogEvent事件,而这个事件的具体表现形式由Log Format和MDC共同控制,Format决定了Log的输出格式,而MDC决定了输出什么内容。

LogFormat 

Log组件定义了日志输出格式,这和我们平时使用“String.format”的方式差不多,集成了Sleuth后的Log输出格式是下面这个样子

"%5p [sleuth-traceA,%X{X-B3-TraceId:-},%X{X-B3-SpanId:-},%X{X-Span-Export:-}]"

MDC

MDC是通过InheritableThreadLocal来实现的,它可以携带当前线程的上下文信息。它的底层是一个Map结构,存储了一系列Key-Value的值。

SpringCloudd的Sleuth就是借助Spring的AOP机制,在方法调用的时候配置了切面,将链路追踪数据加入到了MDC中,这样在打印Log的时候,就能从MDC中获取这些值,

填入到Log Format中的占位符里。

由于MDC基于InheritableThreadLocal而不是ThreadLocal实现,因此假如在当前线程中又开启了新的子线程,那么子线程依然会保留父线程的上下文信息。

 

 InheritableThreadLocal和ThreadLocal相比,可以获取父类的值。重写了getMap、createMap方法。

 

源码学习

源码可以参考logback组件中LogEvent类的prepareForDeferredProcessing方法,了解MDC和Log Format是如何工作的。可以在打印log的地方打一个断点,本地启动项目后发起一次调用,然后一路跟进去。

/**应在序列化事件之前调用此方法。在使用异步或延迟日志记录时也应该调用它。
请注意,由于性能问题,此方法不提取调用方数据。提取呼叫者信息是呼叫者的责任。
**/
public void prepareForDeferredProcessing() {
    this.getFormattedMessage();
    this.getThreadName();
    // fixes http://jira.qos.ch/browse/LBCLASSIC-104
    this.getMDCPropertyMap();
}

 

标签:调用,Log,Format,MDC,线程,原理,日志
From: https://www.cnblogs.com/jiangym/p/17592119.html

相关文章

  • Mit6.s081 Lec15: xv6 的 logging system
    Logginglayerfilesystem设计的一大重要问题就是crashrecovery。这是因为文件系统操作往往涉及向磁盘多次写入,而几次写入之后的crash可能导致磁盘上的文件系统处于一个不一致的状态。Forexample,supposeacrashoccursduringfiletruncation(settingthelengthof......
  • Java之日志
    Java之日志概述日志可以用来记录程序运行过程中的信息,并可以进行永久存储。优势可以将系统执行的信息选择性的记录到指定的位置(控制台、文件中、数据库中)可以随时以开关的形式控制是否记录日志,无需修改源代码 输出语句日志技术输出位置只能是控制台可以将......
  • MySQL使用binlog恢复数据
    1.什么是BinlogMySQL的二进制日志(Binlog)是一种事务日志,用于记录对数据库的更改操作。Binlog主要用于MySQL复制和恢复:复制:从库通过拉取主库的binlog实现主从数据一致恢复:通过重放binlog恢复数据丢失或误操作情况1.1.Binlog的工作原理在MySQL中,每个事务都会在提交后......
  • log4j JNDI注入漏洞
    log4j漏洞复现及详细分析-FreeBuf网络安全行业门户Vulhub-Docker-Composefileforvulnerabilityenvironment1、介绍名称:log4jJNDI注入漏洞编号:CVE-2021-44228原理:应用:log4j版本:log4j-1.2.xlog4j:1.2.17及之前版本log4j-1.2.8log4j:1.2.14log4j:1.2.12log4j:1......
  • bin log 、redo log 跟、undo log
    MySQL日志包含了错误日志、查询日志、慢查询日志、事务日志、二进制日志等,如果存储引擎使用的是InnoDB,二进制日志(binlog)和事务日志(包括redolog和undolog)#redolog(用于记录的修改之后的值)=====》针对持久性MySQL是怎么样保证持久性:在每次事务提交的时候,将该事务涉及......
  • m基于双PN序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果本系统进行Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:2.算法涉及理论知识概要基于双PN序列的数据帧检测和帧同步是一种在通信系统中常用的技术,用于确保接收端正确地识别和解析传输的数据帧。在本文中,我将详细介绍基于双PN序列的数据帧检测的数学原理和......
  • log4j2配置需要
    在resource中建立log4j2.xml文件进行配置查看代码<?xmlversion="1.0"encoding="UTF-8"?><configuration><loggers><!--level指定日志级别,从低到高的优先级:TRACE<DEBUG<INFO<WARN<ERROR......
  • m基于UW序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果本系统进行了Vivado2019.2平台的开发,仿真结果如下所示:2.算法涉及理论知识概要UW序列是一种特殊类型的伪随机二进制序列,通常用于数据帧检测和帧同步。UW序列具有以下特性:平衡性:UW序列中的1和0的数量大致相等,确保序列具有良好的自相关性。低互相关:不同UW序列之间......
  • m基于双PN序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果 本系统进行Vivado2019.2平台的开发,其中Vivado2019.2仿真结果如下:   2.算法涉及理论知识概要       基于双PN序列的数据帧检测和帧同步是一种在通信系统中常用的技术,用于确保接收端正确地识别和解析传输的数据帧。在本文中,我将详细介绍基于双PN......
  • m基于UW序列的数据帧检测,帧同步verilog实现,含testbench
    1.算法仿真效果 本系统进行了Vivado2019.2平台的开发,仿真结果如下所示:   2.算法涉及理论知识概要      UW序列是一种特殊类型的伪随机二进制序列,通常用于数据帧检测和帧同步。UW序列具有以下特性: 平衡性:UW序列中的1和0的数量大致相等,确保序列具有良好的自相......