通过Slf4j中的MDC实现在日志中添加用户IP功能

一、slf4j中MDC是什么

slf4j除了trace、debug、info、warn、error这几个日志接口外,还可以配合MDC将数据写入日志。换句话说MDC也是用来记录日志的,但它的使用方式与使用日志接口不同。

在使用日志接口时我们一般这么做

java 复制代码
  log.debug("log debug");

MDC从使用方式上有些不同,我对它的理解是MDC可以将一个处理线程中你想体现在日志文件中的数据统一管理起来,根据你的日志文件配置决定是否输出。

比如以下但不限于以下场景可以考虑使用MDC来达到目的

1.我们想在日志中体现请求用户IP地址

2.用户使用http客户端的user-agent

3.记录一次处理线程的日志跟踪编号(这个编号目的是为了查询日志方便,结合grep命令能根据跟踪编号将本次的处理日志全部输出)

二、功能实现

java 复制代码
public class LogInterceptor implements HandlerInterceptor {
	
	private final static String IP_KEY = "ip";

	@Override
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		// 删除用户IP
		MDC.remove(IP_KEY);
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)
			throws Exception {
	}

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		String ip = IPUtils.getIpAddr(request);
		MDC.put(IP_KEY, ip);
		return true;
	}
}

三、参考资料

slf4j中的MDC-CSDN博客

相关推荐
lambo mercy4 分钟前
Day3:结构化输出
java·数据库·oracle
程序员清风13 分钟前
最短路径算法:BFS、Dijkstra 与 Floyd
java·算法·宽度优先
SL_staff1 小时前
为什么业务总在等BI报表?JVS-BI的可视化ELT实践解析
spring·数据分析·数据可视化
智能直播1 小时前
RK3528 V4L2 框架 UVC 接口自动获取 H.264 / MJPEG / YUYV 格式:从内核采集到硬解分发
java·网络·实时音视频·视频编解码·h.264
171320330计算机毕设编程2 小时前
计算机毕业设计 基于YOLO改进算法的车辆特征识别系统设计与实现--lw
java·大数据·python·sql·算法
badhope2 小时前
Spring AI Alibaba停更:Java程序员的信任,还能被辜负几次?
java·spring
const_qiu2 小时前
第一章 1.1-1.2:基础模型调用与 TypeScript 入门 —— Java 开发者的视角
java·javascript·typescript
Wang's Blog2 小时前
Java 项目实战: 交友项目 - Dubbo 负载均衡策略与实战验证
java·dubbo·交友
SL_staff2 小时前
销售知识库7天落地实践:面向业务侧的零代码嵌入方案
java·开源·产品
GreatSQL社区2 小时前
主从复制SQL线程中断——字符集砸出的坑
java·数据库·算法