适⽤于Java开发⼈员的微服务:⽇志管理
1.简介
通过本教程的这⼀部分,我们进⼊了 。 听起来像是另⼀个花哨的流⾏语,那到底是什么?
在固有的分布式系统中,有太多相互影响的移动部件,并且可能以⽆法预测的⽅式失败。
尽快发现问题,在系统中出出现问题的确切位置,并出确切原因,这些是与相关的的最终⽬标。 这确实是⼀个⾮常困难的⽬标,需要
bootstrapped采取综合措施。
我们将要讨论的的第⼀⼤Struts是⽇志记录。 做好⽇志后,它们可以包含有关您的应⽤程序和/或服务所处状态的宝贵(通常是⾮常宝贵
的)详细信息。⽇志是直接将您带⼊应⽤程序或服务错误流的主要来源。 除此之外,在基础架构级别,⽇志在识别安全问题和事件⽅⾯特
别有⽤。
毫不奇怪,我们将专注于应⽤程序和服务⽇志。 ⽇志记录的艺术可能是我们开发⼈员⼀⽣中不断完善的技能。 我们知道⽇志应该是有⽤
的,易于理解的(经常是我们或我们的队友在上⾯运⾏),并且包含⾜够的有意义的数据以重建流程并解决问题。 原⽊膨胀或原⽊短缺,
都导致浪费宝贵的时间或/和资源,很难到合适的平衡。 此外,与通过粗⼼的⽇志记录做法泄漏有关的事件并⾮罕见,但其后果是深远
的。
的分布式性质假设存在许多服务,这些服务由不同的团队管理,很可能使⽤不同的框架来实现,并且在不同的运⾏时和平台上运⾏。 它导
致⽇志格式和实践的激增,但是尽管如此,您必须能够将所有⽇志合并到⼀个中央可搜索位置,并能够关联跨和基础架构边界的事件和流。
听起来像是不可能完成的任务,不是吗? 尽管当然不可能涵盖其中的每个⽇志记录框架或库,但这⾥还是要有⼀组核⼼原则。
⽬录
2.结构化还是⾮结构化?
提出并强制使⽤适⽤于⽇志的通⽤格式是不现实的,因为每个单独的应⽤程序或服务都在做不同的事情。 但是,围绕结构化⽇志记录和⾮
结构化⽇志记录展开了⼀般性辩论。
要了解争论的内容,让我们以JCG租车平台的⼀部分Reservation Services为例,看看典型的应⽤程序如何进⾏⽇志记录。
<
22019-07-27 14:13:34.080  INFO 15052 --- [          main] o.c.cassandra.migration.MigrationTask    : Keyspace rentals is already up to date at version 1 32019-07-27 14:13:34.927  INFO 15052 --- [          main] d.s.w.p.DocumentationPluginsBootstrapper : Documentation plugins bootstrapped
42019-07-27 14:13:34.932  INFO 15052 --- [          main] d.s.w.p.DocumentationPluginsBootstrapper : Found 1 custom documentation plugin(s)
52019-07-27 14:13:34.971  INFO 15052 --- [          main] s.d.s.w.s.ApiListingReferenceScanner    : Scanning for api listing references
62019-07-27 14:13:35.184  INFO 15052 --- [          main] o.s.beddedty.NettyWebServer  : Netty started on port(s): 18900
<
您可能会注意到,⽇志记录输出遵循某种模式,但总的来说,它只是⼀种⾃由样式⽂本,当图⽚中出现异常时,它将变得更加有趣。
12019-07-27 14:30:08.809  WARN 12824 --- [nfoReplicator-0] comflix.discovery.DiscoveryClient    : DiscoveryClient_RESERVATION-SERVICE/********:rese 2
3comflix.ansport.TransportException: Cannot execute request on any known server
4 at comflix.ansport.ute(RetryableEurekaHttpClient.java:112) ~[eureka-client-1.9.12.jar:
5 at comflix.ansport.ister(EurekaHttpClientDecorator.java:56) ~
[eureka-client-1.9.12.jar:
6 at comflix.ansport.decorator.ute(EurekaHttpClientDecorator.java:59) ~[eureka-client-1.9.12
<
从此类⽇志中提取有意义的数据并不有趣。 本质上,您必须解析和匹配每个⽇志语句,确定它是单⾏还是多⾏,提取时间戳,⽇志级别,
线程名称,键/值对,等等。 通常,它是可⾏的,但也很耗时,计算量⼤,易碎且难以维护。 让我们将其与结构化⽇志进⾏⽐较,在结构化
⽇志中,格式或多或少是标准格式(例如 ),但是字段集可能(实际上将)有所不同。
1{"@timestamp":"2019-07-27T22:12:19.762-04:00","@version":"1","message":"Keyspace rentals is already up to date at version 1","logger_name":"i 2{"@timestamp":"2019-07-27T22:12:20.545-04:00","@version":"1","message":"Documentation plugins bootstrapped","logger_name":"springfox.documentatio 3{"@timestamp":"2019-07-27T22:12:20.550-0
4:00","@version":"1","message":"Found 1 custom documentation plugin(s)","logger_name":"springfox.documen 4{"@timestamp":"2019-07-27T22:12:20.588-04:00","@version":"1","message":"Scanning for api listing references","logger_name":"springfox.documentation.s 5{"@timestamp":"2019-07-27T22:12:20.800-04:00","@version":"1","message":"Netty started on port(s): 18900","logger_name":"org.springframework.boot.we
这些是以结构⽅式表⽰的相同⽇志。 从索引和分析的⾓度来看,处理此类结构化数据⾮常容易,也更加⽅便。 请考虑⽀持您的的结构化⽇
志记录,它肯定会有所回报。
3.登录容器
确定⽇志格式后的下⼀个问题是应将这些⽇志写⼊何处。 为了到正确的答案,我们可能会回到原理。
由于所有JCG Car Rentals 都在容器中运⾏,因此它们不必关⼼如何编写或存储⽇志,⽽应将其流式传输到stdout/stderr 。 执⾏/运⾏时
环境将调⽤如何捕获和路由⽇志。 不⽤说,这样的模式是深受所有容器协调器(FE⽀持 , ,...)。 从侧⾯讲,处理多⾏⽇志语句将是⼀个
挑战。
值得⼀提的是,在某些情况下,您可能会遇到将其⽇志写⼊⽇志⽂件⽽不是stdout/stderr的应⽤程序或服务。 请记住,由于容器⽂件系统是
临时的,因此您将必须配置持久卷或使⽤发送程序将⽇志转发到远程端点,以防⽌⽇志永久丢失。
4.集中⽇志管理
到⽬前为⽌,我们已经讨论了简单的部分。 下⼀个(可能是最重要的⼀个)是⽇志管理和合并。
4.1弹性堆栈(以前称为ELK)
我们要讨论的第⼀个选项是过去称为 。 它是⼀个缩写,代表三个开源项⽬: , 和 。
为⽇志管理和聚合提供了完整的端到端管道,因此在社区中获得了极⼤的欢迎。 是的下⼀步发展,其中还包括另⼀个开源项⽬ 。
如果您正在考虑拥有⾃⼰的⽇志管理基础架构,那么 (或其前⾝ )是第⼀选择。 但是请注意,从操作⾓度来看,保持集正常运⾏可能是
⼀项挑战。
JCG租车平台使⽤整合所有服务中的⽇志。 幸运的是,使⽤和将结构化⽇志发送到⾮常容易。 l配置⽚段如下所⽰。
1<configuration>
2    <include resource="org/springframework/boot/logging/l"/>
3
4    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
5        <destination>logstash:4560</destination>
6        <encoder class="net.der.LogstashEncoder" />
7    </appender>
8
9    <root level="INFO">
10        <appender-ref ref="CONSOLE" />
11        <appender-ref ref="logstash" />
12    </root>
13</configuration>
⽇志⽴即可供搜索, 实际上是⼀站式商店,可以对它们进⾏相当复杂的分析或查询。
来⾃Logstash的⽇志存储在Elasticsearch中并在Kibana中提供
或者,您可以只使⽤将⽇志写⼊stdout/stderr然后将输出 。
4.2 Graylog
是另⼀个基于和构建的集中式开源⽇志管理解决⽅案。
与相⽐,主要区别之⼀是可以通过⽹络直接从应⽤程序或服务接收结构化⽇志(采⽤格式)(⼤多数情况下,每个⽇志记录框架或库都)。
4.3 GoAccess
是⼀个开放源代码解决⽅案,专门⽤于实时分析来⾃Web服务器的⽇志。
它不是⼀个完善的⽇志管理产品,但是它确实具有独特的功能集,可以很好地满⾜您的运营需求。
4.4 Grafana Loki
⽆疑是开源⽇志管理领域的新来者,该不到⼀年前) 。
的⽬标是保持尽可能轻巧,因此故意将⽇志的索引编制和处理排除在范围之外。 它具有⼀流的⽀持,但请注意, ⽬前处于Alpha阶段,不建议在⽣产中使⽤。
5.⽇志传送
让我们从完整的现成的⽇志管理解决⽅案中稍微切换⼀下,以记录⽇志数据收集器和托运⼈。 它们的作⽤是通过介于两者之间将源⽇志流与底层后端系统分离。 作为⼀部分的和就是很好的例⼦。
流利的
是⼴泛使⽤的开源数据收集器,现已成为 ( )的成员。
成为成员的好处之⼀是有机会与紧密集成,⽽⽆疑在此发光。 它通常在部署中⽤作⽇志 。
阿帕奇⽔槽
可能是最古⽼的开源⽇志数据收集器和聚合器之⼀。
5.3 rsyslog
是功能强⼤,模块化,安全和⾼性能的⽇志处理系统。 它接受来⾃各种来源(系统或应⽤程序)的数据,可以选择将其转换并输出到不同的⽬的地。 在于,它已预装在⼤多数Linux发⾏版中,因此基本上您可以在⼏乎任何容器中免费获得它。
6.云
领先的在集中式⽇志记录⽅⾯有完全不同的⽅法。 正如我们将要看到的,有些确实提供了专门的产品,⽽另⼀些则包括了⽇志管理,这是较⼤的⼀部分。
6.1 Google Cloud
可能是其中最好的实时⽇志管理和分析⼯具之⼀,称为 ( 产品的⼀部分)。
集成令⼈惊讶,但实际上它是由的⾃定义发⾏版提供 。
6.2 AWS
⽇志管理产品的中⼼是 。
除了 , 还带来了由⽀持的实施的⽤例。
6.3 Microsoft Azure
⽤于管理⽇志的专⽤产品经历了两次转变,并且到今天为⽌已成为的⼀部分。
7.⽆服务器
在的上下⽂中考虑⽇志的微妙之处很有趣。 起初,没有太⼤不同,对吧? 弊端在于细节:粗⼼的⽇志记录⼯具可能会极⼤地影响执⾏时间,从⽽直接影响成本。 请记住这⼀点。
8.微服务:⽇志管理–结论
在本教程的这⼀部分中,我们开始讨论Struts,从⽇志开始。 尾随⼀个⽇志⽂件就⾜够了。 相反, 带来了来⾃许多不同来源的⽇志集中和整合的挑战。 可以说,⽇志仍然是解决软件系统中的问题的主要信息来源,但是还有其他强⼤的⼿段可以对它们进⾏补充。
友善的提醒是,在整个教程中,我们专注于免费和开源产品,但是商业⽇志管理解决⽅案的市场巨⼤。 许多组织倾向于将⽇志管理⼯作转移给供应商,⽽只是为此付费。
9.接下来
在本教程的下⼀部分中,我们将继续关于的讨论,这次重点是度量。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。