Logback日志上下文

Logback 日志上下文详解

在现代应用程序中,日志是用于调试、监控和诊断系统行为的关键工具。Logback 是 Java 世界中最常用的日志框架之一,它不仅提供了灵活的日志输出和格式化功能,还支持日志上下文(Logging Context),帮助开发者管理和定制日志信息。


1. 什么是 Logback 日志上下文(Logging Context)?

日志上下文(Logging Context)是 Logback 体系中的一个核心概念,负责管理日志的全局状态。每个应用程序中 Logback 都有一个默认的日志上下文,它是日志配置的顶层容器,控制所有日志记录器(Logger)和附加器(Appender)的行为。日志上下文主要包含:

  • 配置项:如 Appender、Logger 和 Layout 等日志配置。
  • 全局属性:一些公共的上下文信息,可以在日志中动态使用。
  • MDC(Mapped Diagnostic Context):提供线程范围内的上下文信息。
  • NDC(Nested Diagnostic Context):提供嵌套的上下文信息。

通过日志上下文,开发者可以为应用中的日志配置公共的上下文信息,并根据需要动态调整日志输出行为。


2. 日志上下文的基本使用

2.1 设置日志上下文属性

Logback 日志上下文允许开发者定义全局属性,可以在日志中动态使用这些属性。可以通过 logback.xml 配置文件中的 <property> 标签定义全局属性。

<configuration><!-- 设置全局属性 --><property name="applicationName" value="MyApp"/><property name="logDir" value="/var/logs/myapp"/><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>${logDir}/app.log</file><encoder><pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg [%X{traceId}]%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE"/></root>
</configuration>
  • 通过 <property> 标签定义的 applicationNamelogDir 属性,可以在配置文件的其他地方通过 ${propertyName} 引用。
  • %X{traceId} 是对 MDC 中 traceId 属性的引用,表示每一条日志都会输出与当前线程关联的 traceId(见下文)。
2.2 动态设置属性

有时在程序运行时动态设置日志上下文中的属性也是必要的。可以通过 LoggerContext 类进行动态操作。

import ch.qos.logback.classic.LoggerContext;
import org.slf4j.LoggerFactory;LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
context.putProperty("serverId", "server-123");

通过 LoggerContextputProperty 方法,可以在程序运行时动态设置全局属性。配置文件中可以使用 ${serverId} 来引用这个属性。


3. MDC(Mapped Diagnostic Context)

MDC 是 Logback 提供的一种机制,允许为每个线程存储一些上下文信息,并将这些信息附加到每条日志中。MDC 的典型用途是在多线程环境下,通过在每个线程中设置唯一的标识(如 traceIduserId),帮助开发者追踪同一业务请求相关的日志。

3.1 设置和获取 MDC 信息

在日志输出中,可以通过 SLF4J 提供的 MDC 类进行上下文数据的设置和获取。

import org.slf4j.MDC;public class MyService {public void processRequest() {// 设置 MDC 信息MDC.put("traceId", "12345-ABCDE");// 业务逻辑logger.info("Processing request");// 清除 MDC 信息MDC.clear();}
}

logback.xml 中配置日志格式时,可以通过 %X{key} 来引用 MDC 中的属性。例如:

<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg [%X{traceId}]%n</pattern>

输出的日志可能如下所示:

2024-09-08 10:15:30 [main] INFO  MyService - Processing request [12345-ABCDE]
3.2 MDC 的典型应用场景
  • 分布式系统中的追踪:在分布式系统中,每个请求通常会通过多个微服务。在请求开始时生成唯一的 traceId,并将其通过 MDC 传递给各个服务,日志中打印该 traceId,以便在系统中追踪一个请求的整个生命周期。
  • 用户会话日志:在处理与用户相关的请求时,可以将 userId 放入 MDC 中,日志会自动输出相关的用户信息。
3.3 MDC 清理

使用 MDC 时,需要注意在每个线程结束时清理 MDC 数据,防止线程复用时残留数据。可以通过 MDC.clear() 方法手动清理。

try {MDC.put("traceId", "12345");// 执行任务
} finally {MDC.clear();
}

4. NDC(Nested Diagnostic Context)

NDC 是 MDC 的嵌套版本,它用于提供嵌套的上下文信息。NDC 中的信息类似于堆栈,允许开发者在进入或退出某个方法时动态推入或弹出上下文信息。

4.1 NDC 使用示例

SLF4J 不再直接支持 NDC,但 Logback 仍然保留了该机制。开发者可以使用 NDC.push()NDC.pop() 来维护嵌套上下文信息。

import org.slf4j.NDC;public class MyService {public void methodA() {NDC.push("methodA-context");logger.info("Inside methodA");methodB();NDC.pop();}public void methodB() {NDC.push("methodB-context");logger.info("Inside methodB");NDC.pop();}
}

logback.xml 中,可以通过 %x 占位符引用 NDC 的信息:

<pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg %x%n</pattern>

日志输出可能如下所示:

2024-09-08 10:15:30 [main] INFO  MyService - Inside methodA methodA-context
2024-09-08 10:15:31 [main] INFO  MyService - Inside methodB methodA-context methodB-context

NDC 允许你在多层次的方法调用中提供详细的上下文信息,有助于理解复杂的嵌套调用。


5. 扩展 Logback 日志上下文

除了使用 MDC 和 NDC,Logback 还支持自定义扩展日志上下文。可以通过继承 ContextAwareBase 类来创建自定义的日志上下文信息。

5.1 自定义扩展示例
import ch.qos.logback.core.spi.ContextAwareBase;public class CustomContext extends ContextAwareBase {public void logWithCustomContext() {logger.info("This is a custom log context message");}
}

通过这种方式,可以在 Logback 的上下文中集成自定义的属性或信息。


6. 日志上下文的性能注意事项

在使用 MDC 时,每次日志输出时都会读取当前线程的 MDC 数据,这会带来一定的性能开销。为了减少性能开销,可以遵循以下几条建议:

  • 仅在必要时使用 MDC:MDC 提供了强大的上下文功能,但应该只在需要追踪请求上下文时使用。对于没有上下文需求的日志输出,避免使用 MDC。
  • 清理 MDC:确保在每个线程结束时清除 MDC 数据,以防止数据泄漏或误用。

7. 总结

Logback 日志上下文为开发者提供了一种强大且灵活的机制,用于记录具有丰富上下文信息的日志。通过使用全局属性、MDC 和 NDC 等机制,可以轻松实现复杂的日志管理功能,尤其是在分布式系统和多线程环境中。

  • MDC 允许将线程上下文信息绑定到日志,便于追踪请求或会话。
  • NDC 允许在嵌套的执行流中维护上下文堆栈,提供更加详细的日志信息。
  • 动态日志上下文 允许在运行时配置全局日志属性,适合在不同的环境下灵活调整日志行为。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ActiveMQ 的传输协议机制

ActiveMQ 通过网络连接器这种连接机制来实现客户端与服务端之间的通信&#xff0c;ActiveMQ支持的传输协议在activeMQ 安装目录的 conf/activemq.xml中的<transportConnectors>标签之内。 ActiveMQ 支持的 client 端和 broker 端的通讯协议有&#xff1a;TCP、NIO、UDP、…

芝法酱学习笔记(0.3)——SpringBoot下的增删改查

零、前言 书接上回&#xff0c;我们搭建了windows下的开发环境&#xff0c;并给出了一个hello world级别的多模块SpringBoot项目。 毕竟java后端开发&#xff0c;离不开数据库的操作&#xff0c;为方便后面内容的讲解&#xff0c;这里再做一期铺垫&#xff0c;core模块下新增一…

洛汗2搬砖攻略:VMOS云手机一键搬砖辅助教程!

在《洛汗2》的世界中&#xff0c;玩家往往需要长时间刷怪、任务和升级&#xff0c;手动操作往往会耗费大量时间和精力。这时候&#xff0c;使用VMOS云手机来辅助游戏&#xff0c;将是一个极佳的选择。VMOS云手机专为《洛汗2》提供了专属定制版云手机&#xff0c;内置游戏安装包…

2.Spring-容器-注入

注册&#xff1a;将组件放入容器中&#xff1b; 注入&#xff1a;让容器按需进行操作&#xff1b; 一、Autowired&#xff1a;自动注入组件 原理&#xff1a;Spring调用容器的getBean 二、Qualifier 精确指定 精确指定&#xff1a;如果容器中组件存在多个&#xff0c;则使用…

【Linux】ubuntu 16.04 搭建jdk 11 环境(亲测可用)

目录 0.环境 1.题外话 2.详细 0.环境 windows11 主机 Virtual Box 7.0 ubuntu 16.04系统 想搭建个 jdk11的环境&#xff0c;用于项目 1.题外话 因为虚拟机与主机传输文件不方便&#xff0c;所以可以尝试用共享文件夹的方式传输&#xff0c;亲测可用&#xff0c;参考以下博…

LeetCode题练习与总结:二叉树的最近公共祖先--236

一、题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也…

windows 安装配置nginx

进入到对应的nginx的配置文件里 80的这个server块里 添加 location / { return 301 https://$host$request_uri; # 301 永久重定向到 HTTPS } (如果是http重定向https&#xff0c;其他的可以删了 只保留截图中的内容) https的server块里面添加 证书的…

SLM7888兼容FAN7888—— 低压三相半桥驱动的理想之选

SLM7888系列型号&#xff1a; SLM7888CH&#xff1a;SOP20W SLM7888MD&#xff1a;TSSOP20 SLM7888是一款高压、高速的功率MOSFET和IGBT驱动器&#xff0c;它提供三个独立的高边、低边输出驱动信号便于用于三相电路。采用专有的高压集成电路和锁存免疫CMOS技术&…

二分查找算法(5) _山脉数组的峰顶索引

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 二分查找算法(5) _山脉数组的峰顶索引 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记&#xff0c;欢迎大家在评论区交流讨论&#x1f48c;…

< 微积分Calculus >

微积分 微分是把整体分拆为小部分来求它怎样改变 积分是把小部分连接在一起来求整体有多大&#xff0c;可以用来求面积、体积、中点和很多其他有用的东西。 lim极限 函数f(x) -> Q(x) y&#xff1a;x变量&#xff0c;f函数&#xff0c;Q(x)函数体&#xff08;多项式&am…

Centos下安装Maven(无坑版)

Linux 安装 Maven Maven 压缩包下载与解压 华为云下载源&#xff0c;自行选择版本 下面的示例使用的是 3.8.1 版本 wget https://repo.huaweicloud.com/apache/maven/maven-3/3.8.1/binaries/apache-maven-3.8.1-bin.tar.gz解压 tar -zxvf apache-maven-3.8.1-bin.tar.gz移…

Centos安装helm

Helm 是查找、分享和使用软件构建 Kubernetes 的最优方式。 两种安装方式&#xff0c;二进制安装、脚本安装。脚本安装服务器在下载安装包可能会下载失败。 脚本安装 官网提供了脚本安装 $ curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/sc…

清华大学开源 CogVideoX-5B-I2V 模型,以支持图生视频

CogVideoX 是源于清影的开源视频生成模型。 下表列出了我们在此版本中提供的视频生成模型的相关信息。 Model NameCogVideoX-2BCogVideoX-5BCogVideoX-5B-I2V (This Repository)Model DescriptionEntry-level model, balancing compatibility. Low cost for running and second…

基于Nginx搭建点播直播服务器

实现直播和点播离不开服务器⽀持&#xff0c;可以使用开源的NGINX服务器搭建直播和点播服务。 当然&#xff0c;NGINX本身是不⽀持视频的&#xff0c;需要为NGINX增加相应的RTMP模块进行支持。 1、下载nginx和rtmp模块 # nginx wget ht tp://nginx.org/download/nginx-1.18.…

Nginx反向代理简介,作用及配置;Nginx负载均衡简介,作用及配置;

一&#xff0c;Nginx反向代理 1.1简介 反向代理服务器位于用户与目标服务器之间&#xff0c;但是对于用户而言&#xff0c;反向代理服务器就相当于目标服务器&#xff0c;即用户直接访问反向代理服务器就可以获得目标服务器的资源。同时&#xff0c;用户不需要知道目标服务器的…

认知杂谈77《简单:通往高手的技巧》

内容摘要&#xff1a;          在信息爆炸、关系复杂的时代&#xff0c;简单是复杂背后的真谛。简单如“112”&#xff0c;是智慧的朴素呈现。简单有强大力量&#xff0c;像清泉般纯净&#xff0c;如“我爱你”简单却有力&#xff0c;基础财务知识也体现其在理财中的作…

java项目开发Spring框架

简化开发、框架整合、节约成本&#xff1b;官网网址&#xff1a;http://spring.io 耦合度高。 IOC 对象外部引入 1.导入Spring坐标 <dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId…

2024全国研究生数学建模竞赛(数学建模研赛)ABCDEF题深度建模+全解全析+完整文章

全国研究生数学建模竞赛&#xff08;数学建模研赛&#xff09;于9月21日8时正式开赛&#xff0c;赛程4天半&#xff0c;咱这边会在开赛后第一时间给出对今年的6道赛题的评价、分析和解答。包括ABCDEF题深度建模全解全析完整文章&#xff0c;详情可以点击底部的卡片来获取哦。 …

Zookeeper+消息队列(kafka)

目录 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper工作机制 3、Zookeeper数据结构 4、Zookeeper 应用场景 5、Zookeeper 选举机制 5.1、第一次启动选举机制 5.2、非第一次启动选举机制 二、部署 Zookeeper 集群 1、部署环境 2、安装 zookeeper 软件 3、设置主…

【第十八章:Sentosa_DSML社区版-机器学习之协同过滤】

【第十八章&#xff1a;Sentosa_DSML社区版-机器学习之协同过滤】 1.算子介绍 协同过滤是推荐系统中常用的一种方法。该算法旨在填补用户-产品关联矩阵中缺少的项。在算法中&#xff0c;用户和产品都是通过一组少量的潜在因素描述&#xff0c;这些潜在因素可以用于预测用户-产…