第一次使用分布式日志时,开发人员的第一反应可能是将应用程序日志直接从其应用程序发送到日志后端。直接连接很有吸引力:毕竟,需要管理的活动部件更少。这样的通信通常发生在事务性REST api上,给开发者一种安全的错觉,他们的所有日志都会通过。

不幸的是,该模型存在三个脆弱点:

  1. 背压上的HTTP请求可以破坏的检测代码的正常功能,尤其是当日志达到意想不到的大小或速度。
  2. 当将数据发送到日志后端时,延迟可能会导致日志数据传输的延迟。
  3. 网络连接问题可能会导致丢失的日志,这是特别麻烦的时候从一个中断的APM-桩的应用归属关系代理日志。

现场可靠性工程的一个中心原则是对系统进行持续的遥测,以使系统不那么脆弱。分离您的日志货代从您的应用程序可以使您的系统更脆弱的:当你解耦货代从您的应用程序代码,你可以使复杂的处理计算在一个单独的过程,和更频繁地更新代码或配置你的货代而不用担心影响一个底层应用程序。

此外日志转发已建成内存或基于文件的缓冲提供用于应用程序的数据中心和测井后端之间的延迟和中断的所有方式的关键灵活性。

登录也可承揽:

  • 扩展到支持比底层应用程序代码更广泛的网络协议和输出格式
  • 在基础设施级别(例如。,you can run them on different hosts or in different containers)
  • 负载均衡
  • 用于复杂管道,实现上游聚合和持久缓冲

在这篇文章中,我将分享使用日志转发器向日志后端交付日志的五种企业级模式,例如New Relic的日志-a的中心部件New Relic的一个。通过减少延迟、错误和饱和,这些模式可以让您大致了解可以做出哪些实际选择来减少整个日志管道中的脆弱性。我的目标是揭开分布式日志记录过程的神秘面纱,并提供您现在可以使用的实用模式。

选择原木转发器

Logstash(麋鹿群的一部分)rsyslog现在Fluentd是常见的,比较容易使用日志转发。较新的代理像Wayfair的地震Timber.io向量是用于高性能使用情况而建,但它远远超出了本文的范围比较和对比他们。

在New Relic的基础剂支持日志转发由流利位扩展的手段。配置通常与流利位句法兼容。它的方便使用内置的转发器来发送日志,如果部署的基础设施剂。在这篇文章中,我的示例配置将使用流畅流畅的钻头作为独立的转发器。您可以在场景中使用这些,你不能安装基础剂或你想有一个集中式转发层来处理多个分布源。

注意:除了Fluentd和流利位,Logstash和Vector也提供了New Relic的日志插件。这里未列出的其他代理可能有,你可以使他们能够将日志发送到任何后端,包括New Relic的灵活的配置选项。

考虑下面的特性,以确定是否需要Fluentd或流利位:

优点

缺点

Fluentd

  • 数以百计的插件可用

  • 接受频繁的更新


  • 内置Ruby,需要几个Ruby gem依赖项

  • 高内存占用

流利一些

  • 在C中编译,没有额外的依赖项

  • 低内存占用

  • 适用于物联网和嵌入式系统


  • 收到较少频繁的更新

  • 只有15个可用的插件

安装Fluentd或流利位

New Relic的日志提供了一个快速,可扩展的日志管理平台,使您可以将日志数据与遥测数据的其余部分连接。预建的Fluentd和流利位(及其他)插件使简单的从到New Relic的一个随时随地发送您的数据。

有关安装和配置说明,请参阅New Relic文档:

下面的例子假设你要转发日志New Relic的,在这种情况下,你需要一个New Relic许可密钥。如果您还没有许可证密钥,但要测试基本转发功能,你可以下载一个转发器(请参见下面的链接),并将其配置为写入输出文件用于测试目的。

注意:为包管理器构建的这些工具的分支遵循的命名约定TD-剂(Fluentd)和td-agent-bit(流利位)。

流利位软件包:

Fluentd包:

现在,让我们来看看五种模式转发日志New Relic的一个(或任何后端要使用)。对于每一个模式,我们来看看利弊,而且我还包括了一些示例配置。

模式1:在同一地点转发了文件零售商

在这个模式中,你会使用一个文件零售商观看一个或多个日志文件和他们写发送新行到你的日志记录的后端。转发器位于应用程序主机上的两个应用程序之间。大多数代理公司有着丰富的配置选项,以确定发布到日志后端时,究竟是怎么拖尾作品是什么样的缓冲,将被使用。有关其他的可扩展性,一个共同定位的转发器也可以向前到脱离主机转发器层(类似于图案3下面讨论)。

图形1的优点

  • 此模式随应用程序基础设施自动扩展,因为每个基础设施单元有一个转发器。
  • 由于此模式使用日志文件,所以您可以转发可能无法使用现代日志工具重新构建的遗留应用程序的日志。

模式1的缺点

  • 每个转发器都可能消耗大量的计算资源,这可能会增加应用程序基础设施的系统部署。
  • 对于位于同一地点的转发器配置成为每个应用程序的配置的依赖,它可以添加到应用程序配置和部署的复杂性。
  • 在峰值负载时,日志文件可能会增长到文件跟踪器(以及日志旋转实用程序)无法跟上速度,从而导致日志延迟和可能的存储问题。

实施例配置图案1

注意:这里的示例(以及本文其余部分中的示例)引用Python APM代理日志记录器配置。有关如何使用Python代理在上下文中完全配置日志的示例,看文档。另外,请参阅设置日志记录的处理Python官方文档确保您建立正确输出。

。。实例化一个新的日志处理程序handler = log . filehandler (' /var/log/app-a.log ')。

Fluentd

 @type tail  @type none  path /var/log/app-a.log tag app-a   @type tail  @type none  path /var/log/app-b.log tag app-b   @type newrelic license_key  base_uri https://log-api.newrelic.com/log/v1 0

流利一些

[INPUT]名称尾路径/var/log/app-a.log[INPUT]名称尾路径/var/log/app-b.log[输出]名称newrelic Match * licenseKey 

模式2:使用套接字的同一位置的转发器

在这个模式中,应用程序代码直接发送日志到您的代理通过UDP或TCP端口(无文件存储),以及转发器将在异步向前转到新的文物(使用New Relic测井API)。代理位于应用程序和New Relic后端之间,提供了最小的缓冲区和处理层。

注意:这超出了这篇文章的范围来指导你是否应该使用UDP与TCP。一般来说,UDP对应用程序的影响最小,但是协议的交付保证较低。由于这个原因,大多数大容量日志环境最终都倾向于使用UDP将日志发送到转发器。某些安全应用程序,例如SIEM软件方面,仍倾向于使用TCP来确保完整性。

图案2的优点

  • 此模式随应用程序基础设施自动扩展,因为每个基础设施单元有一个转发器。
  • 此模式使用套接字协议进行日志输入,因此不需要存储或旋转文件。而且由于货代位于同一位置,网络开销很低。
  • 一个转发器可以从任何可以通过网络接口访问它的应用程序接收日志。

图案2的成本

  • 每个转发器都可能消耗大量的计算资源,这可能会增加应用程序基础设施的系统部署。
  • 共存转发器的配置成为每个应用程序配置的依赖项,这可能增加应用程序配置和部署的复杂性。
  • 你不会有任何物理日志文件,您可以探索到主机上排除应用程序中(除非你写,作为一个不同的配置)。
  • TCP协议仍然可能会导致背压到应用程序。
  • 您需要调优TCP和UDP内核参数,这个用例。
  • 你将需要监测系统遥测,如:
    • UDP缓冲区(用于UDP)
    • UDP缓冲区接收错误
    • TCP错误

实施例配置图案2

UDP

UDP示例。实例化一个新的日志处理程序handler = logging。DatagramHandler(' localhost ', 5160) . .

TCP

#TCP实施例。#实例化新的日志处理程序的处理程序= logging.SocketHandler(“本地主机”,5170)。。

Fluentd

<源> @type UDP <解析> @type无标记udp_5160端口5160绑定0.0.0.0  <源> @type TCP标签tcp_5170 <解析> @type无端口5170绑定0.0.0.0  <匹配**> @type NewRelic的许可密钥 base_uri https://log-api.newrelic.com/log/v1 

流利一些
注意:UDP不支持作为内置的插件,用来流利位。

[输入]名称tcp监听0.0.0.0端口5170[输出]名称newrelic Match * licenseKey 

模式3:分别位于转发器使用套接字

在这个模式中,你的日志转发器位于应用程序主机之外。您的应用程序代码将你的日志发送到您的代理通过UDP或TCP端口,转发器将依次使用登录API(封装在New Relic输出插件中),将其转发到New Relic One。

将您的转发器移到单独的基础设施中,可以获得计算资源利用方面的规模经济效益,并集中配置和维护日志转发器基础设施。使用此模式,不同的应用程序家族可以将日志数据发送到相同的基础设施池中。如果需要,您甚至可以使用不同的端口或协议以及模式匹配来对来自不同源的日志进行定制处理。

模式3的优点

  • 在这个模式中,你有专门配置的处理日志特定的基础设施;您不需要提供转发器为您的应用程序基础设施的一部分。
  • 您可以将来自不同应用程序池的日志发送到相同的日志转发池。
  • 你会消除反压,因为你可以扩展您的货代独立于应用程序。
  • 您可以使用许多强大的方法来实现持久缓冲区;例如,您可以使用Apache卡夫卡存储它们运送到New Relic的一个或日志记录的后端之前记录。

模式3的缺点

  • 你不会有任何物理日志文件,您可以探索到主机上排除应用程序中(除非你写,作为一个不同的配置)。
  • 您必须维护具有独立配置的新型基础设施。
  • 您仍然可能遇到“热发送方”应用程序的问题,它会在转发器池中淹没一个转发器。(在下一个模式中,我将展示如何在您的代理池前使用负载平衡层来消除这个问题。)

实施例配置图案3

您的Python代理日志配置将几乎相同的模式2,但将有必要使用公共IP或DNS名称的代理主机:

处理机= logging.DatagramHandler(“forwarder1.host.mycompany.com”,5160)

模式4:分别位于转发负载均衡

与前一个模式一样,转发器层位于应用程序的外部。但是,在这种情况下,代理层安装在负载平衡器层的后面。应用程序代码通常通过UDP端口将日志发送到代理层前面的负载平衡器层,负载平衡器将根据通用的负载平衡规则(例如,轮询调度)将数据发送到代理层的适当实例。每个转发器的配置都与前一个模式中的转发器相同。

基本上,除了负载平衡器层之外,这个转发器池的配置没有什么不同。在这种情况下Nginx的负载平衡器将确保一个应用过程中不会压倒的特定转发器。您的应用程序将发送使用与相关的循环DNS资源记录Nginx UDP负载均衡器

图案4的优点

  • 该模式允许大量的可伸缩性。
  • 这非常适合于多租户日志转发的基础设施。
  • 您将获得日志转发基础设施的高可用性。
  • 从“热发件人”记录“尖峰”将被更好地分布,从而一个应用程序,它可以被发送日志的过高的体积不能堵塞转发端点。

图案4的缺点

  • 您将需要维护具有独立配置的新基础设施类。

实施例配置图案4

您的Python日志配置将几乎与模式2和模式3相同,但必须使用与Nginx负载均衡器关联的DNS名称。

处理机= logging.SocketHandler(“loglb.mycompany.com”,5160)

配置您的负载均衡器如下:

#负载平衡UDP跨两个服务器的DNS流量流{上游dns_upstreams{服务器<货代1的IP 3>:5160;服务器< 2个>的货代2的IP:5160;服务器< 3个>的货代3的IP:5016;服务器{监听5160 udp;proxy_pass dns_upstreams;proxy_timeout 1 s;proxy_responses 1;error_log日志/ log-lb.log;}}

模式5:日志解释和路由

这组模式可以与我们讨论过的任何其他数据传输模式混合在一起。对于大多数企业用例,您需要充实、筛选和适当地路由您的日志。这些模式的实现往往依赖于转发器,但是大多数常见的转发器将支持这些模式。(关于如何处理日志事件的更多背景知识,我建议生命中的一件大事。)

优点

  • 这套模式允许大规模的可扩展性。
  • 这种模式减轻异常的速度和日志大小尖峰没有崩溃您的转发器。

缺点

  • 这些模式提供了一层复杂性,因为删除和路由日志数据会使logstream变得模糊。
  • 当您启用各种类型的过滤器时,转发器可能会消耗大量的CPU和RAM资源。确保以合理的方式使用过滤器。如果使用不止一组过滤器,请始终首先运行排除大部分数据的过滤器,这样就不必处理无论如何都要删除的数据。

让我们看一些过滤、充实和路由的例子。

过滤

选择要包含在日志流中的日志。

Fluentd的支持匹配指示每个输出插件。该匹配指令查找具有匹配标签和处理这些事件。

  • 允许全部
    …New Relic帐号A..< / >匹配
  • 只允许标记为来自某些应用程序的记录
    <匹配app.customer_info >…< / >匹配

需要注意的一个缺点是:如果在转发器中有任何中间处理,每条记录都将收到处理开销,即使您丢弃了该记录。你也可以的Fluentd事件处理管线内过滤器,它允许您尽快丢弃不必要的记录。

标签app-a  …过滤软件只有应用程序-a… …输出配置…

另一种非常有用的模式是删除或排除不需要的内容。你可以用<排除>过滤器从流中删除某些日志,例如包含个人识别信息(PII)的日志。

<滤波器**> @type的grep <排除>密钥消息图案/ USERNAME /  

丰富

向流中现有的日志添加或更改内容。

充实通常需要向被处理的记录中添加或更新一个元素。例如,Fluentd提供了许多操作符来实现这一点record_transformer

#加host_param到每个记录。<滤波器app.customer_info> @type record_transformer <记录> host_param “#{Socket.gethostname}” 

这些基本的示例并没有充分展示Fluentd支持的标签管理的全部功能。看到rewrite_tag_filter文档的一些很好的例子,如何使用rewrite_tag_filter插件注入一个标签为记录,这使得下游管道极大的灵活性。

路由

将不同类型的日志发送到不同的后端(例如,发送到单独的New Relic帐户)。

Fluentd支持许多功能强大路由技术允许你发送不同的事件到完全不同的后端。路由的两个实际例子是:

  1. 将一个应用程序的日志发送到一个特定的New Relic帐户,但将所有其他应用程序的日志发送到另一个不同的New Relic帐户。
  2. 将日志发送到两个不同的输出:a) New Relic和b)用于长期归档的云存储桶。

不要压倒系统

在现代背景下SRE-其中全栈可观测性是至关重要的,它是有道理的投入相当大的思想你上游的日志实现将如何扩展,以及它如何能是有弹性的,以在复杂的广域数据中心之间可能发生的各种延迟和中断网络。

在某些反常的条件下,甚至表现良好的应用程序可突然开始每个日志(多MB堆栈跟踪或对象转储)意外的大小以发射日志或在先前已经意外(每分钟数百万)的速率。我已经示出的模式提供了所需的,以确保这些异常不压倒系统的任何单个部件,并引起可观测不可接受的破坏工具包的主要部分。

如果你想从我们的专家那里寻找更多伟大的New Relic日志内容,请不要错过如何设置登录上下文为Java应用程序运行在Kubernetes

并确保请求一个演示今天的New Relic的日志!

吉姆·哈根是总部位于波士顿的企业解决方案顾问与New Relic的。他拥有20年的经验,作为一名软件工程师,在地理空间技术和时间序列分析的专业知识。加入了New Relic之前,他曾在高度分散的日志和指标平台在Wayfair。通过查看帖子

以书面New Relic的博客人气?亚搏体育登入网给我们一个间距!