基于spring boot 和MDC实现 同一笔记录的日志跟踪实现--1.filter
同一个项目中,一般包含controller/servlet、service、dao等。1笔记录的日志贯穿于controller、service、dao中,在并发情况下,那如何找出该笔日志?
可通过以下三种方式实现:
1、filter:依赖servlet容器
2、Interceptor:依赖spring
3、AOP:spring boot中,不能拦截servlet(我试过的,但可能也行)
以下时filter的实现。
首先,包结构:

代码实现:
logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{requestId}] %p | %logger{20}.%M:%L - %m%n</pattern>
</encoder>
</appender>
<!-- TRACE < DEBUG < INFO < WARN < ERROR -->
<root level="INFO">
<appender-ref ref="console"/>
</root>
</configuration>
MdcLogEnhancerFilter
package com.ebc.slf4j.mdc.filter;
import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; import org.slf4j.MDC;
import org.springframework.stereotype.Component; import cn.hutool.core.lang.Console;
import cn.hutool.core.util.IdUtil;
@Component
public class MdcLogEnhancerFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
MDC.put("requestId", IdUtil.objectId());
filterChain.doFilter(servletRequest, servletResponse);
MDC.remove("requestId");//否则内存溢出
//Console.log("======{}",MDC.get("requestId"));//输出null
}
}
Application
package com.ebc.slf4j.mdc; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan; @SpringBootApplication
@ServletComponentScan(basePackages="com.ebc.slf4j.mdc.servlet")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
下边是业务类
M2Servlet
package com.ebc.slf4j.mdc.servlet; import java.io.IOException; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import com.ebc.slf4j.mdc.service.WelcomeService; @WebServlet("/M2Servlet")
@Slf4j
public class M2Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
log.info("进入了servlet");
WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(getServletContext());
WelcomeService welcomeService = (WelcomeService) wac.getBean("welcomeService");
String reStr = welcomeService.exec("遥远2");
log.info("service返回:{}",reStr);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
WelcomeService
package com.ebc.slf4j.mdc.service; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Service
@Slf4j
public class WelcomeService {
public String exec(String name) {
log.info("service接收到:{}",name);
return "hello "+name;
}
}
执行:http://localhost:8080/M2Servlet
结果:
2019-01-22 11:22:03.900 [5c468c5bcbb014209e2ea828] INFO | c.e.s.m.s.M2Servlet.doGet:20 - 进入了servlet
2019-01-22 11:22:03.900 [5c468c5bcbb014209e2ea828] INFO | c.e.s.m.s.WelcomeService.exec:11 - service接收到:遥远2
2019-01-22 11:22:03.900 [5c468c5bcbb014209e2ea828] INFO | c.e.s.m.s.M2Servlet.doGet:24 - service返回:hello 遥远2
基于spring boot 和MDC实现 同一笔记录的日志跟踪实现--1.filter的更多相关文章
- 基于Spring Boot/Spring Session/Redis的分布式Session共享解决方案
		
分布式Web网站一般都会碰到集群session共享问题,之前也做过一些Spring3的项目,当时解决这个问题做过两种方案,一是利用nginx,session交给nginx控制,但是这个需要额外工作较多 ...
 - step6----->往工程中添加spring boot项目------->修改pom.xml使得我的project是基于spring boot的,而非直接基于spring framework
		
文章内容概述: spring项目组其实有多个projects,如spring IO platform用于管理external dependencies的版本,通过定义BOM(bill of mater ...
 - 基于Spring Boot的图片上传
		
package com.clou.inteface.domain.web.user; import java.io.File; import java.io.IOException; import j ...
 - Https系列之三:让服务器同时支持http、https,基于spring boot
		
Https系列会在下面几篇文章中分别作介绍: 一:https的简单介绍及SSL证书的生成二:https的SSL证书在服务器端的部署,基于tomcat,spring boot三:让服务器同时支持http ...
 - 基于Spring Boot,使用JPA动态调用Sql查询数据
		
在<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>,<基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合 ...
 - 基于Spring Boot,使用JPA调用Sql Server数据库的存储过程并返回记录集合
		
在上一篇<基于Spring Boot,使用JPA操作Sql Server数据库完成CRUD>中完成了使用JPA对实体数据的CRUD操作. 那么,有些情况,会把一些查询语句写在存储过程中,由 ...
 - 基于Spring Boot、Spring Cloud、Docker的微服务系统架构实践
		
由于最近公司业务需要,需要搭建基于Spring Cloud的微服务系统.遍访各大搜索引擎,发现国内资料少之又少,也难怪,国内Dubbo正统治着天下.但是,一个技术总有它的瓶颈,Dubbo也有它捉襟见肘 ...
 - 基于Spring Boot和Shiro的后台管理系统FEBS
		
FEBS是一个简单高效的后台权限管理系统.项目基础框架采用全新的Java Web开发框架 —— Spring Boot 2.0.3,消除了繁杂的XML配置,使得二次开发更为简单:数据访问层采用Myba ...
 - Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台
		
Cola Cloud 基于 Spring Boot, Spring Cloud 构建微服务架构企业级开发平台: https://gitee.com/leecho/cola-cloud
 
随机推荐
- c语言实战: 计算时间差
			
计算时间差有两种,一种是把时间都转化为分钟数,一种是把时间都转化为小时,后者是会用到除法所以不可避免产生浮点数,所以我们选择转化为分钟数来计算. //题目:给定两个时间点计算它们的时间差,比如,1:5 ...
 - rpush()
			
批量插入多个value,并为消息队列模式 $pipe->rpush($key,$vlaues);//$values是多个value组成的一个数组
 - 前端基础 之 jQuery
			
浏览目录 jQuery介绍 jQuery的优势 jQuery对象 jQuery内容 一.jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户 ...
 - linux环境安装python
			
linux环境下安装python3,一步一步来吧! 安装python3 安装readline-devel依赖 ,用于解决python3安装完成后,退格和方向键乱码问题 yum install read ...
 - java反射中,Class.forName和classloader的区别
			
http://blog.csdn.net/qq_27093465/article/details/52262340
 - C++面试笔记--树
			
树 树的题目基本都是二叉树,但是面试官还没有说是不是二叉树的时候千万不要先把答案说出来,要是面试官说是多叉树,而你做的是二叉树就直接挂了! 一. 树的三种遍历.前序.中序.后序,如果直接考遍历,就肯定 ...
 - VB.NET提取TXT文档指定内容
			
今天有浏览论坛时,又看见一篇是读取TXT文本文件的论题.Insus.NET也想以自己的想法来实现,并分享于此. 文本文件是比较复杂,获取数据也是一些文本行中取其中一部分.为了能够取到较精准的数据,In ...
 - dubbo事件通知机制 (2)
			
此文已由作者赵计刚授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 142 * 反射执行xxxService.onthrow方法:至少要有一个入参且第一个入参类型为T ...
 - addEntriesFromDictionary用法
			
1.addEntriesFromDictionary在字典中的用法: NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithOb ...
 - Git 分支管理-git stash 和git stash pop
			
https://blog.csdn.net/u010697394/article/details/56484492 合并分支,冲突是难免的,在实际协作开发中我们遇到的情况错综复杂,今天就讲两个比较重要 ...