封装系统全局操作日志aop拦截且可打包给其他项目依赖
发表于:2024-11-30 作者:千家信息网编辑
千家信息网最后更新 2024年11月30日,封装系统全局操作日志aop拦截且可打包给其他项目依赖,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。在开发过程中,为了更快地排错,更好
千家信息网最后更新 2024年11月30日封装系统全局操作日志aop拦截且可打包给其他项目依赖
封装系统全局操作日志aop拦截且可打包给其他项目依赖,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
在开发过程中,为了更快地排错,更好得了解接口访问量,可以选择用aop做全局的操作拦截,在项目不止一个的时候,我们可以选择独立出来,新项目可以很快的加上全局操作日志,具体代码及数据库表设计如下:
1.数据库MySQL表结构设计,如下图(可根据需要加减字段):
2.可以根据表结构逆向生成相关实体类及Mapper,此步骤相对简单(略)
3.增加全局日志切面类
** * @author songlonghui * @ClassName SystemLogAspect * @Description 日志切面记录 * @date 2019/7/24 16:38 * @Version 1.0 */@Component@Aspectpublic class SystemLogAspect { private Logger logger = LoggerFactory.getLogger(SystemLogAspect.class); @Autowired private SystemLogDao systemLogDao; /*@Value("${LOG_POINT_URL}") private String logPointUrl;*/ /** 以 controller 包下定义的所有请求为切入点 */ @Pointcut("execution(public * com.machinsight.*.*.controller..*.*(..)) && !@annotation(com.machinsight.system_log.core.annotation.NoAspectAnnotation)") public void webLog() { //logger.warn("切点路径---------->" + logPointUrl); } //private SystemLogWithBLOBs systemLogWithBLOBs; /** * 在切点之前织入 * @param joinPoint * @throws Throwable */ @Before("webLog()") public void doBefore(JoinPoint joinPoint) throws Throwable { // 开始打印请求日志 //logger.info("=========================================== Start ==========================================="); } /** * 在切点之后织入 * @throws Throwable */ @After("webLog()") public void doAfter() throws Throwable { logger.info("=========================================== End ==========================================="); // 每个请求之间空一行 logger.info(""); } /** * 环绕 * @param proceedingJoinPoint * @return * @throws Throwable */ @Around("webLog()") public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable { // 开始时间 long startTime = System.currentTimeMillis(); SystemLogWithBLOBs systemLogWithBLOBs = new SystemLogWithBLOBs(); ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); if (null != attributes){ HttpServletRequest request = attributes.getRequest(); logger.error("当前线程号:--doAround--" + Thread.currentThread()); String url = request.getRequestURL().toString(); String description = proceedingJoinPoint.getSignature().getDeclaringTypeName(); String requestArgs = FastJsonUtils.toJSONNoFeatures(proceedingJoinPoint.getArgs()).replaceAll("\\\\",""); String ip = UuidUtil.getIpAddr(request); // 打印请求相关参数 logger.info("========================================== Start =========================================="); // 打印请求 url logger.info("请求URL : {}", url); // 打印 Http method logger.info("HTTP请求方法 Method : {}", request.getMethod()); // 打印调用 controller 的全路径以及执行方法 logger.info("Class--Controller 全路径以及执行方法 Method : {}.{}", description); // 打印请求的 IP logger.info("请求IP : {}", ip); // 打印请求入参 logger.info("请求参数Request Args : {}", requestArgs); // 记录日志入库 String value = request.getHeader("user-agent"); // 用户代理信息 // systemLogWithBLOBs.setCreateTime(new Date()); // 请求参数 systemLogWithBLOBs.setMethod(url); // 接口地址 systemLogWithBLOBs.setRequestIp(ip); //请求ip systemLogWithBLOBs.setRequestArgs(requestArgs); // 请求参数 systemLogWithBLOBs.setUserAgent(value); // 用户代理信息 systemLogWithBLOBs.setDescription(description); } Object result = null; try { result = proceedingJoinPoint.proceed(); String responseArgs = FastJsonUtils.toJSONNoFeatures(result).replaceAll("\\\\",""); long useTime = System.currentTimeMillis() - startTime; // 打印出参 logger.info("具体返回参数 Response Args : {}", responseArgs); // 执行耗时 logger.info("整体执行耗时 Time-Consuming : {} ms", useTime); systemLogWithBLOBs.setResponseArgs(responseArgs); systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(useTime))); } catch (Throwable throwable) { // 设置异常信息 systemLogWithBLOBs.setIsException(1); // 异常信息 systemLogWithBLOBs.setExceptionDetail(throwable.getMessage()); // 耗时 long exceptionTime = System.currentTimeMillis() - startTime; systemLogWithBLOBs.setTimeConsuming(Integer.valueOf(String.valueOf(exceptionTime))); // 异常返回参数 JsonResult jsonResult = new JsonResult(); jsonResult.setMsg(CrmConstant.OPS_FAILED_MSG); jsonResult.setSuccess(CrmConstant.OPS_FAILED_CODE); jsonResult.setData(throwable.getMessage()); String responseArgsForException = FastJsonUtils.toJSONNoFeatures(jsonResult); systemLogWithBLOBs.setResponseArgs(responseArgsForException); // 抛出异常 throw new Throwable(throwable.getMessage()); } finally { systemLogDao.insertSelective(systemLogWithBLOBs); } return result; }
4.可根据公司项目的整体包结构配置切点,还可以增加不需要拦截的配置,为了更灵活细化,这里增加了相应注解类,如下:
/** * 切面排除注解类 */@Documented@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.METHOD)public @interface NoAspectAnnotation {}
5.只要在不需要的拦截的controller方法加上注解@NoAspectAnnotation即可,切点会自动排除:
/** * @author songlonghui * @ClassName CommonController * @Description TODO * @date 2019/8/23 16:09 * @Version 1.0 */@Controller@RequestMapping("common")public class CommonController { @ResponseBody @RequestMapping("/test") @NoAspectAnnotation public String testLog(@RequestBody String inputJson) throws Exception{ String msg = "操作成功"; return msg; }}
6.只要在别的项目中增加该项目依赖即可:
com.machinsight system_log 0.0.1-SNAPSHOT * *
有需要整体项目源码的朋友可以联系我,现在还没有想好源码放在什么地方供别人下载!!
邮箱地址:lance911215@outlook.com
关于封装系统全局操作日志aop拦截且可打包给其他项目依赖问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
日志
项目
参数
全局
切点
方法
信息
切面
整体
注解
结构
路径
问题
系统
封装
地址
接口
数据
数据库
更多
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网科技给银行带来支撑
壹众互联网科技有限公司
四川大学 数据库技术
美国前网络安全负责人
海康服务器设置uefi
网络安全就业太原
宝塔创建的数据库不起作用
原神海外服务器收入
北京金库网络技术有限公司
软件开发项目管理软件哪个好
北京网络安全总局电话
骑士云服务器
dsp软件开发培训
网络安全技术自学教程
网络技术和手册
云服务器可以运行通达信软件吗
电科云服务器
科技与互联网最新信息
端口连接服务器命令
武陵神装如何看此前登录服务器
安卓数据库路径
江西统一软件开发服务价钱
中职计算机与网络技术
济南浪潮服务器维修电话
数据库路由器下载
在大陆玩csgo服务器是什么
苹果笔记本电脑推荐软件开发
三明物流软件开发
河南烈焰网络技术有限公司
读华为信息与网络技术学院