java微服務日志處理的最合適方案是什么?
情況及需求描述: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。保存的話,肯定不能單條寫入,那就想到用隊列,隊列滿一定條數后,批量寫入,但這似乎又不能達到實時性的要求
所以想問,分布式服務的訪問日志以及后臺業務日志,究竟應該如何設計,使其具備一定實時性、持久化、可分析、可擴展、可視化等要求