Logback日志系统是SLF4J的原生实现。同时,Logback也是Log4j的继任者,补全了Log4j的不足。

1. Logback的模块组成

  • logback-core,其他模块的功能基础
  • logback-classic

可以看作Log4j的增强版实现。
实现了SLF4J API,能够在部署的时候提供给应用日志功能。

  • logback-access

集成了Servlet容器(Tomcat,Jetty),提供以HTTP方式访问日志的功能。

2. Logback在Maven项目中的应用

在应用中使用兼容SLF4J的日志系统,无需在构建时依赖任何具体的日志系统,而只需要依赖SLF4J API,POM配置示例如下:

<dependency>   <groupId>org.slf4j</groupId>   <artifactId>slf4j-api</artifactId>   <version>1.7.9</version> </dependency>

而对于实际部署时使用的日志系统,无需在POM中配置,只需将日志系统的jar文件置于应用部署环境的classpath中即可。

但是为了部署方便,可以直接在POM中给出对日志系统的依赖。例如,应用中使用Logback日志系统,配置POM如下即可:

<dependency>   <groupId>org.slf4j</groupId>   <artifactId>slf4j-api</artifactId>   <version>1.7.9</version> </dependency> <dependency>   <groupId>ch.qos.logback</groupId>   <artifactId>logback-classic</artifactId>   <version>1.2.3</version> </dependency>

3. Logback的MDC功能概述

Logback的设计目标就是审计、调试复杂的分布式应用。

在分布式应用中,为了区分不同客户端的日志输出,往往为每个客户端实例化一个单独的logger。但是这样将导致大量日志的产生,而且增加了日志管理的负担。

为此,Logback采用了更轻量级的技术,为一个客户端的每一个日志请求打上唯一识别的时间戳,而这是通过SLF4J的MDC实现的。为了给每个日志请求打上唯一识别的时间戳,必须利用请求的上下文信息,即将请求的上下文信息装入MDC,并在需要的时候被Logback的日志组件提取。

4. Logback的MDC功能实现

Logback是在logback-classic模块中实现了SLF4J的MDC功能。

MDC中管理的数据(简称MDC数据)是以单个线程为单位进行访问的,即对MDC数据的操作(如put, get)只对当前线程有效,所以也永远是线程安全的。
在服务端,为每个请求分配一个线程进行处理,所以每个服务端线程处理的请求,都具有唯一的MDC上下文数据。

子线程不会自动继承父线程的MDC数据。所以在创建子线程时,可以先调用MDC的getCopyOfContextMap()方法以返回一个Map<String, String>对象,从而获取父线程的MDC数据,然后再在子线程的开始处,最先调用MDC的setContextMap()方法为子线程设置父线程的MDC数据。从而能够在子线程中访问父线程的MDC数据。

在使用java.util.concurrent.Executors管理线程时,使用同样的方法让子线程继承主线程的MDC数据。

但是,在Web应用中,一个请求可能在不同的阶段被多个线程处理。这时,只是在服务端的处理线程中设置MDC数据,并不能保证请求的某些信息(如用户的认证信息等)总是能够被处理线程访问到。为了在处理一个请求时能够保证某些信息总是可访问,建议使用Servlet Filter,在请求到来时就将信息装入到MDC中,在完成所有的后续处理后,再次通过过滤器时将MDC数据移除。

		public class MyFilter implements Filter { 			public void doFilter(ServletRequest request, ServletResponse response, 				FilterChain chain) throws IOException, ServletException { 				... 				MDC.put(MY_KEY, myValue); 				... 			    try { 				  chain.doFilter(request, response); 				} finally { 				  if (MDC.contains(MY_KEY)) { 					MDC.remove(MY_KEY); 				  } 				}

Logback自带的ch.qos.logback.classic.helpers.MDCInsertingServletFilter能够将HTTP请求的hostname, request URI, user-agent等信息装入MDC,只需在web.xml中设置(建议MDCInsertingServletFilter作为第一个Filter配置,原因请读者思考),后续处理过程就可以直接访问如下请求参数的值:

  • req.remoteHost
  • req.xForwardedFor
  • req.method
  • req.requestURI
  • req.requestURL
  • req.queryString
  • req.userAgent

参考链接:

    https://logback.qos.ch/index.html
    http://logback.qos.ch/manual/mdc.html

热门文章

并发编程基础底层原理学习_在线工具

进程 进程就是应用程序在内存中分配的空间,也就是正在运行的程序,各个进程之间互不干扰。同时进程保存着程序每一个时刻运行的状态。进程的两个基本元素是程序代码和与代码关联的数据集。进程执行的任意时刻包含了

东北农大动物医院价目表查询(东北农大动物医院价目表查询最新)

摘要: 今天给各位分享东北农大动物医院价目表查询的知识,其中也会对东北农大动物医院价目表查询最新进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、农.

1月8日更新19M/S,2025年最新高速SSR/Clash/Shadowrocket/V2ray订阅链接免费节点地址分享

这一次的节点更新覆盖了欧洲、美国、新加坡、韩国、加拿大、日本、香港等地区,最高速度可达19 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

2月22日更新21M/S,2025年最新高速SSR/Shadowrocket/V2ray/Clash订阅链接免费节点地址分享

这一次的节点更新覆盖了香港、日本、加拿大、韩国、新加坡、美国、欧洲等地区,最高速度可达21 M/S。只需复制下方的Clash/v2ray订阅链接,在客户端添加后即可正常使用。

合肥宠物领养中心有哪些公司 合肥宠物领养中心有哪些公司招聘

摘要: 大家好,今天小编关注到一个比较有意思的话题,就是关于合肥宠物领养中心有哪些公司的问题,于是小编就整理了2个相关介绍合肥宠物领养中心有哪些公司的解答,让我们一起看看吧。蜀山动物园开放

畜牧局买疫苗(畜牧局发放的疫苗都什么牌子的)

摘要: 今天给各位分享畜牧局买疫苗的知识,其中也会对畜牧局发放的疫苗都什么牌子的进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录一览:1、蓬莱区畜牧局有猫疫.

Logback及其MDC功能详解

Logback日志系统是SLF4J的原生实现。同时,Logback也是Log4j的继任者,补全了Log4j的不足。 1. Logback的模块组成 logback-core,其他模块的功能

Win10 的 WPF 程序的 wisptis 服务是附加到进程的窗口

在 Win10 下,没有 WISPTIS 服务进程,和 win7 不相同。但是 WPF 依然通过 PENIMC 从 COM 获取实时触摸消息,那么 WPF 是从哪里获取 通过 WindowDebugg

取消动物防疫收费通知范文(取消动物防疫收费通知范文怎么写)

摘要: 本篇文章给大家谈谈取消动物防疫收费通知范文,以及取消动物防疫收费通知范文怎么写对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。本文目录一览:1、幼儿园寒假作业收费通知怎么..

服务器安全加固 – Linux_在线工具

一、账号和口令 1.1 禁用或删除无用账号 查看 /etc/passwd 文件查看是否有无用的账号,如果存在则删除,降低安全风险。 操作步骤: 使用命令userdel <用户名>&nbs

归纳