《Learning ELK Stack》1 ELK技术栈介绍

1 ELK技术栈介绍


日志分析的必要性

  • 日志可以为我们提供关于系统行为的必要信息。然而,每个不同的服务,或者同一个系统中不同的组件中,日志的内容和格式都可能是不同的
  • 正因为日志的内容是多样化的,它们的用处才能体现出来,例如,日志可以用来排查故障、执行简单的状态检查或者生成报表,而Web服务器日志则可以用来分析跨多个产品之间的流量模式。通过电子商务网站的日志可以分析出某个特定位置发出的包裹是否被频繁地退回,还能分析出可能的原因是什么
  • 下面是一些使用日志分析的常见用例
  1. 问题调试
  2. 性能分析
  3. 安全分析
  4. 预测分析
  5. 物联网(IoT)日志

问题调试

  • 在应用程序中开启日志最常见的理解之一。调试日志最简单和最频繁的用法是查找特定的错误消息或者发生的事件
  • 一旦bug或者问题被定位,日志分析解决方案可以帮助捕获应用的信息,并且提供问题发生时的日志快照给开发团队用于后续的深入分析

性能分析

  • 日志分析有助于优化或者调试系统的性能往往是在了解系统中如何使用资源。日志可以帮助分析系统中单个资源的使用情况、应用程序中的多线程行为,以及潜在的死锁条件等

例如,可以通过Web服务器日志中的响应时间和HTTP响应代码来了解每个服务的情况等

安全分析

  • 对任何组织来说,日志都可以在应用安全的管理中起到关键的作用,特别有助于检测安全漏洞、应用程序滥用、恶意攻击等

预测分析

  • 近年来的研究热点之一。日志和事件数据可用于非常准确的预测分析。预测分析模型有助于识别潜在客户、规划资源、管理和优化库存、提升工作负载和资源调度的效率。它有助于指导营销策略、用户人群定向、广告投放策略等

物联网日志

  • 当涉及到物联网设备时,对系统进行监测和管理,以保持停机时间最短,并快速解决任何重大bug问题来说,日志是非常关键的

日志分析的挑战

  • 目前的日志分析过程主要是检查在多个服务器上的日志,这些日志是应用程序中不同的组件和系统所记录的。分析日志是一个既费时又烦琐的工作
  1. 不一致的日志格式
  2. 离散的日志
  3. 专业知识的需求

不一致的日志格式

  • 每一个应用或者设备都有自己记录日志的格式,每种格式都需要各自的专家才能解读。并且在不同格式的日志之间进行搜索也是非常困难的

离散的日志

  • 应用程序中,日志往往分布在不同的服务器和不同的组件中。多个组件在多个位置记录日志,增加了日志分析的复杂性

ELK技术栈

  • ELK平台是一个完整的日志分析解决方案,ELK使用了开源技术栈让Elasticsearch用于深度搜索和数据分析;Logstash用于日志集中管理,包括从多台服务器上传输和转发日志,并对日志进行丰富和解析;最后是Kibana,提供了强大而美观的数据可视化。ELK技术栈目前主要由Elastic公司维护和支持

Elasticsearch

  • 是一个基于Apache Lucene的分布式开源搜索引擎,使用Apache2.0开源协议发布(意味着可以免费下载、使用或者修改)。它在Lucene的实时搜索之外提供了可扩展性、可靠性和多租户功能。Elasticsearch的功能可以通过基于JSONRESTfulAPI来使用
  • 很多大公司都使用了Elasticsearch,包括GithubSoundCloudFourSquareNetflix,以及很多其他著名的公司。下面例举一些典型的用户案例

Wikipedia:使用es提供文本本文搜索,以及一些产品功能,如一边输入一边搜索和搜索建议

Github:使用es对超过800万行代码库和跨平台事件进行索引,以便提供实时搜索的功能

  • es的关键特性包括
  1. 它是一个开源的分布式、可扩展和高可用的实时文档存储
  2. 提供了实时搜索和分析的能力
  3. 提供了复杂的RESTful API,包括查找和其他各种功能,如批量搜索、地理位置搜索、自动完成、上下文搜索建议和结果片段等
  4. 能够很简单地进行水平扩展,也很容易和其他云基础设施如AWS等集成

Logstash

  • 是一个数据管道,主要用来收集、解析和分析大量结构化和非结构化的数据以及各种系统产生的事件。Logstash提供了输入插件来支持不同的数据源和平台,设计用来高效地处理日志、事件和非结构化数据源,然后通过输出插件如文件、标准输出(如输出到运行Logstash的控制台)或者es等输出结果数据
  • Logstash关键特性
  1. 集中化的数据处理:Logstash通过数据管道,可以集中化地处理数据。使用不同的输入和输出插件,可以将各种不同的输入源转换成一种单一的能用格式
  2. 支持自定义日志格式:不同应用生成的日志通常有不同的特殊格式。Logstash可以分析和处理大规模的自定义格式的日志。Logstash自带了很多开箱即用的过滤插件,也支持用户编写自定义的插件
  3. 插件开发:可以开发和发布自定义插件。实际上现在已经有很多可用的自定义插件

Kibana

  • 是一个基于Apache2.0开源协议的开源数据可视化平台。它可以对存储于es的索引中的各种结构化和非结构化的数据进行可视化呈现
  • Kibana关键特性如下
  1. 它为商业智能提供了一个灵活的分析和可视化平台
  2. 它提供了实时分析、汇总、图表和调试的能力
  3. 提供了一个直观且用户友好的界面,并且是高度可定制的,可以根据需要对图表进行拖放和对齐
  4. 可以管理多个仪表盘,并且能够保存。仪表盘可以在多个系统中分享和嵌入
  5. 可以分享日志搜索结果的快照,可以隔离不同的问题处理过程

ELK数据管道

  • 一个典型的ELK技术栈的数据管道看起来如下图所示

image-20200619005900529

  • 在典型的ELK技术栈的数据管道中,多个应用服务器上的日志通过Logstash采集器传输到一个集中化的索引器中,索引器将处理后的数据结果输出到es集群,然后Kibana通过查询es集群中的日志数据创建仪表盘,做可视化展现

Elasticsearch

  • es配置文件一般放在安装目录下的config目录中。有两个文件,分别是elasticsearch.ymllogging.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最常见的形式
  1. Message:包含完整的输入信息或者事件
  2. @timestamp:包含事件被索引的时间。如果使用了日期过滤插件,也可能是message中的某个指定事件时间的字段
  3. Host:通常来说表示事件的主机

Logstash的文件输入插件

例如读取Apache日志文件作为输入,然后输出到标准输出

input {
  file {
    type => "apache"
    path => "/user/packpub/intro-to-elk/elk.log"
  }
  output {
    stdout { codec => rubydebug }
  }
}

LogstashElasticsearch输出插件

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插件

  • 常用插件有三类
  1. 输入插件
  2. 过滤插件
  3. 输出插件

输入插件

  1. File:从日志文件中读取事件流
  2. Redis:从redis实例中读取事件流
  3. Stdin:从标准输入读取事件流
  4. Syslog:通过网络从syslog消息中读取事件流
  5. Ganglia:通过udp网络读取ganglia包中的事件流
  6. Lumberjack:使用lumberjack协议读取事件流
  7. Eventlog:从Windows事件日志中读取事件流
  8. S3:从亚马逊s3存储桶的文件中读取事件流
  9. Elasticsearch:从elasticsearch集群的搜索结果中读取事件流

过滤插件

  1. Date:从流入的事件中解析日期字段作为Logstashtimestamp字段
  2. Drop:从流入的事件中抛弃符合特定过滤条件的所有数据
  3. Grok:非常强大的过滤插件,可以将非结构化的日志事件解析成结构化的数据
  4. multiline:将同一个输入源中的多行数据解析为一条日志事件
  5. dns:将任意指定的字段解析为IP地址
  6. mutate:可以重命名、删除、修改或者替换事件中的任意字段
  7. geoip:根据Maxmind IP数据库,将IP字段解析出地理位置相关的信息

输出插件

  1. file:将事件写入到磁盘上的文件中
  2. e-mail:在接收到输出时,根据某些特定的条件发送邮件
  3. elasticsearch:将输出数据保存到es集群中
  4. stdout:将事件写入标准输出
  5. redis:将事件写入到redis的队列作为代理
  6. mongodb:将输出信息写入mongodb
  7. kafka:将事件写入kafka的主题

Kibana

  • 配置文件在cofnig目录下

config/kibana.yml

port: 5601

host: “localhost”

elasticsearch_url: localhost:9200

界面

  1. 探索
  2. 可视化
  3. 仪表盘
  4. 设置

探索

  • 交互式地查看符合所选的索引模式的数据。可提交搜索查询、过滤搜索结果并查看文档数据

image-20200619092701636

可视化

  • 基于不同的数据源,比如新的交换式搜索、已保存搜索,或者其他已经存在的可视化部件,来创建新的可视化部件

仪表盘

  • 保存在不同组的可视化部件的集合
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 1

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!