SLF4J MDC ☞ 将用户信息添加到日志信息中

栏目: Java · 发布时间: 7年前

内容简介:你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于你可能没太明白啥意思, 那么先来看看效果把:可以使用过滤器, 拦截器或 AOP 等方式来实现, 即在用户请求时, 将用户信息写入到

你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于 ThreadLocal 来实现的 MDC 功能, 用来将自定义信息放入到日志中.

你可能没太明白啥意思, 那么先来看看效果把:

普通日志:

SLF4J MDC ☞ 将用户信息添加到日志信息中

加上MDC的日志:

SLF4J MDC ☞ 将用户信息添加到日志信息中

食用方式

可以使用过滤器, 拦截器或 AOP 等方式来实现, 即在用户请求时, 将用户信息写入到 MDC 中, 然后在请求完成后, 清空此 MDC.

我这里使用 SpringMVC 的拦截器 HandlerInterceptor 来演示下, (我这里使用了 Shiro, 所以会调用 Shiro 的代码来获取当前登录用户):

@Component
public class LogInterceptor implements HandlerInterceptor {
 
    private final static String MDC_USERNAME = "username";
    private static final Logger LOGGER = LoggerFactory.getLogger(LogInterceptor.class);
 
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        // 如已进行登录, 则获取当前登录者的用户名放入 MDC 中.
        String username = "";
        if (SecurityUtils.getSubject().getPrincipal() != null) {
            username = ((User) SecurityUtils.getSubject().getPrincipal()).getUsername();
        }
        MDC.put(MDC_USERNAME, username);
        LOGGER.debug("MDC : PUT MDC_USERNAME ({}) in logger", username);
        return true;
    }
 
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
        String username = MDC.get(MDC_USERNAME);
        LOGGER.debug("MDC : remove MDC_USERNAME ({}) from logger", username);
        MDC.remove(username);
    }
 
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
 
    }
}

再将其配置到 Spring 拦截器中:

@Configuration
public class WebMvcConfigurer extends WebMvcConfigurerAdapter {

    @Autowired
    private LogInterceptor logInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(logInterceptor);
        super.addInterceptors(registry);
    }
}

然后在日志格式中使用 %X{username} 将 MDC 添加进去即可, 由于我使用的是 SpringBoot 的 logback , 所以在保留原 SpringBoot 默认格式的同时, 加上了 MDC:

logging.pattern.console=%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:%5p}) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} [%10.10X{username}] %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

Impractical Python Projects

Impractical Python Projects

Lee Vaughan / No Starch Press / 2018-11 / USD 29.95

Impractical Python Projects picks up where the complete beginner books leave off, expanding on existing concepts and introducing new tools that you’ll use every day. And to keep things interesting, ea......一起来看看 《Impractical Python Projects》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具