当前位置:
凯发k8官方网 >
前端技术
> javascript
>内容正文
javascript
spring aop注解方式实现日志管理 -凯发k8官方网
凯发k8官方网
收集整理的这篇文章主要介绍了
spring aop注解方式实现日志管理
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
文章目录
- 自定义注解
- busslog
- busslogaspect
前言:使用注解方式实现日志管理,可以使我们的程序变的清晰、简单,不和很多业务代码混在一起。
实现思路大致分为四点
- 设计日志表和日志类,编写日志dao和service以及实现
- 自定义注解,注解中加入几个属性,属性可以标识操作的类型(方法是做什么的)
- 编写切面,切点表达式使用上面的注解直接定位到使用注解的方法,
- 编写通知,通过定位到方法,获取上面的注解以及注解的属性,然后从session中直接获取或者从数据库获取当前登录用户的信息,最后根据业务处理一些日志信息之后调用日志service存储日志
设计日志表和日志类此步骤将省略可以根据自己的实际情况设计
自定义注解
busslog
package com.sl.annotation;import java.lang.annotation.elementtype; import java.lang.annotation.retention; import java.lang.annotation.retentionpolicy; import java.lang.annotation.target;/*** @author shuliangzhao* @title: busslog* @projectname spring-boot-learn* @description: todo* @date 2019/10/14 20:06*/ @target({elementtype.method}) @retention(retentionpolicy.runtime) public @interface busslog {/*** 业务的名称*/string value() default "";/*** 是否将当前日志记录到数据库中*/boolean save() default true; }busslogaspect
package com.sl.aop;import com.alibaba.fastjson.json; import com.sl.annotation.busslog; import org.aspectj.lang.joinpoint; import org.aspectj.lang.proceedingjoinpoint; import org.aspectj.lang.signature; import org.aspectj.lang.annotation.around; import org.aspectj.lang.annotation.aspect; import org.aspectj.lang.annotation.pointcut; import org.aspectj.lang.reflect.methodsignature; import org.slf4j.logger; import org.slf4j.loggerfactory; import org.springframework.context.annotation.enableaspectjautoproxy; import org.springframework.stereotype.component;import java.lang.reflect.method; import java.util.linkedlist; import java.util.list; import java.util.regex.matcher; import java.util.regex.pattern;/*** @author shuliangzhao* @title: busslogaspect* @projectname spring-boot-learn* @description: todo* @date 2019/10/14 20:08*/ @aspect @component @enableaspectjautoproxy public class busslogaspect {private static final logger log = loggerfactory.getlogger(busslogaspect.class);@pointcut(value = "@annotation(com.sl.annotation.busslog)")public void pointcut() {}@around("pointcut()")public object writelog(proceedingjoinpoint point) throws throwable {//先执行业务object result = point.proceed();try {handle(point);} catch (exception e) {log.error("日志记录出错!", e);}return result;}private void handle(proceedingjoinpoint point) throws exception {method currentmethod = getmethod(point);//获取操作名称busslog annotation = currentmethod.getannotation(busslog.class);boolean save = annotation.save();string bussinessname = parseparams(point.getargs(), annotation.value());log.info("{} | {} - {} {} - {}", bussinessname);if (!save) {return;}}private method getmethod(joinpoint point) throws nosuchmethodexception {signature sig = point.getsignature();methodsignature msig = (methodsignature) sig;object target = point.gettarget();return target.getclass().getmethod(msig.getname(), msig.getparametertypes());}public string parseparams(object[] params, string bussinessname) {if (bussinessname.contains("{") && bussinessname.contains("}")) {list<string> result = match(bussinessname, "(?<=\\{)(\\d )");for (string s : result) {int index = integer.parseint(s);bussinessname = bussinessname.replaceall("\\{" index "}", json.tojsonstring(params[index - 1]));}}return bussinessname;}private static list<string> match(string str, string regex) {if (null == str) {return null;}pattern pattern = pattern.compile(regex);matcher matcher = pattern.matcher(str);list<string> list = new linkedlist<>();while (matcher.find()) {list.add(matcher.group());}return list;} }总结
以上是凯发k8官方网为你收集整理的spring aop注解方式实现日志管理的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: spring aop相关术语解释及简单使
- 下一篇: springboot applicati