springboot高级功能(四)业务实战,自定义注解收集操作日志
【摘要】
注解
@Target({ElementType.PARAMETER, ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Log { /** * 注释 */ String operation...
注解
-
@Target({ElementType.PARAMETER, ElementType.METHOD})
-
@Retention(RetentionPolicy.RUNTIME)
-
@Documented
-
public @interface Log {
-
-
/**
-
* 注释
-
*/
-
String operationName() default "";
-
}
注解aop
-
@Component
-
public class LogAspect {
-
-
private Logger logger = LoggerFactory.getLogger(LogAspect.class);
-
-
private String succeed = "true";
-
-
/**
-
* 在注释@log的方法中进入本类
-
*/
-
@Pointcut("@annotation(com.resource.business.modular.log.annotation.Log)")
-
public void logPointCut() {}
-
-
/**
-
* 前置通知 用于拦截操作,在方法返回后执行
-
*
-
* @param joinPoint 切点
-
*/
-
@AfterReturning(pointcut = "logPointCut()", returning = "jsonResult")
-
public void doAfter(JoinPoint joinPoint, Result jsonResult) {
-
handleLog(joinPoint, jsonResult);
-
-
}
-
-
/**
-
* 拦截异常操作,有异常时执行
-
*
-
* @param joinPoint
-
* @param e
-
*/
-
@AfterThrowing(value = "logPointCut()", throwing = "e")
-
public void doAfter(JoinPoint joinPoint, Exception e) {
-
Log controllerLog = getAnnotationLog(joinPoint);
-
// 没有注解
-
if (controllerLog == null) {
-
return;
-
}
-
// 处理入参
-
String args = this.argsArrayToString(joinPoint.getArgs());
-
// 获取请求上下文信息
-
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
-
HttpServletRequest request = attributes.getRequest();
-
HttpServletResponse response = attributes.getResponse();
-
// 获取时间
-
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
// 获取用户信息
-
String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
-
// 组合入参信息
-
logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
-
+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
-
logger.error("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
-
+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
-
logger.debug("错误信息为:" + e);
-
}
-
-
/**
-
* 判断是否有注解
-
*
-
* @param joinPoint
-
* @throws Exception
-
*/
-
private Log getAnnotationLog(JoinPoint joinPoint) {
-
Signature signature = joinPoint.getSignature();
-
MethodSignature methodSignature = (MethodSignature)signature;
-
Method method = methodSignature.getMethod();
-
if (method != null) {
-
return method.getAnnotation(Log.class);
-
}
-
return null;
-
}
-
-
/**
-
* 功能描述:执行日志操作
-
*
-
* @param: joinPoint ,e ,response
-
* @return:
-
*/
-
private void handleLog(final JoinPoint joinPoint, Result jsonResult) {
-
Log controllerLog = getAnnotationLog(joinPoint);
-
// 没有注解
-
if (controllerLog == null) {
-
return;
-
}
-
// 处理入参
-
String args = this.argsArrayToString(joinPoint.getArgs());
-
// 获取请求上下文信息
-
ServletRequestAttributes attributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
-
HttpServletRequest request = attributes.getRequest();
-
HttpServletResponse response = attributes.getResponse();
-
// 获取时间
-
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-
// 获取用户信息
-
String userName = (String.valueOf(SecurityContextHolder.getContext().getAuthentication().getPrincipal()));
-
// 组合入参信息
-
logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
-
+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "操作日志" + "|" + "null" + "|" + "null");
-
logger.info("|" + userName + "|" + controllerLog.operationName() + "|" + sd.format(new Date()) + "|"
-
+ IpUtil.getIpAddr() + "|" + "XXX系统" + "|" + "接口日志" + "|" + request.getRequestURI() + "|" + args);
-
logger.info("输出参数:" + JSONArray.toJSONString(jsonResult.getData()));
-
}
-
-
/**
-
* 组装入参
-
*
-
* @param paramsArray
-
* @return
-
*/
-
private String argsArrayToString(Object[] paramsArray) {
-
String params = "";
-
if (paramsArray != null && paramsArray.length > 0) {
-
for (int i = 0; i < paramsArray.length; i++) {
-
if (!isFilterObject(paramsArray[i])) {
-
Object jsonObj = JSON.toJSON(paramsArray[i]);
-
params += jsonObj.toString() + " ";
-
}
-
}
-
}
-
if (("").equals(params.trim())) {
-
params = "无入参";
-
}
-
return params.trim();
-
}
-
-
/**
-
* 判断是否需要过滤的对象。
-
*
-
* @param o 对象信息。
-
* @return 如果是需要过滤的对象,则返回true;否则返回false。
-
*/
-
public boolean isFilterObject(final Object o) {
-
return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse;
-
}
-
}
备注:楼主使用elk收集了日志 输出在logstash中获取“|” 然后拆分成不同字段 并保存在es中 可在后续文章看到,
输出的参数有 入参,出参,sql,方法名,系统名,调用ip等
文章来源: baocl.blog.csdn.net,作者:小黄鸡1992,版权归原作者所有,如需转载,请联系作者。
原文链接:baocl.blog.csdn.net/article/details/105811589
【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)