系统操作日志记录
自定义注解,添加注解的方法视为切面方法,通过切面保存操作方法名和操作信息,方便以后调查问题。
自定义注解
注解名为SysLog,使用时在方法名上添加@SysLog(“xxx”)
//自定义注解
@Document // 作用域javadoc
@Inherited //可继承
@Target({ElementType.METHOD}) // 表明注解可以标注的地方,ElementType.FIELD, Field:字段 Method:方法
@Retetion(RetetionPolicy.RUNTIME)// 存活阶段RUNTIME: 运行期,jvm:class文件级别等。
public @interface SysLog {
String value() default "";
}
自定义切面
通通过切点保存操作日志
/**
* 系统日志,切面处理类
*
* @author Mark sunlightcs@gmail.com
*/
@Aspect
@Component
public class SysLogAspect {
@Autowired
private SysLogService sysLogService;
@Pointcut("@annotation(io.renren.common.annotation.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);
sysLog.setParams(params);
}catch (Exception e){
}
//获取request
HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
//设置IP地址
sysLog.setIp(IPUtils.getIpAddr(request));
//用户名
String username = ((SysUserEntity) SecurityUtils.getSubject().getPrincipal()).getAccount();
sysLog.setUsername(username);
sysLog.setTime(time);
sysLog.setCreateTime(new Date());
//保存系统日志
sysLogService.save(sysLog);
}
}
使用切面
使用@SysLog(“删除数据”)注解的方法都会走切面处理,进行日志记录
/**
* 删除数据点
*/
@SysLog("删除数据")
@RequestMapping("/delete")
@RequiresPermissions("device:devece:delete")
public R delete(@RequestBody Integer[] ids){
return R.ok();
}