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,可以实时查看存储的日志数据。
总结
- 日志记录: 使用 SLF4J 和 Logback 进行日志记录。
- AOP: 使用 AOP 记录方法执行时间及相关信息,并将日志发送到 Elasticsearch。
- Elasticsearch: 使用 Elasticsearch 存储和查询日志,配合 Kibana 实现可视化。
- 优化: 通过引入 AOP,可以实现统一的日志记录逻辑,减少代码重复,方便管理。
原文地址:https://blog.csdn.net/MogulNemenis/article/details/142456375
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!