目前市面上日志收集的解决方案常见的有ELKB、EFK,Skywalking也具有日志收集的功能,还有大数据技术栈中的Flume也可以用于做为日志采集的工具。

ELKB

ELKB是最常见的日志收集方案,ELKB是四个组件的缩写,分别是ElasticSearch、Logstash、Kibana、filebeat四个组件。

在这里插入图片描述

首先通过filebeat收集各服务的日志,输出到Logstash,Logstash对filebeat收集到的日志信息进行过滤和解析等预处理,然后将处理过后的日志信息存入ES,然后我们就可以通过Kibana查询到存储在ES上的日志信息。

ElasticSearch

在这里插入图片描述

ElasticSearch是一个分布式搜索引擎,利用倒排索引实现近实时搜索,底层以Json的格式存储数据。

由于ElasticSearch底层以Json格式存储数据,Logstash正好支持将非结构化的数据转换程结构化的Json格式数据,因此Logstash搭配ES就可以做到将非结构化的数据转换成Json格式之后存入ES中。

在这里插入图片描述

Logstash

Logstash是一个分布式日志收集框架,在ELK里面,Logstash相当于是一个日志收集传送和转换的管道(Pipeline)。

在这里插入图片描述

Logstash主要包含三⼤模块:

  1. Inputs:数据的输入
  2. Filters:过滤器,负责对输入的数据进行格式化处理
  3. Outputs:数据的输出

以上三模块,在Logstash的配置文件中都有体现:

input {
	beats { // 从filebeat收集日志数据
		port => 5044 // 通过5044端口接收filebeat的数据
	}
}
filter {
	grok {
		match => { "message" => "%{COMBINEDAPACHELOG}"} // 将日志数据进行格式化处理,转换程json格式
	}
}

output {
	elasticsearch { // 输出到es
		hosts => ["http://localhost:9200"] // es的地址
		index => nginx-log // 存储到nginx-log这个索引
		user => "elastic" // es账号
		password => "123456" // es密码
	}
}

配置好Logstash的配置文件后,启动时指定该文件即可。

filebeat

Beats是一个由Elastic公司开发的一系列轻量级数据 shippers(数据发送器)的集合,它们设计用于从各种来源收集数据,并将其发送到中央存储或分析系统,通常与Elasticsearch和Kibana一起作为Elastic Stack(以前称为ELK Stack)的一部分使用。

在这里插入图片描述

Filebeat是Beats家族中的一员,filebeat是一个轻量级日志收集器,而Logstash则比较重,因此要先通过filebeat进行日志收集,然后输送给Logstash进行后续处理。

在这里插入图片描述

filebeat下载解压好后,我们修改filebeat.yml配置文件:

   filebeat.inputs:
   - type: log
     enabled: true
     paths:
       - /var/log/nginx/access.log # 替换为你的Nginx访问日志路径
       - /var/log/nginx/error.log  # 替换为你的Nginx错误日志路径

   output.logstash:
     hosts: ["logstash_server:5044"] # 替换为Logstash服务器的IP和监听端口

然后启动filebeat时指定filebeat.yml配置文件即可。

Kibana

Kibana是一个开源的数据可视化和分析工具,主要用于对Elasticsearch中的数据进行探索、监控和仪表板创建。

在这里插入图片描述

kibana在ELK中的作用主要是一个仪表盘,用于在Kibana的界面上查询ES中的日志数据。

在这里插入图片描述

EFK

EFK中的E还是ElasticSearch,K还是Kibana,唯一的不同就是F,F指的是fluentd。

在这里插入图片描述

Fluentd是一个开源的日志收集和传输工具,用于进行日志数据的收集、处理和传输,收集来自各服务或系统的日志数据,将其进行结构化处理之后,存储到对应的目标存储系统中。

在这里插入图片描述

我们通过fluentd收集日志信息,然后传输到kafa中,然后通过一个日志解析服务监听kafka中的日志消息,然后对监听到的日志消息进行解析,结构化后存储到ES中。

要配置Fluentd收集应用程序日志并发送到Kafka,我们需要创建一个Fluentd配置文件,定义输入源(source)为我们应用程序输出的日志,输出目标(match)输出到kafka。

Fluentd还支持通过在配置文件中定义过滤器 (filter),对收集到的数据经过过滤插件进行处理,可以进行数据格式转换、筛选、聚合等操作。

EFK 与 ELK对比

fluentd相较于Logstash来说更加的轻量级,内存占用和CPU使用通常较低因此fluentd无需像Logstash那样还要搭配一个filebeat;而Logstash相对资源消耗较高,因此通常要搭配一个filebeat做收集,Logstash再做过滤处理。

但是Logstash的数据处理能力相较于filebeat来说更强大。

EFK更倾向于轻量级和云原生环境,而ELK则更适合需要强大日志处理能力的场景。

Skywalking

Skywalking可以配置将其接收到的数据存储到ES中,这样我们可以通过ES查询日志信息。

在这里插入图片描述

Skywalking通过agent收集日志信息,然后发送到Skywalking的OAP服务器,然后OAP服务器将其存入ES中。

在这里插入图片描述

日志信息存入到ES后,我们就可以通过Skywalking的UI界面查询到。

但是Skywalking是基于javaagent(Java探针)做日志采集的,这就意味着它无法收集到像Nginx这种非Java应用的日志信息。

而且Skywalking除了日志收集以外,还具备链路追踪和监控等功能,单纯用于做日志收集的话,个人觉得有点重。

Flume

Flume是大数据技术栈中的日志采集工具。

在这里插入图片描述

Flume可以从各种Web服务器上收集数据,写入到HDFS或者Kafka等其他大数据组件中。

Flume Agent由三部分组成:Source、Channel、Sink。

  • Source:负责接收数据到Flume Agent。
  • Channel:存储Source接收到的数据,是一个数据缓存区,会将数据进行持久化,待Sink成功写出后删除。
  • Sink:从Channel中读取数据并写出,写出后的数据则从Channel中删除。

数据由Source流入、存储到Channel,最后从Sink写出,都是以事件(Event)的形式进行处理的。

一般用于大数据系统中,业务系统一般不使用它来做日志收集。

Flume 与 Logstash 比较

Flume最初的设计目的是为了把数据传输到HDFS中的,而不是设计用来作为日志收集的,Flume没有像Logstash那样强大的预处理能力,它收集的日志一般用于后续其他的大数据组件对其进行分析。

而Logstash相比Flume拥有强大的预处理能力,可以把非结构化的日志数据解析成统一结构的日志数据,这样更方便查询。

更多推荐