目录

前言

搭建日志处理系统的需求原因

一个完整的集中式日志系统,需要包含以下几个主要特点

日志采集的可行性方案

系统架构图示例

Filebeat 模块

组件组成:prospectors & harvesters

Filebeat如何记录文件状态

Filebeat如何保证事件至少被输出一次

Logstash 模块

logstash 简介

Input 部分

Filters 部分

Outputs 部分

Codecs 部分

Elasticsearch 模块

Kibana 模块

相关官网

参考文章


前言

        本工程采用的组件方案为ELKF,也就是ElasticSearchElasticSearch、 LogStash、Filebeat。至于展示层面的Kibana 组件接入Es 比较简单 修改kibana的kibana.yml 的es连接地址即可,暂时忽略。

搭建日志处理系统的需求原因

        一般我们需要进行日志分析场景:直接在应用系统服务后台的日志文件路径下 通过 grep、awk 等查找命令就可以获得自己想要的信息。

        我们都知道,在生产环境中经常会遇到很多异常,报错信息,需要查看日志信息排查错误。现在的系统大多比较复杂,即使是一个服务背后也是一个集群的机器在运行,如果逐台机器去查看日志显然是很费力的,也不现实。如果能把日志全部收集到一个平台,然后像百度,谷歌一样通过关键字搜索出相关的日志,岂不快哉。于是就有了集中式日志系统

        需要集中化的日志管理,所有服务器上的日志收集汇总。所以常见解决思路是建立集中式日志收集系统,将所有节点上的日志统一收集,管理,访问。一般现在的应用服务系统工程、大型系统都是一个分布式部署的架构。不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键信息,定位到具体的服务器和服务模块。构建一套集中式日志系统,可以提高定位问题的效率。

集中式日志系统,包含几个主要特点

  • 收集-能够采集多种来源的日志数据               ---logstash、fluent bit
  • 传输-能够稳定的把日志数据传输到中央系统 ----MQ(rabbitmq/kafka)
  • 存储-如何存储日志数据                   --ElasticSearch/Redis/Kafka等
  • 分析-可以支持 UI 分析                     -- grafana/kibana 等
  • 警告-能够提供错误报告,监控机制 -- Prometheus的监视系统 - 简书

日志采集的可行性方案

        可采用日志采集工具使用FileBeat,传输工具使用Kafka,数据整理工具使用LogStash集群,数据存储工具使用ES。当然这个系统是可以简化的,比如说简化为Filebeat+ElasticSearch,FileBeat+LogStash+ElasticSearch,在不考虑数据Filter和数据处理能力的情况下,这两种方案都可以。增加了如Kafka、Rabbitmq、Redis等第三方存储的目的,主要是为了保证数据处理效率能力和系统容错性。比如增加利用Kafka存储,再投递到LogStash,即便LogStash不可用,也不会导致消息的丢失问题。

        FileBeat采集数据之后传输给Kafka消息队列,然后LogStash采集消息队列中的数据,作过滤处理,最后将数据传输给ES。FileBeat采集数据时就是Json化的,这个日志采集工具相当轻量级,对系统资源的消耗很少。而LogStash的优点则是有丰富的Filter插件,用于对数据作粗处理。Kafka和ES的优点就不用说了。为了保证系统稳定性,这里所有的组件都使用集群形式。

系统架构图示例

filebeat推送数据到redis filebeat rabbitmq_kubernetes

Filebeat 模块

FileBeat,它是一个轻量级的日志收集处理工具(Agent),Filebeat占用资源少,适合于在各个服务器上搜集日志后传输给Logstash。

Filebeat隶属于Beats。目前Beats包含四种工具:

  1. Packetbeat(搜集网络流量数据)
  2. Topbeat(搜集系统、进程和文件系统级别的 CPU 和内存使用情况等数据)
  3. Filebeat(搜集文件数据)
  4. Winlogbeat(搜集 Windows 事件日志数据)

组件组成:prospectors & harvesters

Filebeat由两个主要组件组成:prospectors 和 harvesters。这两个组件协同工作将文件变动发送到指定的输出中。

filebeat推送数据到redis filebeat rabbitmq_数据_02

Harvester(收割机)

        Harvester(收割机):负责读取单个文件内容。每个文件会启动一个Harvester,每个Harvester会逐行读取各个文件,并将文件内容发送到制定输出中。Harvester负责打开和关闭文件,意味在Harvester运行的时候,文件描述符处于打开状态,如果文件在收集中被重命名或者被删除,Filebeat会继续读取此文件。所以在Harvester关闭之前,磁盘不会被释放。

        默认情况filebeat会保持文件打开的状态,直到达到close_inactive(如果此选项开启,filebeat会在指定时间内将不再更新的文件句柄关闭,时间从harvester读取最后一行的时间开始计时。若文件句柄被关闭后,文件发生变化,则会启动一个新的harvester。关闭文件句柄的时间不取决于文件的修改时间,若此参数配置不当,则可能发生日志不实时的情况,由scan_frequency参数决定,默认10s。Harvester使用内部时间戳来记录文件最后被收集的时间。例如:设置5m,则在Harvester读取文件的最后一行之后,开始倒计时5分钟,若5分钟内文件无变化,则关闭文件句柄。默认5m)。 

Prospector(勘测者)负责管理Harvester并找到所有读取源。

示例配置如:

filebeat.prospectors:
- input_type: log
  paths:
    - /apps/logs/*/info.log

        Prospector会找到/apps/logs/*目录下的所有info.log文件,并为每个文件启动一个Harvester。Prospector会检查每个文件,看Harvester是否已经启动,是否需要启动,或者文件是否可以忽略。若Harvester关闭,只有在文件大小发生变化的时候Prospector才会执行检查。只能检测本地的文件。

Filebeat如何记录文件状态

        将文件状态记录在文件中(默认在/var/lib/filebeat/registry)。此状态可以记住Harvester收集文件的偏移量。若连接不上输出设备,如ES等,filebeat会记录发送前的最后一行,并再可以连接的时候继续发送。Filebeat在运行的时候,Prospector状态会被记录在内存中。Filebeat重启的时候,利用registry记录的状态来进行重建,用来还原到重启之前的状态。每个Prospector会为每个找到的文件记录一个状态,对于每个文件,Filebeat存储唯一标识符以检测文件是否先前被收集。

Filebeat如何保证事件至少被输出一次

        Filebeat之所以能保证事件至少被传递到配置的输出一次,没有数据丢失,是因为filebeat将每个事件的传递状态保存在文件中。在未得到输出方确认时,filebeat会尝试一直发送,直到得到回应。若filebeat在传输过程中被关闭,则不会再关闭之前确认所有时事件。任何在filebeat关闭之前为确认的时间,都会在filebeat重启之后重新发送。这可确保至少发送一次,但有可能会重复。可通过设置shutdown_timeout 参数来设置关闭之前的等待事件回应的时间(默认禁用)。

Logstash 模块

logstash 简介

Logstash事件处理有三个阶段:inputs → filters → outputs。主要使用场景作为一个接收,处理,转发日志的工具中间层。支持如系统日志、webserver日志、错误日志、应用日志等各种自定义日志类型,总之包括所有可以抛出来的日志类型。

filebeat推送数据到redis filebeat rabbitmq_数据_03

Input 部分

用于输入数据到logstash。

一些常用的输入为:
file:从文件系统的文件中读取,类似于tial -f命令
syslog:在514端口上监听系统日志消息,并根据RFC3164标准进行解析
redis:从redis service中读取
beats:从filebeat中读取

Filters 部分

用于数据中间处理部分,对数据进行过滤等操作。

一些常用的过滤器为:
grok:解析任意文本数据,Grok 是 Logstash 最重要的插件。它的主要作用就是将文本格式的字符串,转换成为具体的结构化的数据,配合正则表达式使用。内置120多个解析语法。
官方提供的grok表达式官网地址如下:logstash-patterns-core/patterns at main · logstash-plugins/logstash-patterns-core · GitHub grok在线调试:Grok Debugger mutate:对字段进行转换。例如对字段进行删除、替换、修改、重命名等。
drop:丢弃一部分events不进行处理。
clone:拷贝 event,这个过程中也可以添加或移除字段。
geoip:添加地理信息(为前台kibana图形化展示使用)

Outputs 部分

outputs是logstash处理管道的最末端组件,用于输出到第三方连接组件等。

一个event可以在处理过程中经过多重输出,但是一旦所有的outputs都执行结束,这个event也就完成生命周期。
一些常见的outputs为:
elasticsearch:可以高效的保存数据,并且能够方便和简单的进行查询。
file:将event数据保存到文件中。
graphite:将event数据发送到图形化组件中,一个很流行的开源存储图形化展示的组件。

Codecs 部分

codecs 是基于数据流的过滤器,它可以作为input,output的一部分配置。Codecs可以帮助你轻松的分割发送过来已经被序列化的数据。

一些常见的codecs:
json:使用json格式对数据进行编码/解码。
multiline:将汇多个事件中数据汇总为一个单一的行。比如:java异常信息和堆栈信息。

Elasticsearch 模块

Elasticsearch是个开源分布式搜索引擎,提供搜集、分析、存储数据三大功能。它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。

Kibana 模块

Kibana 也是一个开源和免费的工具,Kibana可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助汇总、分析和搜索重要数据日志。