ELK是什么?
Elasticsearch Logstash Kibana 原来称为 ELK Stack ,现在称为Elastic Stack,加入了 beats 来优化Logstash。
来自官网的介绍:
Elasticsearch:无论您正在查找来自特定 IP 地址的活动,还是正在分析交易请求数量为何突然飙升,或者正在方圆一公里内搜寻美食店,我们尝试解决的这些问题归根结底都是搜索。通过 Elasticsearch,您可以轻松地存储、搜索和分析大量数据。
Kibana:在 Kibana 中通过炫酷的可视化来探索您的数据,从华夫饼图到热点图,再到时序数据分析,应有尽有。针对多样化数据源使用预配置仪表板,创建实时演示文稿以突出显示 KPI,并使用单一 UI 来管理您的部署。
所有工作最开始都是要将数据导入到 Elasticsearch 中。您可通过各种便捷方式将全部数据集中到一起,既可使用 Beats 采集来自应用和基础设施的指标,也可使用 Logstash 从第三方数据存储库中提取数据,方法十分多样。解析、充实、匿名化,还有更多。
ELK的主要用途:
大型分布式系统的日志集中分析。
一个完整的集中式日志系统,需要包含以下几个主要特点:
- 收集-能够采集多种来源的日志数据
- 传输-能够稳定的把日志数据传输到中央系统
- 转换— 能够对收集的日志数据进行转换处理
- 存储-如何存储日志数据
- 分析-可以支持 UI 分析
- 告警-能够提供错误报告,监控机制
ELK提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。目前主流的一种日志系统。
ELK架构
老的架构:
用beats来进行采集的架构:
Beats
Beats 是一个免费且开放的平台,集合了多种单一用途数据采集器。它们从成百上千或成千上万台机器和系统向 Logstash 或 Elasticsearch 发送数据。
Beats 的已有种类
Filebeat:轻量型日志采集器
Winlogbeat:轻量型Windows事件日志采集器
Metricbeat:轻量型指标采集器
Heartbeat:轻量型运行时间监控采集器
Packketbeat:轻量型网络数据采集器
Auditbeat:轻量型审计日志采集器
FileBeat
日志文件采集器,Filebeat监视日志目录或特定日志文件,然后将它们转发到Elasticsearch或Logstash进行索引。
工作原理
Prospector 勘测者:负责管理Harvester并找到所有读取源。
Harvestor 收割机:负责读取单个文件内容,发送到输出
启动Filebeat时,它将启动一个或多个勘测者,这些勘测者会查看为日志文件指定的本地路径。 对于勘测者找到的每个日志文件,Filebeat都会启动一个收割机。 每个收割机都读取一个日志文件以获取新内容,并将新日志数据发送到libbeat,libbeat会汇总事件并将汇总数据发送到为Filebeat配置的输出。
下载
本次讲解的版本6.2.4
下载地址:https://www.elastic.co/downloads/past-releases/filebeat-6-2-4
最新版下载地址:https://www.elastic.co/cn/downloads/beats/filebeat
使用步骤
配置:在 filebeat.yml 中配置从哪些文件读取数据,送到哪里去
1、配置勘测采集源
filebeat.prospectors:- type: log enabled: true paths: - /var/log/*.log #- c:programdataelasticsearchlogs*
2、配置输出送到es中去
output.elasticsearch: hosts: ["192.168.1.42:9200"]
若ES有认证,配置用户密码
output.elasticsearch: hosts: ["myEShost:9200"] username: "elastic" password: "elastic"
3、启动filebeat
linux rpm : sudo service filebeat start
windows:
安装了服务:PS C:Program FilesFilebeat> Start-Service filebeat
如果没有安装服务,在安装目录直接运行启动程序 filebeat
sudo ./filebeat
可加启动选项:-e 输入日志到标准输出, -c 指定配置文件
如:sudo ./filebeat -e -c filebeat.yml
4、配置索引模板
默认情况下,如果输出是elasticsearch,filebeat自动创建推荐的索引模板(定义在fields.yml中)。
如果你想使用自定义的模板,可在 filebeat.yml中配置指定你的模板
setup.template.name: "your_template_name"setup.template.fields: "path/to/fields.yml"
覆盖已存在的模板
setup.template.overwrite: true
设置默认的模板失效
setup.template.enabled: false
改变索引的名字。默认为filebeat-6.2.4-yyyy.MM.dd
#名字中应包含版本和日期部分output.elasticsearch.index: "customname-%{[beat.version]}-%{+yyyy.MM.dd}"setup.template.name: "customname"setup.template.pattern: "customname-*"#使用kibana的dashboard时需要#setup.dashboards.index: "customname-*"
当输出是logstash时,需手动执行命令来向es创建模板
filebeat setup --template -E output.logstash.enabled=false -E 'output.elasticsearch.hosts=["localhost:9200"]'
重启filebeat后才会创建
5、配置使用kibana的dashboards。在 filebeat.yml 中:
setup.dashboards.enabled: truesetup.kibana: host: "mykibanahost:5601"
有认证的配置
setup.kibana: host: "mykibanahost:5601" username: "elastic" password: "elastic"
重启filebeat,在kibana中浏览 Discover Visualize DashBoard
配置输出到logstash
output.logstash: hosts: ["127.0.0.1:5044"]
Filebeat modules配置
Filebeat modules:提供了一种快速处理常见日志格式的快速方法。 它们包含默认配置,Elasticsearch接收节点管道定义以及Kibana仪表板,以帮助实施和部署日志监视解决方案。
Filebeat提供了几种不同的方式来启用模块:
- 在modules.d目录中启用模块配置
modules.d目录包含Filebeat中所有可用模块的默认配置。 可以通过运行modules enable或modules disable命令来启用或禁用modules.d下的特定模块配置。
例如,要在modules.d目录中启用apache2和mysql配置,使用:
./filebeat modules enable apache2 mysql
运行Filebeat时,它将加载modules.d目录中指定的相应模块配置(例如,modules.d / apache2.yml和modules.d / mysql.yml)。
查看已启用和已禁用模块的列表:
./filebeat modules list
- 运行Filebeat时启用模块
要在命令行运行Filebeat时启用特定模块,可以使用--modules标志。以下示例显示了如何启用和运行nginx,mysql和系统模块。
./filebeat -e --modules nginx,mysql,system
- 在filebeat.yml文件中启用模块配置
filebeat.modules:- module: nginx- module: mysql- module: system
使用modules.d前,需要安装对应的插件,例如:
sudo bin/elasticsearch-plugin install ingest-geoipsudo bin/elasticsearch-plugin install ingest-user-agent
Filebeat prospectors配置
Filebeat使用勘测者来查找和处理文件。 要配置Filebeat,在filebeat.yml配置文件的filebeat.prospectors部分中指定勘测者列表。
filebeat.prospectors:- type: log paths: - /var/log/apache/httpd-*.log- type: log paths: - /var/log/messages - /var/log/*.log
可选配置:
可选配置比较多,可以参看:
https://www.elastic.co/guide/en/beats/filebeat/6.2/configuration-filebeat-options.html#_configuration_options
以下介绍几个常见配置:
type:可选选项
log:读取日志文件的每一行(默认)。
stdin:读入标准。
redis:从redis读取慢速日志条目。
udp:通过UDP读取事件。 另请参见max_message_size。
docker:从Docker读取日志。
paths:
Filebeat为在指定路径下找到的每个文件启动收割机。 可以每行指定一个路径。 每行以破折号(-)开头。
encoding:
用于读取包含国际字符的文件的文件编码。
以下是来自W3C建议的一些示例编码:
plain,latin1,utf-8,utf-16be-bom,utf-16be,utf-16le,big5,gb18030,gbk,hz-gb-2312,
euc-kr,euc-jp,iso-2022-jp,shift-jis等
exclude_lines:
正则表达式列表,以匹配要Filebeat排除的行。 Filebeat会删除列表中与正则表达式匹配的所有行。 默认情况下,不删除任何行。 空行将被忽略。
filebeat.prospectors:- paths: - /var/log/myapp/*.log exclude_lines: ['^DBG']
include_lines:
正则表达式列表,以匹配要Filebeat包括的行。 Filebeat仅导出与列表中的正则表达式匹配的行。 默认情况下,所有行均被导出。 空行将被忽略。
filebeat.prospectors:- paths: - /var/log/myapp/*.log include_lines: ['^ERR', '^WARN']
tags:
Beat包含在每个已发布事件的标签字段中的标签列表。 使用标记,可以轻松地在Kibana中选择特定事件或在Logstash中应用条件过滤。
filebeat.prospectors:- paths: ["/var/log/app/*.json"] tags: ["json"]
fields:
可以指定可选字段以将其他信息添加到输出中。 例如,可以添加可用于过滤日志数据的字段。 字段可以是标量值,数组,字典或它们的任何嵌套组合。
filebeat.prospectors:- paths: ["/var/log/app/*.log"] fields: app_id: query_engine_12
prospectors 的processors配置:
有时候我们需要用Filebeat导出数据的一部分,或者可能需要增强导出的数据(例如,通过添加元数据)。 Filebeat提供了两个选项来筛选和增强导出的数据。
1. 配置每个输入以包括或排除特定的行或文件。 这需要为每个输入指定不同的过滤条件。使用配置文件的filebeat.inputs(prospectors)块下的include_lines,exclude_lines和exclude_files选项。 这种方法的缺点是,需要为所需的每个过滤条件实现一个配置选项。
2. processors,以对Filebeat导出的所有数据进行全局处理。
每个processors都接收一个事件,对该事件应用已定义的操作,然后返回该事件。 如果定义处理器列表,则将按照在Filebeat配置文件中定义的顺序执行它们。
event -> processor 1 -> event1 -> processor 2 -> event2 ...
以下配置删除所有日志中的DEBUG消息。
processors: - drop_event: when: regexp: message: "^DBG:"
删除日志文件的包含某个条件全部信息
processors: - drop_event: when: contains: source: "test"
Filebeat multiline配置
Filebeat收集的文件可能包含跨越多行文本的消息。 例如,多行消息在包含Java堆栈跟踪的文件中很常见。 为了正确处理这些多行事件,需要在filebeat.yml文件中配置multiline设置,以指定哪些行是单个事件的一部分。
在filebeat.yml配置文件的filebeat.prospectors部分中指定以下选项,以控制Filebeat如何处理跨越多行的消息。
下面的示例显示如何配置Filebeat以处理多行消息,其中消息的第一行以方括号([)开头。
multiline.pattern: '^['multiline.negate: truemultiline.match: after
Filebeat接受所有不以[开头的行,并将它们与上一行合并。如以下日志信息:
[beat-logstash-some-name-832-2015.11.28] IndexNotFoundException[no such index] at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver$WildcardExpressionResolver.resolve(IndexNameExpressionResolver.java:566) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:133) at org.elasticsearch.cluster.metadata.IndexNameExpressionResolver.concreteIndices(IndexNameExpressionResolver.java:77) at org.elasticsearch.action.admin.indices.delete.TransportDeleteIndexAction.checkBlock(TransportDeleteIndexAction.java:75)
更多的input配置请参看:
https://www.elastic.co/guide/en/beats/filebeat/current/filebeat-input-log.html
Filebeat output配置
输出到Elasticsearch:
当输出指定Elasticsearch时,Filebeat将使用Elasticsearch HTTP API将事务直接发送到Elasticsearch。
output.elasticsearch: hosts: ["https://localhost:9200"] index: "filebeat-%{[agent.version]}-%{+yyyy.MM.dd}" ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] ssl.certificate: "/etc/pki/client/cert.pem" ssl.key: "/etc/pki/client/cert.key"
要启用SSL,只需将https添加到主机下定义的所有URL。
output.elasticsearch: hosts: ["https://localhost:9200"] username: "filebeat_internal" password: "YOUR_PASSWORD"
要使用API密钥连接到Elasticsearch
output.elasticsearch: hosts: ["https://localhost:9200"] api_key: "VuaCfGcBCdbkQm-e5aOx:ui2lp2axTNmsyakw9tvNnw"
如果Elasticsearch例程由IP:PORT定义,则将协议:https添加到yaml文件。
output.elasticsearch: hosts: ["localhost"] protocol: "https" username: "filebeat_internal" password: "YOUR_PASSWORD"
设置输出指定的索引
output.elasticsearch: hosts: ["http://localhost:9200"] indices: - index: "warning-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: message: "WARN" - index: "error-%{[agent.version]}-%{+yyyy.MM.dd}" when.contains: message: "ERR"
输出到管道
output.elasticsearch: hosts: ["http://localhost:9200"] pipeline: my_pipeline_id
更多的配置参看:https://www.elastic.co/guide/en/beats/filebeat/current/elasticsearch-output.html#elasticsearch-output
输出到Logstash:
output.logstash: hosts: ["127.0.0.1:5044"]
hosts选项指定Logstash服务器以,5044为侦听传入Beats连接的端口
用到自定义模板时,需要手动创建索引模板
发送到Logstash的每个事件都包含以下元数据字段,可以在Logstash中使用这些字段进行索引和过滤:
{ ... "@metadata": { "beat": "filebeat", "version": "7.8.0" }}
@metadata字段将元数据发送到Logstash
beat默认值为filebeat。 要更改此值,请在Filebeat配置文件中设置index选项。
version:Filebeat的当前版本。
可以从Logstash配置文件中访问此元数据,以根据元数据的内容动态设置值。
例如,以下Logstash配置文件告诉Logstash使用Filebeat报告的索引将事件索引到Elasticsearch:
input { beats { port => 5044 }}output { elasticsearch { hosts => ["http://localhost:9200"] index => "%{[@metadata][beat]}-%{[@metadata][version]}" }}
loadbalance:设置负载均衡
如果设置为true并配置了多个Logstash主机,则输出插件将发布的事件负载平衡到所有Logstash主机上。 如果设置为false,则输出插件将所有事件仅发送到一个主机(随机确定),如果所选主机无响应,则将切换到另一主机。 默认值为false。
更多设置参看:https://www.elastic.co/guide/en/beats/filebeat/current/logstash-output.html
Logstash
集中、转换和存储数据
Logstash 是免费且开放的服务器端数据处理管道,能够从多个来源采集数据,转换数据,然后将数据发送到您最喜欢的“存储库”中。
Logstash 能够动态地采集、转换和传输数据,不受格式或复杂度的影响。利用 Grok 从非结构化数据中派生出结构,从 IP 地址解码出地理坐标,匿名化或排除敏感字段,并简化整体处理过程。
输入
采集各种样式、大小和来源的数据
数据往往以各种各样的形式,或分散或集中地存在于很多系统中。Logstash 支持各种输入选择,可以同时从众多常用来源捕捉事件。能够以连续的流式传输方式,轻松地从您的日志、指标、Web 应用、数据存储以及各种 AWS 服务采集数据。
筛选
数据从源传输到存储库的过程中,Logstash 过滤器能够解析各个事件,识别已命名的字段以构建结构,并将它们转换成通用格式,以便进行更强大的分析和实现商业价值。
Logstash 能够动态地转换和解析数据,不受格式或复杂度的影响:
- 利用 Grok 从非结构化数据中派生出结构
- 从 IP 地址破译出地理坐标
- 将 PII 数据匿名化,完全排除敏感字段
- 简化整体处理,不受数据源、格式或架构的影响
输出
选择您的存储库,导出您的数据
尽管 Elasticsearch 是我们的首选输出方向,能够为我们的搜索和分析带来无限可能,但它并非唯一选择。
下载:
https://www.elastic.co/cn/downloads/logstash
logstash Pipeline 管道 工作原理
启动logstash实例时需为其指定管道定义。
最简单的管道定义来启动logstash实例
cd logstash-6.2.4bin/logstash -e 'input { stdin { } } output { stdout {} }'
用logstash来解析日志
1、配置 Filebeat 将日志发送给logstash
filebeat.prospectors:- type: log paths: - /path/to/file/logstash-tutorial.log output.logstash: hosts: ["localhost:5044"]
2、配置Logstash的管道输入为 Filebeat
管道定义模板
# The # character at the beginning of a line indicates a comment. Use# comments to describe your configuration.input {}# The filter part of this file is commented out to indicate that it is# optional.# filter {## }output {}
在logstash home目中创建文件管道配置文件 first-pipeline.conf,配置如下:
input { beats { port => "5044" }}# The filter part of this file is commented out to indicate that it is# optional.# filter {## }output { stdout { codec => rubydebug }}
测试管道配置是否正确
bin/logstash -f first-pipeline.conf --config.test_and_exit
启动logstash实例
bin/logstash -f first-pipeline.conf --config.reload.automatic
3、配置filter 来解析日志
input { beats { port => "5044" }}#配置使用 grok 过进行滤转换filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}"} }}output { stdout { codec => rubydebug }}
关闭filebeat实例,执行 sudo rm data/registry 删除filebeat记录,再启动filebeat
4、再加入一个过滤器
#实现ip转地理坐标geoip { source => "clientip" }
5、配置输出到elasticsearch
output { elasticsearch { hosts => [ "localhost:9200" ] }}
input
Logstash中实现了很多input 插件,可满足我们各种来源数据的接收:
https://www.elastic.co/guide/en/logstash/current/input-plugins.html
配置从多个input获取数据
input { stdin { } file { path => "/tmp/*_log" } beats { port => "5044" }}
filter
Logstash中实现了很多filter 插件:
https://www.elastic.co/guide/en/logstash/current/filter-plugins.html
可多重过滤处理
filter { grok { match => { "message" => "%{COMBINEDAPACHELOG}"} } geoip { source => "clientip" }}
如何解析日志文本为字段
用 grok 过滤器
Grok match 表达式语法:
%{SYNTAX:SEMANTIC}
预定义的正则表达式:
https://github.com/logstash-plugins/logstash-patterns-core/tree/master/patterns
例如:
55.3.244.1 GET /index.html 15824 0.043
%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}
output
Logstash中实现了很多output 插件:
https://www.elastic.co/guide/en/logstash/current/output-plugins.html
输出到多个地方
output { elasticsearch { hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"] } file { path => "/path/to/target/file" } stdout { codec => rubydebug }}
codec
Logstash中实现了很多codec插件,可以在input 中指定用什么codec来读取输入内容;可以在output中指定输出什么格式。
更多配置:https://www.elastic.co/guide/en/logstash/current/configuration.html
Kibana
Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、查看、交互操作。可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。
Kibana 可以使大数据通俗易懂。它很简单,基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化。
搭建 Kibana 非常简单。可以分分钟完成 Kibana 的安装并开始探索 Elasticsearch 的索引数据 — 没有代码、不需要额外的基础设施。
下载:
https://www.elastic.co/guide/cn/kibana/current/install.html
Kibana server 启动时从 kibana.yml 文件中读取配置属性
server.port:
默认值: 5601 Kibana 由后端服务器提供服务,该配置指定使用的端口号。
server.host:
默认值: "localhost" 指定后端服务器的主机地址。
server.basePath:
如果启用了代理,指定 Kibana 的路径,该配置项只影响 Kibana 生成的 URLs,转发请求到 Kibana 时代理会移除基础路径值,该配置项不能以斜杠 (/)结尾。
server.maxPayloadBytes:
默认值: 1048576 服务器请求的最大负载,单位字节。
server.name:
默认值: "您的主机名" Kibana 实例对外展示的名称。
server.defaultRoute:
默认值: "/app/kibana" Kibana 的默认路径,该配置项可改变 Kibana 的登录页面。
elasticsearch.url:
默认值: "http://localhost:9200" 用来处理所有查询的 Elasticsearch 实例的 URL 。
elasticsearch.preserveHost:
默认值: true 该设置项的值为 true 时,Kibana 使用 server.host 设定的主机名,该设置项的值为 false 时,Kibana 使用主机的主机名来连接 Kibana 实例。
kibana.index:
默认值: ".kibana" Kibana 使用 Elasticsearch 中的索引来存储保存的检索,可视化控件以及仪表板。如果没有索引,Kibana 会创建一个新的索引。
kibana.defaultAppId:
默认值: "discover" 默认加载的应用。
elasticsearch.username: 和 elasticsearch.password:
Elasticsearch 设置了基本的权限认证,该配置项提供了用户名和密码,用于 Kibana 启动时维护索引。Kibana 用户仍需要 Elasticsearch 由 Kibana 服务端代理的认证。
elasticsearch.pingTimeout:
默认值: elasticsearch.requestTimeout setting 的值,等待 Elasticsearch 的响应时间。
elasticsearch.requestTimeout:
默认值: 30000 等待后端或 Elasticsearch 的响应时间,单位微秒,该值必须为正整数。
elasticsearch.requestHeadersWhitelist:
默认值: [ 'authorization' ] Kibana 客户端发送到 Elasticsearch 头体,发送 no 头体,设置该值为[]。
elasticsearch.customHeaders:
默认值: {} 发往 Elasticsearch的头体和值, 不管 elasticsearch.requestHeadersWhitelist 如何配置,任何自定义的头体不会被客户端头体覆盖。
elasticsearch.shardTimeout:
默认值: 0 Elasticsearch 等待分片响应时间,单位微秒,0即禁用。
elasticsearch.startupTimeout:
默认值: 5000 Kibana 启动时等待 Elasticsearch 的时间,单位微秒。
用法手册
https://www.elastic.co/guide/cn/kibana/current/createvis.html
基本流程