自学内容网 自学内容网

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

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

 引入依赖

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.30</version>
</dependency>
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.2.3</version>
</dependency>
<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>7.10.1</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

配置 Logback

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

<configuration>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.yourpackage" level="DEBUG">
        <appender-ref ref="CONSOLE" />
    </logger>

    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>
</configuration>

创建 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<String, Object> 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://blog.csdn.net/MogulNemenis/article/details/142456375

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!