使用步骤
1.新建SystemLog类
代码如下(示例):
@Target({ ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SystemLog {
/**
* 提示信息
*/
String msg() default "";
/**
* 功能
*/
String operation() default "";
}
2.新建SystemLogAspect类
代码如下(示例):
@Aspect
@Component
public class SystemLogAspect
{
private static final Logger logger = LoggerFactory.getLogger(SystemLogAspect.class);
@Autowired
private SysOperatorInfoFeignClient sysOperatorInfoFeignClient;
/**
* 处理完请求后执行
* @param joinPoint 切点
*/
@AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
public void doAfterReturning(JoinPoint joinPoint, SystemLog controllerLog, Object jsonResult) {
handleLog(joinPoint, controllerLog, null, jsonResult);
}
/**
* 拦截异常操作
*
* @param joinPoint 切点
* @param e 异常
*/
@AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
public void doAfterThrowing(JoinPoint joinPoint, SystemLog controllerLog, Exception e) {
handleLog(joinPoint, controllerLog, e, null);
}
protected void handleLog(final JoinPoint joinPoint, SystemLog controllerLog, final Exception e, Object jsonResult) {
try {
// ========数据库日志=========*/
SysOperateInfo sysOperateInfo = new SysOperateInfo();
String id= UUID.randomUUID().toString(true);
sysOperateInfo.setId(id);
String username = SecurityUtils.getUsername();
if (StringUtils.isNotBlank(username)) {
sysOperateInfo.setAccount(username);
sysOperateInfo.setCreateUser(username);
}
String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
sysOperateInfo.setLoginIp(ip);
sysOperateInfo.setAccessTime(new Date());
// if (e != null) {
// operLog.setStatus(BusinessStatus.FAIL.ordinal());
// operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000));
// }
// 设置方法名称
// String className = joinPoint.getTarget().getClass().getName();
// String methodName = joinPoint.getSignature().getName();
// operLog.setMethod(className + "." + methodName + "()");
// // 设置请求方式
// operLog.setRequestMethod(ServletUtils.getRequest().getMethod());
// 处理设置注解上的参数
getControllerMethodDescription(joinPoint, controllerLog, sysOperateInfo, jsonResult);
// 保存数据库
sysOperatorInfoFeignClient.save(sysOperateInfo);
}
catch (Exception exp) {
// 记录本地异常日志
logger.error("==前置通知异常==");
logger.error("异常信息:{}", exp.getMessage());
exp.printStackTrace();
}
}
/**
* 获取注解中对方法的描述信息 用于Controller层注解
* @param systemLog 日志
* @param sysOperateInfo 操作日志
* @throws Exception
*/
public void getControllerMethodDescription(JoinPoint joinPoint, SystemLog systemLog, SysOperateInfo sysOperateInfo, Object jsonResult) {
// 设置action动作
sysOperateInfo.setOperationModule(systemLog.operation());
// 设置标题
sysOperateInfo.setMsg(systemLog.msg());
// 是否需要保存request,参数和值
// if (log.isSaveRequestData()) {
// // 获取参数的信息,传入到数据库中。
// setRequestValue(joinPoint, operLog);
// }
// // 是否需要保存response,参数和值
// if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) {
// operLog.setJsonResult(StringUtils.substring(JSON.toJSONString(jsonResult), 0, 2000));
// }
}
/**
* 获取请求的参数,放到log中
* @param operLog 操作日志
* @throws Exception 异常
*/
private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception
{
String requestMethod = operLog.getRequestMethod();
if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod))
{
String params = argsArrayToString(joinPoint.getArgs());
operLog.setOperParam(StringUtils.substring(params, 0, 2000));
}
}
/**
* 参数拼装
*/
private String argsArrayToString(Object[] paramsArray)
{
String params = "";
if (paramsArray != null && paramsArray.length > 0)
{
for (Object o : paramsArray)
{
if (StringUtils.isNotNull(o) && !isFilterObject(o))
{
try
{
Object jsonObj = JSON.toJSON(o);
params += jsonObj.toString() + " ";
}
catch (Exception e)
{
}
}
}
}
return params.trim();
}
/**
* 判断是否需要过滤的对象。
*
* @param o 对象信息。
* @return 如果是需要过滤的对象,则返回true;否则返回false。
*/
@SuppressWarnings("rawtypes")
public boolean isFilterObject(final Object o)
{
Class<?> clazz = o.getClass();
if (clazz.isArray())
{
return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
}
else if (Collection.class.isAssignableFrom(clazz))
{
Collection collection = (Collection) o;
for (Object value : collection)
{
return value instanceof MultipartFile;
}
}
else if (Map.class.isAssignableFrom(clazz))
{
Map map = (Map) o;
for (Object value : map.entrySet())
{
Map.Entry entry = (Map.Entry) value;
return entry.getValue() instanceof MultipartFile;
}
}
return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
|| o instanceof BindingResult;
}
}
总结
最后需要在控制层加上自定义注解,即可实现(列如:@SystemLog(msg = “用户管理”,operation = “新增操作”))