java微服务日志处理的最合适方案是什么

更新时间:02-07 教程 由 默遇 分享

情况及需求描述:
1.javaspringboot开发的微服务有多个,每个微服务在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,但输出至dbmysql,然后用logstash把数据导到elastic,最后kibana展示
问题:仍然是关于仅保存自定义字段的需求,网上了解了一圈,默认是要3张表,肯定不是我要的;还有用继承重写方法的,但看起来仍然没有达到我要的要求。并且还有一个连接池的问题没有解决,就也没有研究下去。
尝试方案3:
网关处理好需要保存的日志信息后,直接调用dao层持久化到dbmysql,然后用logstash把数据导到elastic,最后kibana展示
问题:网关上的请求肯定是量很大的,考虑单独架设一个mysql服务,专门用来保存日志,也就是只有写操作,不去影响到业务db。保存的话,肯定不能单条写入,那就想到用队列,队列满一定条数后,批量写入,但这似乎又不能达到实时性的要求


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

声明:关于《java微服务日志处理的最合适方案是什么》以上内容仅供参考,若您的权利被侵害,请联系13825271@qq.com
本文网址:http://www.25820.com/tutorial/14_2162963.html