内容简介:你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于你可能没太明白啥意思, 那么先来看看效果把:可以使用过滤器, 拦截器或 AOP 等方式来实现, 即在用户请求时, 将用户信息写入到
你是否有过排查某个用户的操作出现 BUG 时, 从茫茫日志中寻找这个用户操作的痛苦经历, SLF4J 为我们提供了一种基于 ThreadLocal
来实现的 MDC
功能, 用来将自定义信息放入到日志中.
你可能没太明白啥意思, 那么先来看看效果把:
普通日志:
加上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}
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 将摘要信息添加到使用ggplot创建的密度图中
- 木兰编程语言重现——功能初具雏形,添加中文报错信息
- 主动模式和被动模式,添加监控主机,添加自定义模板,处理图像中的乱码,自动发现
- 苹果将为 Mac 添加 Face ID,为 Magic Keyboard 添加 Touch Bar
- android – 为什么AOSP添加新的API来支持库而不添加到SDK?
- [Framework] 添加系统服务
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
游戏人工智能编程案例精粹
巴克兰德 (Mat Buckland) / 罗岱 / 人民邮电出版社 / 2008年06月 / 55.00元
《游戏人工智能编程案例精粹》适合对游戏AI开发感兴趣的爱好者和游戏AI开发人员阅读和参考。一起来看看 《游戏人工智能编程案例精粹》 这本书的介绍吧!