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: http://localhost:9200