AOP实现自动化日志记录,并将日志记录到es中

在实际开发当中,日志记录是非常有必要的。将日志记录和业务逻辑解耦,可以引入日志框架(如 SLF4J + Logback)并结合 AOP 实现自动化日志记录。

 引入依赖


    org.slf4j
    slf4j-api
    1.7.30


    ch.qos.logback
    logback-classic
    1.2.3


    org.elasticsearch.client
    elasticsearch-rest-high-level-client
    7.10.1


    org.springframework.boot
    spring-boot-starter-aop

配置 Logback

AOP实现自动化日志记录,并将日志记录到es中

创建或更新 src/main/resources/logback.xml 文件:


    
        
            %d{yyyy-MM-dd HH:mm:ss} - %msg%n
        
    

    
        
    

    
        
    

创建 AOP 日志切面

使用 AOP 创建一个日志切面,用于记录方法的输入和输出日志,并将日志保存到 Elasticsearch:

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Aspect
@Component
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Autowired
    private ElasticsearchService elasticsearchService;

    @Around("execution(* com.yourpackage..*.*(..))")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();

        Object proceed = joinPoint.proceed();

        long executionTime = System.currentTimeMillis() - start;

        logger.info("Method {} executed in {} ms", joinPoint.getSignature(), executionTime);

        // 保存日志到ES
        elasticsearchService.saveLog(joinPoint.getSignature().toString(), executionTime);

        return proceed;
    }
}

创建 Elasticsearch 服务

创建一个服务类,用于处理与 Elasticsearch 的交互:

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.client.RestHighLevelClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;

@Service
public class ElasticsearchService {

    @Autowired
    private RestHighLevelClient client;

    public void saveLog(String methodSignature, long executionTime) {
        Map logEntry = new HashMap<>();
        logEntry.put("method", methodSignature);
        logEntry.put("executionTime", executionTime);
        logEntry.put("timestamp", System.currentTimeMillis());

        IndexRequest request = new IndexRequest("logs");
        request.source(logEntry);

        try {
            client.index(request);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

配置 Elasticsearch 客户端

在 application.properties 或 application.yml 中配置 Elasticsearch 连接信息:

spring.elasticsearch.rest.uris=http://localhost:9200

可视化日志数据

使用 Kibana 等工具连接到 Elasticsearch,可以实时查看存储的日志数据。

总结

  1. 日志记录: 使用 SLF4J 和 Logback 进行日志记录。
  2. AOP: 使用 AOP 记录方法执行时间及相关信息,并将日志发送到 Elasticsearch。
  3. Elasticsearch: 使用 Elasticsearch 存储和查询日志,配合 Kibana 实现可视化。
  4. 优化: 通过引入 AOP,可以实现统一的日志记录逻辑,减少代码重复,方便管理。
版权声明:如无特殊标注,文章均来自网络,本站编辑整理,转载时请以链接形式注明文章出处,请自行分辨。

本文链接:https://www.shbk5.com/dnsj/75449.html