0
点赞
收藏
分享

微信扫一扫

关于AOP的使用--Elasticsearch记录用户日志

JamFF 2022-02-16 阅读 41
@Aspect
@Component
public class AuditControllerAspect {

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    private ThreadLocal<AuditRequestInfo> result = new ThreadLocal<>();

    protected static final ExecutorService executor = Executors.newFixedThreadPool(20);

    private final static Integer ES_TTL = 1000;

    private final static String ES_INDEX_AUDIT_LOG = "audit";
    private final static String ES_INDEX_TYPE_AUDIT_LOG = "user_op_audit";

    @Autowired
    private ElasticsearchManager elasticsearchManager;

    @Autowired
    private AuditRequestHandle requestHandle;

    /**
     * 定义切入点
     */
    @Pointcut("execution(public * cn.harmonycloud.k8s.oam.api..*.*(..))")
    public void auditController() {

    }

    @Before("auditController()")
    public void doBefore(JoinPoint joinPoint){
        Date date = new Date();
        String opDate = DateUtil.timeFormat.format(date.getTime());
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        AuditRequestInfo requestInfo = new AuditRequestInfo();
        try {
            requestInfo = requestHandle.parseRequest(request);
            if (null != requestInfo) {
                String args = requestInfo.getRequestParams();
                String method = requestInfo.getMethod();
                //nginx转发获取用户ip
                String remoteIp = requestHandle.getRemoteIp(request);
                String url = requestInfo.getUrl();

                //将其余参数放入requestInfo对象内
                requestInfo.setRemoteIp(remoteIp);
                requestInfo.setActionTime(opDate);
                result.set(requestInfo);
                logger.info("REQUEST: URL: {}, HTTP_METHOD: {}, ARGS: {}, REMOTE_IP: {}, CLASS_METHOD: {}", new String[]{
                        url, method, args, remoteIp,
                        joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()});
            }
        } catch (Exception e) {
            logger.error("spring aop before exception", e);
            result.set(requestInfo);
        }
    }

    @AfterReturning(returning = "res", pointcut = "auditController()")
    public void doAfterReturning(JoinPoint joinPoint, Object res) {
        try {
            if (requestHandle.checkUrlInCollection()) {
                AuditRequestInfo audit = result.get();
                if (audit != null) {
                    String reString = JSONObject.toJSONString(res);
                    audit.setResponse(reString);
                    String opStatus = reString.lastIndexOf("success") > -1 ?
                            reString.substring(reString.lastIndexOf("success") + 9, reString.length() - 1) : "true";
                    opStatus = opStatus.indexOf(",") > -1 ? opStatus.substring(0,opStatus.indexOf(",")) : opStatus;
                    audit.setStatus(opStatus);
                    result.remove();
                    doInsertOpToEs(audit);
                }
                logger.debug("res:", res);
            }
        } catch (Exception e) {
            logger.error("spring aop exception", e);
        }

    }

    @AfterThrowing(throwing = "ex", pointcut = "auditController()")
    public void doAfterThrowing(Exception ex) {
        try {
            if (requestHandle.checkUrlInCollection()) {
                AuditRequestInfo audit = result.get();
                if (audit != null) {
                    audit.setResponse("exception");
                    String opStatus = "false";
                    audit.setStatus(opStatus);
                    result.remove();
                    doInsertOpToEs(audit);
                }
            }
            logger.debug("exception:", ex);
        } catch (Exception e) {
            logger.error("spring aop exception", e);
        }
    }

    private void doInsertOpToEs(AuditRequestInfo searchResult) throws Exception {
        Runnable worker = new Runnable() {
            @Override
            public void run() {
                try {
                    logger.debug("插入ElasticSearch:");
                    logger.debug("即将插入es,url:{},remoteIP:{}",searchResult.getUrl(), searchResult.getRemoteIp());
                    if (elasticsearchManager.getPlatformEsClient() != null) {
                        String index = generateIndexName();
                        IndexRequest request=new IndexRequest();
                        request.index(index).type(ES_INDEX_TYPE_AUDIT_LOG).id(String.valueOf(System.currentTimeMillis())).source(
                                // 这里可以直接用json字符串
                                XContentFactory.jsonBuilder().startObject().field("user", searchResult.getUser())
                                        .field("tenant", searchResult.getTenant()).field("project", searchResult.getProject())
                                        .field("moduleChDesc", searchResult.getModuleChDesc()).field("moduleEnDesc", searchResult.getModuleEnDesc())
                                        .field("actionChDesc", searchResult.getActionChDesc()).field("actionEnDesc", searchResult.getActionEnDesc())
                                        .field("method", searchResult.getMethod()).field("actionTime", searchResult.getActionTime())
                                        .field("requestParams", searchResult.getRequestParams()).field("remoteIp", searchResult.getRemoteIp())
                                        .field("response", searchResult.getResponse()).field("url", searchResult.getUrl())
                                        .field("status", searchResult.getStatus()).field("subject", searchResult.getSubject())
                                        .endObject()).timeout(TimeValue.timeValueMillis(ES_TTL));
                        IndexResponse indexResponse =elasticsearchManager.getPlatformEsClient().index(request, RequestOptions.DEFAULT);

                        logger.debug("用户操作插入es结束:{}", searchResult.getUrl() + ";;;" + searchResult.getRemoteIp());
                        logger.info("用户操作记录插入成功");
                    }
                } catch (Exception e) {
                    logger.error("用户操作记录插入失败", e);
                }
            }
        };

        if (StringUtils.isNotBlank(searchResult.getStatus())) {
            executor.execute(worker);
        }
    }

    private String generateIndexName(){
        Date now = new Date();
        String date = DateUtil.DateToString(now, DateStyle.YYYY_MM_DOT);
        String indexName = ES_INDEX_AUDIT_LOG + "-" + date;
        return indexName;
    }
}
举报

相关推荐

AOP记录日志

0 条评论