Spring Boot – 自定义Aspect打印请求日志

通常我们自定义一个Aspect用于记录请求日志,方便问题排查。

主要记录了如下信息

代码实现

import cn.hutool.core.util.StrUtil;import cn.hutool.json.JSONUtil;import lombok.extern.slf4j.Slf4j;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.aspectj.lang.annotation.Pointcut;import org.springframework.stereotype.Component;import org.springframework.web.context.request.RequestContextHolder;import org.springframework.web.context.request.ServletRequestAttributes;import javax.servlet.http.HttpServletRequest;import java.net.InetAddress;import java.net.UnknownHostException;import java.util.ArrayList;import java.util.Enumeration;import java.util.List;@Slf4j@Aspect@Componentpublic class WebLogAspect { private final String LOCALHOST_IPV4 = “127.0.0.1”; private final String LOCALHOST_IPV6 = “0:0:0:0:0:0:0:1”; // 切入点 @Pointcut(“execution(public * demo.controller..*(..)))”) public void pointCut() { } @Around(“pointCut()”) public Object doAround(ProceedingJoinPoint joinPoint) throws Throwable { // 开始处理时间 long startTime = System.currentTimeMillis(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); // 构建成一条长日志,避免并发下日志输出错乱 StringBuilder sb = new StringBuilder(300); // 日志参数 List reqArgs = new ArrayList(); sb.append(“================ Start ================”); // 打印路由 sb.append(“===> {}: {}”); String requestMethod = request.getMethod(); reqArgs.add(requestMethod); reqArgs.add(request.getRequestURL().toString()); // IP sb.append(“===> IP: {}”); reqArgs.add(getClientIp(request)); // 打印调用 controller 的全路径以及执行方法 sb.append(“===> Class Method: {}.{}”); reqArgs.add(joinPoint.getSignature().getDeclaringTypeName()); reqArgs.add(joinPoint.getSignature().getName()); // 打印请求头 Enumeration headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()) { sb.append(“=== Headers === {}: {}”); String headerName = headerNames.nextElement(); reqArgs.add(headerName); reqArgs.add(StrUtil.join(“”, request.getHeader(headerName))); } // 打印请求入参 sb.append(“===> request params: {}”); reqArgs.add(JSONUtil.toJsonStr(joinPoint.getArgs()));// List args = Arrays.asList(joinPoint.getArgs());// log.info(“Request Args : {}”, new Gson().toJson(args)); Object result = joinPoint.proceed();// // 打印出参// log.info(“Response Args : {}”, new Gson().toJson(result));// // 打印处理耗时 sb.append(StrUtil.format(“处理耗时: {} ms “, System.currentTimeMillis() – startTime)); sb.append(“================ End =================”); // 打印 log.info(sb.toString(), reqArgs.toArray()); return result; } // 获取客户端IP public String getClientIp(HttpServletRequest request) { String ipAddress = request.getHeader(“X-Forwarded-For”); if (StrUtil.isEmpty(ipAddress) || “unknown”.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(“Proxy-Client-IP”); } if (StrUtil.isEmpty(ipAddress) || “unknown”.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(“WL-Proxy-Client-IP”); } if (StrUtil.isEmpty(ipAddress) || “unknown”.equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if (LOCALHOST_IPV4.equals(ipAddress) || LOCALHOST_IPV6.equals(ipAddress)) { try { InetAddress inetAddress = InetAddress.getLocalHost(); ipAddress = inetAddress.getHostAddress(); } catch (UnknownHostException e) { e.printStackTrace(); } } } if (!StrUtil.isEmpty(ipAddress) && ipAddress.length() > 15 && ipAddress.indexOf(“,”) > 0) { ipAddress = ipAddress.substring(0, ipAddress.indexOf(“,”)); } return ipAddress; }}

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年7月12日
下一篇 2022年7月12日

相关推荐

  • 我国5G网络平均下行接入速率达334.98Mbps

    中国信息通信研究院日前发布的《全国移动网络质量监测报告》(第1期)显示,我国5G网络覆盖日渐完善,全国5G网络平均下行接入速率和上行接入速率分别为334.98Mbps和70.21M…

    2022年6月14日
  • 今天傍晚,京城天空美翻了

    北京日报客户端 | 记者 程功 作者 刘培恩 今天傍晚,京城天空美翻了! 秋高气爽,彩云满天。落日余晖映晚霞,一抹夕阳美如画!

    2022年8月20日
  • 传奇架设好后,在登录游戏账号界面黑屏,并且中间有个小砖块

    传奇架设好后,在登录游戏账号界面黑屏,并且中间有个小砖块,是什么情况? 不知道大家是否遇到过这个情况?在传奇架设好后,登录游戏账号界面时黑屏,并且有个小砖块,替换key、网关、重新…

    2022年6月30日
  • 2022年“国谈”在即,多款药品主动降价

    (人民日报健康客户端记者谭琪欣)2022年国家医保谈判即将开启。根据各地招采官网发布的通知,人民日报健康客户端记者不完全统计发现,近期超270款挂网药品主动申请降价,其中不乏再鼎医…

    2022年8月15日
  • 冰箱参数怎么看?两分钟教会你如何选购冰箱

    在这个炎热的夏天,除了空调,冰箱也是非常地重要。由于专业知识有限,市面上又有那么多五花八门的冰箱,很多朋友在选择冰箱的时候,往往不知道如何选购。今天在这里教你如何看冰箱参数,内容简…

    2022年8月4日
  • 互联网诊疗监管细则公布,如何更好保证线上诊疗质量?严禁用人工智能自动生成处方

    由国家卫生健康委办公厅、国家中医药局办公室联合制定的《互联网诊疗监管细则(试行)》近日公布。“互联网+医疗健康”近年来发展迅速,有效整合了医疗资源,改善了患者就医体验。针对互联网诊…

    2022年6月25日
  • 河南省药监局发布《化妆品电商平台内经营者“十要十不”》

    为进一步学习贯彻《化妆品监督管理条例》《化妆品生产经营监督管理办法》等法规要求,切实规范化妆品经营行为,提高化妆品安全保障水平,确保消费者用妆安全,河南省药监局发布《化妆品电商平台…

    2022年6月21日
  • 电脑换ip(怎么改变ip)

    今天小编给各位分享电脑换ip的知识,其中也会对怎么改变ip进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧! 台式电脑怎么更改ip地址 1、首选要明白自己的IP…

    2022年11月13日
  • 如何优雅的写 Controller 层代码?

    # 前言 本篇主要要介绍的就是controller层的处理,一个完整的后端请求由4部分组成: 1. 接口地址(也就是URL地址) 2. 请求方式(一般就是get、set,当然还有p…

    2022年6月19日
  • 孩子注意力不集中?有可能是前庭统合失调,家长要学会判断

    孩子调皮捣蛋,就像一只“小猴子”,来回乱跑,爬上爬下,动不动还发脾气,这种情况该怎么办? 很多家长可能会觉得,这是孩子天生淘气,于是反复提醒很多次,甚至还做出过严厉惩罚,最后却发现…

    2022年8月18日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息