SpringBoot实现监听API调用的事件日志通知服务
解决方案:跨服务API调用触发通知及路径映射处理
一、可行性确认
完全可以在8080端口部署事件日志应用,监听另一服务器(或Docker容器)的API调用事件。本地Docker部署时,只要把两个容器配置到同一网络,就能实现跨服务通信,不存在技术障碍。
二、核心实现方案
推荐两种主流方案,按需选择:
1. API服务主动推送事件(优先选这个)
当API被调用完成后,主动向事件日志服务的指定接口发送事件数据,实时性最高。
- 操作步骤:
- 在事件日志服务(8080端口)写一个接收通知的接口,比如
POST /api/events,用来接收API调用的关键信息(请求路径、HTTP方法、调用时间、请求体等) - 在API服务里,用RestTemplate或WebClient这类HTTP客户端,在API接口的切面(AOP)或者拦截器里,调用事件日志服务的接口推送事件
- Docker本地测试配置:
- 先创建自定义网络:
docker network create app-network - 启动API服务容器时加入该网络:
docker run --name api-service --network app-network -p 8081:8081 your-api-image - 启动事件日志容器时同样加入该网络:
docker run --name event-log-service --network app-network -p 8080:8080 your-event-log-image - API服务里调用事件日志服务的地址直接用容器名:
http://event-log-service:8080/api/events(同一Docker网络内可以通过容器名直接解析,不用记IP)
- 先创建自定义网络:
- 在事件日志服务(8080端口)写一个接收通知的接口,比如
2. 事件日志服务主动拉取日志(适合无法修改API服务的场景)
如果没法改动API服务的代码,就让事件日志服务定期去拉取API服务的日志文件,解析后触发通知。
- 操作步骤:
- 给API服务配置日志输出到指定目录,比如
/logs/app.log,并且让日志格式包含API调用的关键信息(比如请求路径、时间戳) - Docker部署时,给API服务容器挂载日志目录:
docker run --name api-service --network app-network -v ./local-api-logs:/logs -p 8081:8081 your-api-image - 事件日志服务容器也挂载同一个本地目录:
docker run --name event-log-service --network app-network -v ./local-api-logs:/event-log/api-logs -p 8080:8080 your-event-log-image - 事件日志服务定时扫描
/event-log/api-logs/app.log,解析新增的日志条目,匹配到API调用事件后触发通知
- 给API服务配置日志输出到指定目录,比如
三、路径映射问题解决
针对你参考Spring Boot日志教程时遇到的路径映射疑问,分两种场景处理:
场景1:事件日志服务接收推送的路径映射
- 在事件日志服务的
@RestController类里,明确声明接口的路径映射,示例代码:
@RestController @RequestMapping("/api/events") public class EventLogController { @PostMapping public ResponseEntity<Void> receiveApiEvent(@RequestBody ApiEventDto event) { // 这里写处理逻辑:记录事件日志、触发通知(比如邮件、短信) return ResponseEntity.ok().build(); } }
- 如果需要给整个服务加统一路径前缀,在
application.properties里配置:server.servlet.context-path=/event-log,此时接口路径就变成http://event-log-service:8080/event-log/api/events,调用时要对应上。
场景2:拉取日志时的文件路径映射
- 如果API服务用Spring Boot默认日志配置,日志默认存在
logs/spring.log(相对于应用工作目录)。Docker挂载时要对应容器内的正确路径:- API服务容器挂载命令:
-v ./local-api-logs:/app/logs(假设API服务的工作目录是/app,如果不确定,可以进入容器用pwd查看) - 事件日志服务容器挂载同一个本地目录:
-v ./local-api-logs:/event-log/api-logs,然后在代码里读取/event-log/api-logs/spring.log即可。
- API服务容器挂载命令:
四、本地测试验证步骤
- 先创建自定义Docker网络,确保两个容器能互通
- 分别启动API服务和事件日志服务容器,注意端口不要冲突(比如API用8081,事件日志用8080)
- 调用API服务的任意接口,检查事件日志服务是否接收到事件并触发通知
- 如果用拉取日志的方式,查看本地挂载的日志目录是否有新增日志,事件日志服务是否正确解析到API调用记录
内容的提问来源于stack exchange,提问作者V.T
相关产品推荐
相关产品推荐

