使用Spring MVC中的Interceptor和slf4j中的MDC实现日志归类标记
来源:互联网 发布:淘宝网信用卡网银支付 编辑:程序博客网 时间:2024/06/05 04:54
*
1.Interceptor的介绍
*
SpringMVC 中Interceptor 拦截器的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行用户登陆、日志记录、性能评估、权限控制等。
SpringMVC 中的Interceptor拦截请求是通过HandlerInterceptor来实现的。SpringMVC中实现类的可以通过实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter类。
Interceptor具体接口定义如下(来至源码):
package org.springframework.web.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public interface HandlerInterceptor { boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception; void postHandle( HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception; void afterCompletion( HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception;}
注:以上部分内容摘要至SpringMVC 中的Interceptor 拦截器,更多关于Interceptor的介绍可以参考SpringMVC 中的Interceptor 拦截器。
2.slf4j MDC的介绍
MDC ( Mapped Diagnostic Contexts ),其目的是为了便于我们诊断线上问题而出现的方法工具类。它的好处是可以实现同一请求的日志追踪功能,比如如果你的系统已经上线,突然有一天老板说我们增加一些用户数据到日志里分析一下。如果没有MDC我猜此时此刻你应该处于雪崩状态。MDC恰到好处的让你能够实现在日志上突如其来的一些需求。
MDC 对外提供的接口:
public class MDC { //在当前线程中插入一个键值对,键不能为空,值只有当子类实现允许时才能为空 public static void put(String key, String val); //通过键获取对应的context值 public static String get(String key); //通过键删除context值 public static void remove(String key); //清除所有的context public static void clear();}
注:slf4j MDC的详细介绍可以参考Slf4j MDC 使用和 基于 Logback 的实现分析。
3.应用实例
(1)首先新建Interceptor的实例类
package com.test.interceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.MDC;import org.springframework.web.servlet.ModelAndView;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import com.test.User;//User类我这里没有粘贴出来,可以自己建public class Slf4jMDCInterceptor extends HandlerInterceptorAdapter { /** 会话ID */ private final static String KEY_SESSION_ID = "session_Id"; /** 用户ID */ private final static String KEY_USER_ID = "user_id"; /** 用户姓名 */ private final static String KEY_USER_NAME = "user_name"; @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { MDC.clear(); } @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 放SessionId String sessionId = request.getSession().getId(); MDC.put(KEY_SESSION_ID, sessionId); // 放入用户id和姓名 User currentUser = request.getSession().getAttribute("User"); if (currentUser != null) { MDC.put(KEY_USER_ID, currentUser.getUserId()); MDC.put(KEY_USER_NAME, currentUser.getUserName()); } return true; }}
(2)然后配置Interceptor
文件命名为:web-mvc-interceptor.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:c="http://www.springframework.org/schema/c" xmlns:util="http://www.springframework.org/schema/util" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd"> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**/*.html" /> <mvc:mapping path="/**/*.json" /> <mvc:mapping path="/**/*.xml" /> <bean class="com.pccc.poup.loanmall.interceptor.Slf4jMDCInterceptor" /> </mvc:interceptor> </mvc:interceptors> </beans>
4.总结
其实应用起来代码不是很多,关键是MDC能够通过put()方法加入需要的日志分类标志,以上内容是我通过整合知识和实践得来的,如果有不足之请留言。
阅读全文
0 0
- 使用Spring MVC中的Interceptor和slf4j中的MDC实现日志归类标记
- slf4j中的MDC
- 使用Spring中的interceptor
- Slf4j MDC 使用和 基于 Logback 的实现分析
- spring mvc 使用拦截器interceptor和自定义Log类实现持久层记录日志
- log4j中的MDC和NDC
- Spring MVC interceptor 使用
- 日志线程与MDC中的Akka源
- LogBack sl4j 通过MDC实现日志记录区分用户Session[以Spring mvc为例] - 独木桥
- Spring中的interceptor简介
- Logback、Log4J及slf4J日志框架分析对比及在Spring Boot中的使用
- 在Spring-MVC中使用logback和slf4j
- Logback中的MDC
- spring MVC中的CAS实现
- 实践---spring mvc interceptor 的实现例子
- 使用MDC标注日志上下文
- spring MVC 中使用Interceptor拦截器
- spring中使用slf4j记录日志
- iOS静态库重复的.o文件 的终极解决办法
- 分组背包
- Linux命令更新系统时间,更新所有文件的时间
- MAVEN项目中添加jar包httpclient-4.3.5.jar,commons-logging-1.1.1.jar,httpcore-4.3.2.jar
- 表单提交方法
- 使用Spring MVC中的Interceptor和slf4j中的MDC实现日志归类标记
- [LeetCode]575. Distribute Candies
- jsf
- 【Redis基础】五种数据类型
- 猴子吃桃问题-JavaScript实现
- 关于MySQL--查询今天以及昨天、上个月等等
- 判断图片是否加载完毕
- 自定义listview holder 和adapter
- 公务员面试综合分析真题解析