kkwang1199 2021-04-16 16:56 采纳率: 0%
浏览 247

java spring boot微服务访问日志、业务日志持久化、分析及可视化的最合适方案是什么

情况及需求描述:
1.java spring boot开发的微服务有多个,每个微服务在4台云服务器上部署4个节点
2.有1个网关,部署在一台服务器上,所有请求都通过网关进行转发和负载均衡
3.需要对网关发起的每一请求都记录日志,例如请求的时间、ip、参数、耗时、返回结果等
4.网关的访问日志需要保证安全持久化,即不能丢失,以便后期对账
5.希望网关的访问日志的保存,能够具有一定的实时性,以便后台能够即时看到访问的变化、做数据分析等
6.每个微服务、节点上的错误日志能够远程访问查看,而不是登录每一台与服务器去查日志文件
7.一共有4台云服务器,2台阿里、2台华为,每台双核16g,数据库只有一个阿里的rds和redis

尝试方案1:
在网关配置logback,将访问日志输出到logstash,再由logstash输出到elastic,最后kibana展示,即ELK方案
问题:1.logstash的过滤器grok配置有点难,默认如果log.info(RequestModel)这样打日志,RequestModel中的信息会在logstash中单独以一个"message"字段进行保存,这对后面kibana写过滤表达式很难处理。后来采取java代码中"log.info("{} {} {}", request_uri, request_ip, request_param)"这种日志产生后,仅希望将这些request_*字段输出至logstash,多余的字段不要,可用grok过滤,但一些自定义的字段不太会处理,正则表达式也不怎么会用
2.对elastic掌握还不是很深,之前有遇到过数据丢失的情况,由于这次需求要保证数据不能丢失,所以暂不太敢贸然使用
尝试方案2:
仍然在网关配置logback,但输出至db mysql,然后用logstash把数据导到elastic,最后kibana展示
问题:仍然是关于仅保存自定义字段的需求,网上了解了一圈,默认是要3张表,肯定不是我要的;还有用继承重写方法的,但看起来仍然没有达到我要的要求。并且还有一个连接池的问题没有解决,就也没有研究下去。
尝试方案3:
网关处理好需要保存的日志信息后,直接调用dao层持久化到db mysql,然后用logstash把数据导到elastic,最后kibana展示
问题:网关上的请求肯定是量很大的,考虑单独架设一个mysql服务,专门用来保存日志,也就是只有写操作,不去影响到业务db。保存的话,肯定不能单条写入,那就想到用队列,队列满一定条数后,批量写入,但这似乎又不能达到实时性的要求


所以想问,分布式服务的访问日志以及后台业务日志,究竟应该如何设计,使其具备一定实时性、持久化、可分析、可扩展、可视化等要求

  • 写回答

4条回答 默认 最新

  • 关注

    业务日志持久化一般放到mysql吧,其他日志就不需要进数据库了。

    评论

报告相同问题?

悬赏问题

  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题
  • ¥15 FPGA-SRIO初始化失败
  • ¥15 MapReduce实现倒排索引失败
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型