【深入理解SpringCloud微服务】日志收集相关解决方案介绍与对比
日志收集相关解决方案简单介绍
目前市面上日志收集的解决方案常见的有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主要包含三⼤模块:
- Inputs:数据的输入
- Filters:过滤器,负责对输入的数据进行格式化处理
- 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拥有强大的预处理能力,可以把非结构化的日志数据解析成统一结构的日志数据,这样更方便查询。
更多推荐



所有评论(0)