多节点环境中的Java日志记录最佳实践
在我的公司,我在多节点基础设施中管理一个大型应用程序(>10万用户),由3台(但可能更多)应用服务器组成。 每个应用服务器都有5个不同的日志文件,其中记录了有关http/s(REST或SOAP)请求和对其他(外部)子系统的响应的几乎所有信息。我使用ApacheHTTP客户端来处理REST流、wsimport生成的SOAP请求客户端和Logback作为日志记录技术 目前,当我被要求调试某些东西时,我必须做的最复杂和最耗时的任务是确定我必须调试的节点。在那之后,我必须实际grep大量的行以发现发生了什么。老实说,我觉得它很无聊、过时,而且很复杂 为了让我的生活更轻松,让我的日志更有趣,我在过去的几天里查看了elasticsearch堆栈(elasticsearch、logstash、kibana),并播放了他们的docker图像。我发现它们非常有趣,我想在我的应用程序中介绍它们,但在这样做之前,我想知道是否有做类似事情的最佳实践/模式 以下是我的疑问:多节点环境中的Java日志记录最佳实践,java,http,
elasticsearch,logback,apache-httpclient-4.x,Java,Http,
elasticsearch,Logback,Apache Httpclient 4.x,在我的公司,我在多节点基础设施中管理一个大型应用程序(>10万用户),由3台(但可能更多)应用服务器组成。 每个应用服务器都有5个不同的日志文件,其中记录了有关http/s(REST或SOAP)请求和对其他(外部)子系统的响应的几乎所有信息。我使用ApacheHTTP客户端来处理REST流、wsimport生成的SOAP请求客户端和Logback作为日志记录技术 目前,当我被要求调试某些东西时,我必须做的最复杂和最耗时的任务是确定我必须调试的节点。在那之后,我必须实际grep大量的行以发现发生了
- 在记录Http/s REST和SOAP请求/响应(我需要查看所有内容:url、头、路径、正文、cookies等)时,是否有一种可以通过logstash/elasticsearch轻松解析的格式的最佳实践
- 考虑到我的基础设施,我应该为我的logback实现使用elasticsearch appender,还是使用Logstash作为日志处理器(我假设每个应用服务器都有一个)
- 是否有有效的替代方案来满足我的要求,以回登录和elasticsearch技术
- 这包括操作更改,例如更改ElasticSearch群集的地址
- 协议、加密的选择
- 压缩的选择
- 完全控制日志消息的格式(包括自定义字段)
- 对发送异常等特殊消息的控制
考虑将Java应用程序设计为调用日志外观(即SLF4J),而不是直接调用logback。这使您能够在将来轻松地切换到其他日志记录提供程序。以下是其中一个复杂的答案:) ELK stack绝对可以让您在分布式环境中的生活更加轻松。 然而,为了从中获益,可以考虑以下做法:
- 在ElasticSearch的日志消息中,您应该看到以下内容(除了明显的时间、级别和消息本身):
- 产生大量消息的服务器
- 发起请求的用户
- 如果您的应用程序是多租户-处理请求的租户
- 所有消息应具有相同的结构(层