美文网首页
AOP日志收集

AOP日志收集

作者: 小周写程序 | 来源:发表于2020-09-17 10:53 被阅读0次

AOP日志收集

本方法使用threadlocal管理切面前后数据,kafka发送切面数据

@Aspect
@Component
@Order(2)
public class AopLogAspect {
    private final static Logger log = LoggerFactory.getLogger(AopLogAspect.class);
    @Resource
    private IdGeneratorUtil idGeneratorUtil;

    private ThreadLocal<JSONObject> logObject = new ThreadLocal<>();

    @Value("${topic.log.name}")
    private String logTopic;


    @Pointcut(value = "@annotation(com.XXX.XXX.log.annotation.OperationLog)")
    private void serviceAspect() {
    }


    @Before(value = "serviceAspect()")
    public void methodBefore(JoinPoint joinPoint) {
        try {
            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder
                    .getRequestAttributes();
            assert requestAttributes != null;
            HttpServletRequest request = requestAttributes.getRequest();

            String ip = IpAddressUtil.getIpAddress(request);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("request_id", idGeneratorUtil.snowflakeId());
            jsonObject.put("request_time", DateUtil.now());
            jsonObject.put("request_ip_port", ip);
            jsonObject.put("request_url", request.getRequestURL().toString());
            jsonObject.put("request_method", request.getMethod());
            String args = Arrays.toString(joinPoint.getArgs());
            jsonObject.put("request_args", args);
            String requestModule = "未知";
            String requestDesc = "未知";
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            OperationLog annotation = method.getAnnotation(OperationLog.class);
            LogSystemType systemType = LogSystemType.UNKNOWN;
            if (annotation != null) {
                systemType = annotation.system();
                requestModule = systemType.getDesc() + annotation.module();
                requestDesc = annotation.desc();
            }
           //用户信息的获取,为特定业务,不做展示
            HashMap<String, String> userInfo = getUserInfo(request, systemType);
            jsonObject.put("request_user_name", userInfo.get("requestUsername"));
            jsonObject.put("request_name", userInfo.get("requestName"));
            jsonObject.put("request_org", userInfo.get("requestOrg"));
            jsonObject.put("request_module", requestModule);
            jsonObject.put("request_desc", requestDesc);

            logObject.set(jsonObject);
        } catch (Exception e) {
            logObject.remove();
        }
    }

/*在业务中穿插的代码做切面处理,DetailParamFormatService需要交给spring管理,代码中执行了DetailParamFormatService.format方法就会进入此方法*/
    @AfterReturning(pointcut = "execution(* com.XXX.XXX.log.method.DetailParamFormatService.format(..))&&args(obj, operationType)", returning = "resultValue")
    public void serviceDetailParamReturning(Object obj, OperationType operationType, String resultValue) {
        JSONObject jsonObject = logObject.get();
        jsonObject.put("request_desc", resultValue);
        logObject.set(jsonObject);
    }

    @AfterReturning(returning = "o", pointcut = "serviceAspect()")
    public void methodAfterReturing(Object o) {
        try {
            JSONObject jsonObject = logObject.get();
            jsonObject.put("response_time", DateUtil.now());
            String jsonString = JSONObject.toJSONString(o);
            boolean status = (boolean) JSONObject.parseObject(jsonString).get("success");
            if (status) {
                jsonObject.put("response_status", ResponseLogStatus.SUCCESS.getDesc());
            } else {
                jsonObject.put("response_status", ResponseLogStatus.ERROR.getDesc());
            }
            jsonObject.put("response_content", jsonString);
            MqSend.sendMsg(logTopic, JSONObject.toJSONString(logObject.get()));
        } finally {
            logObject.remove();
        }
    }

    @AfterThrowing(pointcut = "serviceAspect()", throwing = "e")
    public void saveExceptionLog(Throwable e) {
        try {
            JSONObject jsonObject = logObject.get();
            if (jsonObject == null) {
                return;
            }
            jsonObject.put("response_time", DateUtil.now());
            jsonObject.put("response_status", ResponseLogStatus.ERROR.getDesc());
            JSONObject exceptionObject = new JSONObject();
            exceptionObject.put("response_exception_name", e.getClass().getName());
            exceptionObject.put("response_exception_msg", stackTraceToString(e.getClass().getName(), e.getMessage(), e.getStackTrace()));
            jsonObject.put("response_content", JSONObject.toJSONString(exceptionObject));
            MqSend.sendMsg(logTopic, JSONObject.toJSONString(logObject.get()));
        } finally {
            logObject.remove();
        }
    }

    /**
     * 转换异常信息为字符串
     *
     * @param exceptionName    异常名称
     * @param exceptionMessage 异常信息
     * @param elements         堆栈信息
     */

    public String stackTraceToString(String exceptionName, String exceptionMessage, StackTraceElement[] elements) {
        StringBuilder buffer = new StringBuilder();
        for (StackTraceElement stet : elements) {
            buffer.append(stet).append("\n");
        }
        return exceptionName + ":" + exceptionMessage + "\n\t" + buffer.toString();
    }
}
操作注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperationLog {
    LogSystemType system();

    String module();

    String desc();


}

LogSystemType枚举

@Getter
public enum LogSystemType {
    /**
     *
     */
    APP("APP-"),
    PC("平台-"),
    UNKNOWN("未知-");


    private String desc;

    LogSystemType(String desc) {
        this.desc = desc;
    }
}
方法上添加注解
@Resourse
private DetailParamFormatService detailParamFormatService;
@OperationLog(system = LogSystemType.APP, module = "模块名", desc = "执行XXX命令")
public ResponseInfo method(@RequestBody Dto dtoj){
/穿插DetailParamFormatService.format方法
detailParamFormatService.format();
        return "666";
    }

相关文章

  • AOP日志收集

    AOP日志收集 本方法使用threadlocal管理切面前后数据,kafka发送切面数据 操作注解 LogSyst...

  • Spring AOP 与 动态代理

    Spring AOP原理 AOP作为面向对象的编程的一种补充,目前在系统中得到广泛的应用,例如在日志收集、权限管理...

  • 通用的记录日志注解

    通过AOP定义通用的记录日志注解 需求: 实现AOP日记记录 定义日志注解 定义日志拦截器 可扩展的日志生成规则模...

  • SpringBoot-AOP

    SpringBoot-AOP 使用AOP统一处理请求日志 1.AOP的概念 AOP:AOP是一种编程范式,与语言无...

  • 十五 Kubernetes容器日志收集

    (一) Kubernetes日志收集 1. Kubernetes需要收集哪些日志? 2.收集日志常用的技术栈ELK...

  • Spring Boot中使用log4j实现http请求日志入mo

    之前在《使用AOP统一处理Web请求日志》一文中介绍了如何使用AOP统一记录web请求日志。基本思路是通过aop去...

  • AOP、IOC

    AOP(Aspect Oriented Programming)面向切面编程 AOP主要用于解决横切关注点(日志、...

  • 基于Flume的日志收集系统架构和设计

    1 日志收集系统简介日志收集是大数据的基石。 许多公司的业务平台每天都会产生大量的日志数据。收集业务日志数据,供离...

  • ES 数据预处理 Ingest Node/Pipeline

    需求 收集所有服务的请求日志,存储以供后续使用。 使用ES家族的 filebeat 收集NG日志,可是收集到的日志...

  • 基于注解的SpringAOP切面编程实例

    1,AOP简介 面相切面编程(AOP),可以实现例如日志打印、身份认证,权限管理,安全监测。AOP的实现原理是基于...

网友评论

      本文标题:AOP日志收集

      本文链接:https://www.haomeiwen.com/subject/dhclyktx.html