《Learning ELK Stack》1 ELK技术栈介绍
1 ELK
技术栈介绍
日志分析的必要性
- 日志可以为我们提供关于系统行为的必要信息。然而,每个不同的服务,或者同一个系统中不同的组件中,日志的内容和格式都可能是不同的
- 正因为日志的内容是多样化的,它们的用处才能体现出来,例如,日志可以用来排查故障、执行简单的状态检查或者生成报表,而
Web
服务器日志则可以用来分析跨多个产品之间的流量模式。通过电子商务网站的日志可以分析出某个特定位置发出的包裹是否被频繁地退回,还能分析出可能的原因是什么 - 下面是一些使用日志分析的常见用例
- 问题调试
- 性能分析
- 安全分析
- 预测分析
- 物联网(
IoT
)日志
问题调试
- 在应用程序中开启日志最常见的理解之一。调试日志最简单和最频繁的用法是查找特定的错误消息或者发生的事件
- 一旦
bug
或者问题被定位,日志分析解决方案可以帮助捕获应用的信息,并且提供问题发生时的日志快照给开发团队用于后续的深入分析
性能分析
- 日志分析有助于优化或者调试系统的性能往往是在了解系统中如何使用资源。日志可以帮助分析系统中单个资源的使用情况、应用程序中的多线程行为,以及潜在的死锁条件等
例如,可以通过Web服务器日志中的响应时间和HTTP响应代码来了解每个服务的情况等
安全分析
- 对任何组织来说,日志都可以在应用安全的管理中起到关键的作用,特别有助于检测安全漏洞、应用程序滥用、恶意攻击等
预测分析
- 近年来的研究热点之一。日志和事件数据可用于非常准确的预测分析。预测分析模型有助于识别潜在客户、规划资源、管理和优化库存、提升工作负载和资源调度的效率。它有助于指导营销策略、用户人群定向、广告投放策略等
物联网日志
- 当涉及到物联网设备时,对系统进行监测和管理,以保持停机时间最短,并快速解决任何重大
bug
问题来说,日志是非常关键的
日志分析的挑战
- 目前的日志分析过程主要是检查在多个服务器上的日志,这些日志是应用程序中不同的组件和系统所记录的。分析日志是一个既费时又烦琐的工作
- 不一致的日志格式
- 离散的日志
- 专业知识的需求
不一致的日志格式
- 每一个应用或者设备都有自己记录日志的格式,每种格式都需要各自的专家才能解读。并且在不同格式的日志之间进行搜索也是非常困难的
离散的日志
- 应用程序中,日志往往分布在不同的服务器和不同的组件中。多个组件在多个位置记录日志,增加了日志分析的复杂性
ELK
技术栈
ELK
平台是一个完整的日志分析解决方案,ELK
使用了开源技术栈让Elasticsearch
用于深度搜索和数据分析;Logstash
用于日志集中管理,包括从多台服务器上传输和转发日志,并对日志进行丰富和解析;最后是Kibana
,提供了强大而美观的数据可视化。ELK
技术栈目前主要由Elastic
公司维护和支持
Elasticsearch
- 是一个基于
Apache Lucene
的分布式开源搜索引擎,使用Apache2.0
开源协议发布(意味着可以免费下载、使用或者修改)。它在Lucene
的实时搜索之外提供了可扩展性、可靠性和多租户功能。Elasticsearch
的功能可以通过基于JSON
的RESTfulAPI
来使用 - 很多大公司都使用了
Elasticsearch
,包括Github
、SoundCloud
、FourSquare
、Netflix
,以及很多其他著名的公司。下面例举一些典型的用户案例
Wikipedia:使用es提供文本本文搜索,以及一些产品功能,如一边输入一边搜索和搜索建议
Github:使用es对超过800万行代码库和跨平台事件进行索引,以便提供实时搜索的功能
es
的关键特性包括
- 它是一个开源的分布式、可扩展和高可用的实时文档存储
- 提供了实时搜索和分析的能力
- 提供了复杂的
RESTful API
,包括查找和其他各种功能,如批量搜索、地理位置搜索、自动完成、上下文搜索建议和结果片段等 - 能够很简单地进行水平扩展,也很容易和其他云基础设施如
AWS
等集成
Logstash
- 是一个数据管道,主要用来收集、解析和分析大量结构化和非结构化的数据以及各种系统产生的事件。
Logstash
提供了输入插件来支持不同的数据源和平台,设计用来高效地处理日志、事件和非结构化数据源,然后通过输出插件如文件、标准输出(如输出到运行Logstash
的控制台)或者es
等输出结果数据 Logstash
关键特性
- 集中化的数据处理:
Logstash
通过数据管道,可以集中化地处理数据。使用不同的输入和输出插件,可以将各种不同的输入源转换成一种单一的能用格式 - 支持自定义日志格式:不同应用生成的日志通常有不同的特殊格式。
Logstash
可以分析和处理大规模的自定义格式的日志。Logstash
自带了很多开箱即用的过滤插件,也支持用户编写自定义的插件 - 插件开发:可以开发和发布自定义插件。实际上现在已经有很多可用的自定义插件
Kibana
- 是一个基于
Apache2.0
开源协议的开源数据可视化平台。它可以对存储于es
的索引中的各种结构化和非结构化的数据进行可视化呈现 Kibana
关键特性如下
- 它为商业智能提供了一个灵活的分析和可视化平台
- 它提供了实时分析、汇总、图表和调试的能力
- 提供了一个直观且用户友好的界面,并且是高度可定制的,可以根据需要对图表进行拖放和对齐
- 可以管理多个仪表盘,并且能够保存。仪表盘可以在多个系统中分享和嵌入
- 可以分享日志搜索结果的快照,可以隔离不同的问题处理过程
ELK
数据管道
- 一个典型的
ELK
技术栈的数据管道看起来如下图所示
- 在典型的
ELK
技术栈的数据管道中,多个应用服务器上的日志通过Logstash
采集器传输到一个集中化的索引器中,索引器将处理后的数据结果输出到es
集群,然后Kibana
通过查询es
集群中的日志数据创建仪表盘,做可视化展现
Elasticsearch
es
配置文件一般放在安装目录下的config
目录中。有两个文件,分别是elasticsearch.yml
和logging.yml
。前者配置es
不同模块的属性,如网络地址、路径等,后者则用来配置自身的日志记录选项
路径
- 指定数据和日志文件的路径
path:
logs: /var/log/elasticserach
data: /var/data/elasticsearch
集群名
- 指定生产集群名字,集群将根据这个名字自动发现和加入节点
cluster:
name: <name of your cluster>
节点名
- 指定每个节点的默认名字
node:
name: <name of your node>
Logstash
bin/logstash -e 'input { stdin{} } output { stdout{} }'
$ logstash -e 'input { stdin{} } output { stdout{} }'
Sending Logstash logs to /usr/local/Cellar/logstash/6.4.2/libexec/logs which is now configured via log4j2.properties
[2020-06-19T01:09:49,205][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-06-19T01:09:49,726][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.4.2"}
[2020-06-19T01:09:51,358][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-06-19T01:09:51,463][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x6e7affd run>"}
The stdin plugin is now waiting for input:
[2020-06-19T01:09:51,512][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-06-19T01:09:51,918][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
abc
{
"@version" => "1",
"@timestamp" => 2020-06-18T17:09:58.696Z,
"host" => "YEEDOMLIU-MB12",
"message" => "abc"
}
bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
$ logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug } }'
Sending Logstash logs to /usr/local/Cellar/logstash/6.4.2/libexec/logs which is now configured via log4j2.properties
[2020-06-19T01:11:09,563][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2020-06-19T01:11:10,091][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"6.4.2"}
[2020-06-19T01:11:11,905][INFO ][logstash.pipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>12, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50}
[2020-06-19T01:11:12,060][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#<Thread:0x3b0f0f77 run>"}
The stdin plugin is now waiting for input:
[2020-06-19T01:11:12,101][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2020-06-19T01:11:12,334][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello baby
{
"message" => "hello baby",
"@version" => "1",
"host" => "YEEDOMLIU-MB12",
"@timestamp" => 2020-06-18T17:17:13.873Z
}
- 上面输出信息是
Logstash
最常见的形式
Message
:包含完整的输入信息或者事件@timestamp
:包含事件被索引的时间。如果使用了日期过滤插件,也可能是message
中的某个指定事件时间的字段Host
:通常来说表示事件的主机
Logstash
的文件输入插件
例如读取Apache日志文件作为输入,然后输出到标准输出
input {
file {
type => "apache"
path => "/user/packpub/intro-to-elk/elk.log"
}
output {
stdout { codec => rubydebug }
}
}
Logstash
的Elasticsearch
输出插件
bin/logstash -e 'input { stdin{} } output { elasticsearch{ host = localhost } }'
配置Logstash
Logstash
的配置文件使用的是JSON
格式,可通过-flag
参数指定配置文件的路径,甚至可以是一个包含多个不同类型如输入、过滤和输出插件的配置文件的目录
bin/logstash -f ../conf/logstash.conf
如果希望在运行前测试配置文件的语法错误,可以执行如下命令:
bin/logstash -configtest ../conf/logstash.conf
上述命令只检查配置文件,而不是真正地运行logstash
Logstash
插件
- 常用插件有三类
- 输入插件
- 过滤插件
- 输出插件
输入插件
File
:从日志文件中读取事件流Redis
:从redis
实例中读取事件流Stdin
:从标准输入读取事件流Syslog
:通过网络从syslog
消息中读取事件流Ganglia
:通过udp
网络读取ganglia
包中的事件流Lumberjack
:使用lumberjack
协议读取事件流Eventlog
:从Windows
事件日志中读取事件流S3
:从亚马逊s3
存储桶的文件中读取事件流Elasticsearch
:从elasticsearch
集群的搜索结果中读取事件流
过滤插件
Date
:从流入的事件中解析日期字段作为Logstash
的timestamp
字段Drop
:从流入的事件中抛弃符合特定过滤条件的所有数据Grok
:非常强大的过滤插件,可以将非结构化的日志事件解析成结构化的数据multiline
:将同一个输入源中的多行数据解析为一条日志事件dns
:将任意指定的字段解析为IP
地址mutate
:可以重命名、删除、修改或者替换事件中的任意字段geoip
:根据Maxmind IP
数据库,将IP
字段解析出地理位置相关的信息
输出插件
file
:将事件写入到磁盘上的文件中e-mail
:在接收到输出时,根据某些特定的条件发送邮件elasticsearch
:将输出数据保存到es
集群中stdout
:将事件写入标准输出redis
:将事件写入到redis
的队列作为代理mongodb
:将输出信息写入mongodb
kafka
:将事件写入kafka
的主题
Kibana
- 配置文件在
cofnig
目录下
config/kibana.yml
port: 5601
host: “localhost”
elasticsearch_url: localhost:9200
界面
- 探索
- 可视化
- 仪表盘
- 设置
探索
- 交互式地查看符合所选的索引模式的数据。可提交搜索查询、过滤搜索结果并查看文档数据
可视化
- 基于不同的数据源,比如新的交换式搜索、已保存搜索,或者其他已经存在的可视化部件,来创建新的可视化部件
仪表盘
- 保存在不同组的可视化部件的集合
本作品采用《CC 协议》,转载必须注明作者和本文链接
大佬写的真好