springboot cloud,不同模块,记录接口操作日志

简介: springboot cloud,不同模块,记录接口操作日志

Spring Boot Cloud 中实现请求接口操作记录通常涉及多个模块和组件。可以使用 Spring Boot 提供的功能以及 Spring Cloud 的一些组件来完成这个任务。

1. 架构设计

假设你的系统包括以下模块:

  • API Gateway:接收客户端请求并路由到不同的服务。
  • Service AService B:具体的业务服务模块。
  • Logging Service:用于集中存储和管理操作日志的服务。

我们将通过以下步骤实现请求接口操作记录:

  1. API Gateway:拦截请求并将操作信息传递到日志服务。
  2. Service A / Service B:在处理请求时记录操作信息。
  3. Logging Service:接收并存储日志信息。

2. 关键代码示例

2.1 API Gateway

使用 Spring Cloud Gateway 实现 API Gateway,并在网关中记录日志。

pom.xml(依赖)

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

GatewayConfig.java(配置)

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
 
@Configuration
public class GatewayConfig {
 
    @Bean
    public LoggingFilter loggingFilter() {
        return new LoggingFilter();
    }
 
    public static class LoggingFilter extends AbstractGatewayFilterFactory<Object> {
        
        public LoggingFilter() {
            super(Object.class);
        }
 
        @Override
        public GatewayFilter apply(Object config) {
            return (exchange, chain) -> {
                logRequest(exchange);
                return chain.filter(exchange).then(Mono.fromRunnable(() -> logResponse(exchange)));
            };
        }
 
        private void logRequest(ServerWebExchange exchange) {
            String path = exchange.getRequest().getURI().getPath();
            // Log request details (e.g., using a logging framework)
            System.out.println("Request Path: " + path);
        }
 
        private void logResponse(ServerWebExchange exchange) {
            // Log response details
            System.out.println("Response Status: " + exchange.getResponse().getStatusCode());
        }
    }
}
2.2 Service A / Service B

在每个服务中,可以使用 Spring AOP 来记录请求的操作信息。

pom.xml(依赖)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

LoggingAspect.java切面

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
 
@Aspect
@Component
public class LoggingAspect {
 
    @AfterReturning(pointcut = "execution(* com.example.service..*(..))", returning = "result")
    public void logAfter(JoinPoint joinPoint, Object result) {
        // Log method execution details
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Method: " + methodName + " executed with result: " + result);
        // You can also log additional information like arguments or execution time
    }
}
2.3 Logging Service

记录日志到集中存储(如数据库或 Elasticsearch)。

pom.xml(依赖)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

LogEntry.java(日志实体)

import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
 
@Document(collection = "logs")
public class LogEntry {
 
    @Id
    private String id;
    private String message;
    private String level;
    private long timestamp;
 
    // Getters and setters
}

LogRepository.java(日志存储)

import org.springframework.data.mongodb.repository.MongoRepository;
 
public interface LogRepository extends MongoRepository<LogEntry, String> {
}

LogService.java(日志服务)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
@Service
public class LogService {
 
    @Autowired
    private LogRepository logRepository;
 
    public void saveLog(String message, String level) {
        LogEntry logEntry = new LogEntry();
        logEntry.setMessage(message);
        logEntry.setLevel(level);
        logEntry.setTimestamp(System.currentTimeMillis());
        logRepository.save(logEntry);
    }
}

LoggingController.java(接收日志)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class LoggingController {
 
    @Autowired
    private LogService logService;
 
    @PostMapping("/log")
    public void log(@RequestBody LogEntry logEntry) {
        logService.saveLog(logEntry.getMessage(), logEntry.getLevel());
    }
}

3. 整合与测试

确保所有模块能够正常交互,API Gateway 发送请求到业务服务,业务服务记录日志并将其发送到日志服务。你可以使用 Postman 或类似工具来测试 API Gateway 和业务服务的接口。

4. 总结

以上代码展示了如何在 Spring Boot Cloud 环境中实现请求接口操作记录。实际应用中,你可能需要根据具体需求进行更多的定制和优化。


相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
7月前
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
1081 3
|
6月前
|
监控 安全 程序员
Python日志模块配置:从print到logging的优雅升级指南
从 `print` 到 `logging` 是 Python 开发的必经之路。`print` 调试简单却难维护,日志混乱、无法分级、缺乏上下文;而 `logging` 支持级别控制、多输出、结构化记录,助力项目可维护性升级。本文详解痛点、优势、迁移方案与最佳实践,助你构建专业日志系统,让程序“有记忆”。
542 0
|
存储 Java 文件存储
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— logback.xml 配置文件解析
本文解析了 `logback.xml` 配置文件的详细内容,包括日志输出格式、存储路径、控制台输出及日志级别等关键配置。通过定义 `LOG_PATTERN` 和 `FILE_PATH`,设置日志格式与存储路径;利用 `&lt;appender&gt;` 节点配置控制台和文件输出,支持日志滚动策略(如文件大小限制和保存时长);最后通过 `&lt;logger&gt;` 和 `&lt;root&gt;` 定义日志级别与输出方式。此配置适用于精细化管理日志输出,满足不同场景需求。
3061 1
|
10月前
|
算法 网络协议 Java
Spring Boot 的接口限流算法
本文介绍了高并发系统中流量控制的重要性及常见的限流算法。首先讲解了简单的计数器法,其通过设置时间窗口内的请求数限制来控制流量,但存在临界问题。接着介绍了滑动窗口算法,通过将时间窗口划分为多个格子,提高了统计精度并缓解了临界问题。随后详细描述了漏桶算法和令牌桶算法,前者以固定速率处理请求,后者允许一定程度的流量突发,更符合实际需求。最后对比了各算法的特点与适用场景,指出选择合适的算法需根据具体情况进行分析。
930 56
Spring Boot 的接口限流算法
|
7月前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
1370 5
|
Java 微服务 Spring
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——使用Logger在项目中打印日志
本文介绍了如何在项目中使用Logger打印日志。通过SLF4J和Logback,可设置不同日志级别(如DEBUG、INFO、WARN、ERROR)并支持占位符输出动态信息。示例代码展示了日志在控制器中的应用,说明了日志配置对问题排查的重要性。附课程源码下载链接供实践参考。
1379 0
|
SQL Java 数据库连接
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录—— application.yml 中对日志的配置
在 Spring Boot 项目中,`application.yml` 文件用于配置日志。通过 `logging.config` 指定日志配置文件(如 `logback.xml`),实现日志详细设置。`logging.level` 可定义包的日志输出级别,例如将 `com.itcodai.course03.dao` 包设为 `trace` 级别,便于开发时查看 SQL 操作。日志级别从高到低为 ERROR、WARN、INFO、DEBUG,生产环境建议调整为较高级别以减少日志量。本课程采用 yml 格式,因其层次清晰,但需注意格式要求。
1354 0
|
Java API 开发者
微服务——SpringBoot使用归纳——Spring Boot使用slf4j进行日志记录——slf4j 介绍
在软件开发中,`System.out.println()`常被用于打印信息,但大量使用会增加资源消耗。实际项目推荐使用slf4j结合logback输出日志,效率更高。Slf4j(Simple Logging Facade for Java)是一个日志门面,允许开发者通过统一方式记录日志,无需关心具体日志系统。它支持灵活切换日志实现(如log4j或logback),且具备简洁占位符和日志级别判断等优势。阿里巴巴《Java开发手册》强制要求使用slf4j,以保证日志处理方式的统一性和维护性。使用时只需通过`LoggerFactory`创建日志实例即可。
813 0
|
监控 测试技术 Go
告别传统Log追踪!GOAT如何用HTTP接口重塑代码监控
本文介绍了GOAT(Golang Application Tracing)工具的使用方法,通过一个Echo问答服务实例,详细展示了代码埋点与追踪技术的应用。内容涵盖初始化配置、自动埋点、手动调整埋点、数据监控及清理埋点等核心功能。GOAT适用于灰度发布、功能验证、性能分析、Bug排查和代码重构等场景,助力Go项目质量保障与平稳发布。工具以轻量高效的特点,为开发团队提供数据支持,优化决策流程。
778 89
|
9月前
|
机器学习/深度学习 XML Java
【spring boot logback】日志logback格式解析
在 Spring Boot 中,Logback 是默认的日志框架,它支持灵活的日志格式配置。通过配置 logback.xml 文件,可以定义日志的输出格式、日志级别、日志文件路径等。
1734 5