2019-08-31 12:18:55 卢浮宫 版权声明:本文为站长原创文章,转载请写明出处
一个好的项目是必须有完备的日志系统的,处理我们前面文章提到的logbck,这里使用自定义注解做一个新的日志管理。
大体上包含以下几个部分:
1、日志管理aop切点类SysLogAspect
2、系统日志的注解
3、系统日志的 m v c
4、mapper处理文件
1、aop的老一套,声明切点类,这里使用@Aspect注解
2、声明切点 @pointcut
3、声明环绕通知,记录日志
4、插一句为什么使用环绕通知:
①使用环绕通知可以自由调用,前置、后置则不好处理
②自由返回数据
1、切点类
/**
* @author XA
* @date 2019/8/31
* * @time 10:09
* @desc:日志管理,aop切点类
*/
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogServiceImpl sysLogService;
@Pointcut("@annotation(com.xa.guangmuhua.Log.SysLog)")
public void logPointCut() {
}
@Around("logPointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
//执行方法
Object result = point.proceed();
//执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
//保存日志
saveSysLog(point, time);
return result;
}
private void saveSysLog(ProceedingJoinPoint joinPoint, long time) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
SysLogEntity sysLog = new SysLogEntity();
SysLog syslog = method.getAnnotation(SysLog.class);
if(syslog != null){
//注解上的描述
sysLog.setOperation(syslog.value());
}
//请求的方法名
String className = joinPoint.getTarget().getClass().getName();
String methodName = signature.getName();
sysLog.setMethod(className + "." + methodName + "()");
//请求的参数
Object[] args = joinPoint.getArgs();
try{
String params = new Gson().toJson(args[0]);
sysLog.setParams(params);
}catch (Exception e){
}
//获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//设置IP地址
IpUtil ipUtil = new IpUtil();
sysLog.setIp(ipUtil.getIP());
//用户名
String username = "游客";
try {
username = SecurityUtils.getSubject().getSession().getAttribute("currentUser").toString();
}catch (Exception e){
e.printStackTrace();
}
sysLog.setUsername(username);
sysLog.setTime(time);
sysLog.setCreateDate(new Date());
//保存系统日志
sysLogService.sysLogSave(sysLog);
}
}
2、日志注解
/**
* @author XA
* @date 2019/8/31
* * @time 10:29
* @desc:系统日志注解
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SysLog {
String value() default "";
}