弹性堆栈介绍

当您运行对公司至关重要的软件时,您将无法获得仅用于分析一段时间前发生的事情的日志,让客户端告诉您您的应用程序已损坏,而您甚至不知道发生了什么是真实的问题。 解决该问题的方法之一是使用监视和日志记录。

大多数应用程序都将具有日志记录,即使它只是一个文本文件,也需要使用grep或tail等工具来查看发生了什么。 但这是查看日志的一种非常被动的方式,因为您必须采取措施,并且可能只有在出现问题时才查看日志。 您需要的是让日志告诉您正在发生的事情,今天我们将为此而迈出第一步。

通过标题,您可能已经知道我们将要讨论Elasticstack 。 我在这篇文章中的目的是提供一种基本的方法来开始收集和分析您的日志,而无需您处理我所经历的所有困难。

弹性堆栈

Elastic Stack在被称为ELK之前,是一组工具,可以帮助您collectstructurestoreanalyse并还可以针对某些情况创建actions

弹性堆栈由4个组件组成:

  • Kibana是一种可视化工具,可从ElasticSearch读取数据。 您可以手动创建仪表板或查询ElasticSearch
  • ElasticSearch是日志的存储。 您可以从BeatsLogstash发送日志,并将其存储在索引中。 您可以具有多个索引来存储来自多个源的数据。
  • Logstash是负责处理日志的应用程序,您可以将日志解析为更有用的数据,并将其发送到ElasticSearch
  • BeatsFilebeat是一种轻型工具,可读取日志并将其发送到ElasticSearchLogstash 。 该工具的唯一目的是读取日志文件,它无法执行任何复杂的操作。 如果需要执行复杂的操作,则可以将该日志发送到Logstash以便将其解析为所需的信息。

Logstash

我们从Logstash开始,因为它是您收集和解析日志的方式(是的,我提到过Beats但您无需启动它)。

Logstash是日志处理器和检索器。 Logstash的主要功能是为非结构化日志文件提供结构,处理日志分为三个步骤:

  • 输入–接收或获取日志。
  • 过滤器–处理或过滤。
  • 输出–将日志发送到永久存储。

输入项

Logstash可以从日志文件中检索数据,而且还可以从多个来源获取数据,例如:

  • 文字档
  • 资料库
  • Shell命令
  • Queue列
  • Http请求

如果要查看Logstash支持的所有输入插件,请检查docs 。

现在,我一直在使用的输入以及我将解释如何使用的输入是:

  • 文字档
  • 资料库
  • Shell命令

文字文件输入

存储日志的最常见方法之一是在计算机中通常位于/var/log文本文件中。 Logstash有一个插件可以读取文件,并像tail -f一样不断监视新行。

要使用该插件非常简单,只需添加文件的路径,Logstash就会处理其余的事情,不用担心旋转文件,该插件也知道如何处理。

file插件的用法如下:

input {file {path => /var/log/app/realworld.logid => realworld}
}

按照我们上面配置Logstash的方式,每一行都是一个日志条目。 但是有时候我们的日志不是那么简单,我们有诸如堆栈跟踪之类的东西,或者我们将JSON写入日志中。 在这种情况下,我们需要它们在一起才有意义,这就是Logstash提供codecs的原因,这是扩展输入插件的一种方式。 这些编解码器之一是Multiline

例如,下面有使用Spring的应用程序的日志,当我们有堆栈跟踪时,我们希望将其分组在一行中。

2019-08-18 18:31:53.845 INFO 6724 --- [ main] o.s.t.web.servlet.TestDispatcherServlet : FrameworkServlet '': initialization completed in 17 ms
com.andre2w.transaction.TransactionTooOldExceptionat com.andre2w.transaction.TransactionService.validateTimestamp(TransactionService.java:46)at com.andre2w.transaction.TransactionService.add(TransactionService.java:29)at com.andre2w.controllers.TransactionController.create(TransactionController.java:42)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498) 
2019-08-18 18:31:53.891 INFO 6724 --- [ main] o.s.b.t.m.w.SpringBootMockServletContext : Initializing Spring FrameworkServlet ''
2019-08-18 18:31:53.892 INFO 6724 --- [ main] o.s.t.web.servlet.TestDispatcherServlet : FrameworkServlet '': initialization started

因此,如果我们想从日志中捕获堆栈跟踪,我们可以做一个简单的正则表达式来对所有以空间开头的内容进行分组。

input {file {path => /var/log/app/realworld.logid => realworldcodec => multiline {pattern => "^\s"what => "previous"}}
}

但是在这种情况下,我们可以走得更远。 由于这些日志来自使用Spring的应用程序,并且所有日志都遵循某种格式,因此我们可以将与该格式不匹配的所有内容归为一组,其中包括堆栈跟踪,JSON和对象。

input {file {path => /var/log/app/realworld.logid => realworldcodec => multiline {pattern => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} \w+ \d+ --- \[\s+\w+]"negate => truewhat => "next"}}
}

negate what意思?

“否定”是用于定义是否要将正则表达式匹配或不匹配的行分组的选项。 在第一个示例中,省略了字段negate ,因此其默认值为Falsenegate => false意味着线将被组合在一起时,正则表达式匹配negate => true表示当匹配正则表达式时,行将被分组在一起。

what是Logstash将如何组的请求。 previous表示匹配的行将与上一行分组,而next行则很明显。

数据库

由于Logstash使用Java运行,因此您可以访问JDBC支持的任何数据库。 对于Postgres,您可以看到查询表pg_locks的锁数。

像这样的配置是:

input {jdbc {jdbc_connection_string => "jdbc:postgres://localhost:5432/main"jdbc_user => "postgres"jdbc_password => "postgres"jdbc_driver_class => "org.postgresql.Driver"statement_filepath => "/etc/logstash/queries/query-locks.sql"schedule => "* * * * *"tags => ["jdbc","staging-1","query-locks", "main"]}
}

jdbc_开头的字段jdbc_用于连接数据库的信息。 然后,我们有了statement_filepath ,它指向要运行Logstash的查询文件,您也可以将statement选项用于更多临时查询。 最后,我们有schedule选项,这是您要运行查询的频率,该值基于Linux crontab,在此示例中,它将每分钟运行一次。

tags帮助您识别正在运行的查询。 它只是一个字符串数组,您可以添加任何内容。

Logstash将解析所有字段并将其发送到输出中定义的数据存储。

使用JDBC输入时需要注意的一点是,您需要Logstash类路径中的jar。 在Logstash安装文件夹中,转到libs/jars并添加数据库驱动程序的jar。

执行力

有时,您可能希望从Logstash不太支持的源中获取一条数据。 在这种情况下,您可以使用exec输入插件来执行命令行应用程序,并将结果作为日志行。

input { exec {command => "/usr/bin/retrieve-data.sh"schedule => "* * * * *"tags => ["retrieve-data","staging"]}
}

此输入非常易于使用,您可以选择:

  • command :您要使用的shell命令。
  • schedule :与jdbc-input schedule相同,是您要运行命令的频率。
  • tags :以后识别结果的信息。

使用此插件,您不必担心结果会多行显示, Logstash会将所有内容分组在一行中。

过滤

可以说我们正在从所有输入中接收数据,但是我们需要以有用的方式转换数据。 我们不仅希望拥有日志行,还希望统计信息能够实时查看正在发生的事情,并将收到的日志转换为结构正确的数据。

Grok Parser

在大多数情况下,使用Grok Parser插件。 大多数情况下,日志中的数据不是结构化格式,但是我们仍然需要解析这些非结构化数据并为其赋予一些含义。 如果要求和,就不能将数字作为字符串。 Grok不会通过使用正则表达式来构造数据, Logstash具有一组涵盖大多数情况的内置正则表达式。

这是过滤器的示例。

我们正在从互联网接收HTTP请求,我们想跟踪哪些端点的请求最多,我们的日志结构如下:

192.168.0.1 GET /索引

因此,我们添加了一个Grok过滤器来结构化:

filter {grok {match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request}"}}
}

该过滤器中发生了什么?

match是指检查我们收到的日志的消息字段并将其转换为结构化数据。

因此,我们收到了来自网络服务器的请求:

我希望Logstash获取日志并将其转换为结构化数据(这是JSON,就像现在的一切一样)。 我们将匹配器设为:

"%{IP:client} %{WORD:method} %{URIPATHPARAM:request}"

grok的语法为%{PATTERN:field}

模式是您要如何匹配该字段以及将在数据中使用哪种正则表达式,而该字段将是要存储该数据的字段(位明显)。 您可以在此处查看所有可用的模式。

如果Logstash无法正确解析该模式,它将添加一个名为_grokparsefailure的标签。

由于它只是一堆用于解析数据的正则表达式,因此您可以创建自己的模式。 为此,您需要在Logstash文件夹中创建一个名为patterns的文件夹(您将需要检查安装位置)。 文件名可以命名为任意名称, Logstash将读取其中的所有内容。

grok {match => {"path" => "/%{FILE_VERSION:version}_%{BU_ID:id}\.csv$"}patterns_dir => ["/elasticsearch/logstash/example/patterns"]
}

还有一种将文件保存在其他文件夹中,然后在配置文件中声明的方法。

该文件的内容必须遵循PATTERN_NAME regex的模式,因此您将以类似以下内容结束:

FILE_VERSION \w+\d{6}(?=_)
BU_ID \d{3}(?=\.)

如果您不打算重用该正则表达式并希望对其进行内联,则也可以这样做:

%{DATESTAMP:timestamp} (?<mti_before>\w{46})(?<mti>\w{4})%{GREEDYDATA}

就像正则表达式组一样,您可以使用括号来指定要分组的内容,然后从问号开始通知您将要使用正则表达式。 然后,添加要将数据解析到的字段的名称,最后,您可以添加正则表达式。

Grok也将允许转换为intfloat 。 您只需要在match添加一个额外的参数即可。 例如: %{IP:client:int}

使用grok插件时,请注意不要通过添加模式来复制正在发送的消息:

grok {match { message => "%{GREEDYDATA:message}" }
}

这会将新消息添加到消息字段,而不是替换。

JSON格式

您可能处在更好的状况,并且已将日志结构化为JSON之类的格式。 为此, Logstash将为您提供免费的解析。

json {source => "message"target => "payload"
}

这就是Logstash解析所有JSON消息并为字段设置适当的数据类型所需要做的一切。

核心价值

另一个可能有用的过滤器是Key-Value或kv 。 它用于基于两个键拆分数据。 因此,如果我们的日志行如下所示:

timestamp=10/09/2019 10:10:50, level=INFO, message=Something wrong might not be right

我们可以这样使用kv过滤器:

filter {kv {source => "message"field_split => ","value_split => "="target => "summary"}
}

因此,我们可以使用kv过滤器解析消息中的数据。 该过滤器的唯一问题是您不能在过滤步骤中设置数据类型。

变异

您可能想要更改正在接收的日志,我不是在讨论对日志行的完整分析,而只是在进行一些小的更改。 有一个mutate过滤器可以做到这一点,并且可以使用多个命令来更改日志。

您可以使用mutate过滤器进行操作的一些示例:

  • convert :您可能已经解析了一个字段,但是您需要该字段不仅仅是一个字符串。 convert命令允许您将其转换为integerfloatstringboolean
filter {mutate {convert => {"quantity" => "integer""is_paid" => "boolean"}}
}
  • remove_field :您可能希望从日志中删除一些敏感数据,因此可以使用此命令将其删除。
filter {mutate {remove_field => ["sensitive_data"]}
}
  • gsub :这是一个使用正则表达式替换值的选项,您可能想混淆一些不相关的数据,可以为此使用该选项。
filter {mutate {gsub => [# field                   regex                      result"transaction_reference", "\d{4}-\d{4}-\d{4}-\d{4}", "XXXX-XXXX-XXXX-XXXX"]}
}

这将用掩码版本替换所有事务引用。

输出量

这是您可以将刚刚解析的日志定向到输出或数据存储的部分。 在我们的例子中,我们将使用NoSQL文档存储的Elasticsearch ,但您也可以将其发送到其他地方,例如CSVHTTP或什至email

您可以查看Logstash的文档以查看所有输出插件。

output {elasticsearch {hosts => ["192.168.0.15"]user => "elastic_user"password => "elastic_password"index => "application-log"}
}

在这里的示例中,我们将日志发送到另一台计算机上托管的Elasticsearch

弹性搜索

Elasticsearch是一个搜索分析引擎,负责收集和聚合存储的数据。 它还提供对结构化或非结构化文本或数字数据的各种数据的实时搜索。

Elasticsearch所有数据都以JSON格式存储,然后进行索引,使您可以立即对其进行搜索。 每个存储的文档都是包含数据的键/值对的集合,并且存储在优化的数据结构中,以帮助以后进行搜索。

基本构造

节点数

节点是存储和索引数据的最基本的构造之一。 有多种类型的节点。

  • 主节点:这控制集群
  • 数据节点:它保存数据并执行CRUD操作,聚合和搜索。
  • 接收节点:这将在索引之前转换并丰富数据。

指数

索引是具有相似特征的文档的集合,它们类似于关系数据库中的表。

索引比关系数据库更灵活,因为它们是轻量级的,因此您可以轻松创建多个索引。 例如,在日志记录中,您可以为每天创建一个索引,并将其类型设置为所拥有的日志类型。

每天都会创建一个新索引,而对于关系数据库则不会这样做。

使用Elasticsearch

使用Elasticsearch时,我们必须注意两点。 它们是templatespolicies

范本

可以将模板视为索引的架构, Elasticsearch可以设置默认架构,但是如果您希望对所拥有的数据进行聚合和计算,则需要对其进行更多控制。

Elasticsearch支持哪些类型? 支持的主要数据类型有:

  • 数值(长,整数,短,双精度,浮点)
  • 日期

建筑模板

如何设置模板? 好吧, Elasticsearch有一个类似于REST的API,您可以轻松地与之交互。

我们正在为金融科技公司的应用程序添加日志,我们想监视我们进行的资金转移。 我们用于传输的有效负载是:

{"paymentDate": "2019-09-14 11:25:32.321","amount": 100.00,"message": "Payment message","origin": {"sortCode": "11-11-11","account": "838383"},"destination": {"sortCode": "11-11-11","account": "1313123"}
}

我们开始使用payment_date字段构建模板,我们可以将类型设置为日期并提供字段格式:

"payment_date": {"type": "date","format": "yyyy-MM-dd HH:mm:ss.SSS"
}

然后我们有amount ,我们与该类型添加该字段scaled_floatscaling_factor为100所以Elasticsearch可以处理在小数部分两位数使生活变得更轻松了后,我们的搜索:

"amount": {"type": "scaled_float","scaling_factor": "100"
}

然后,我们得到的字段message只是一个字符串,因此我们将使用text类型创建一个为全文搜索建立索引的字段:

"message": {"type": "text"
}

origin字段和destination字段实际上是相同的,并且它们始终具有相同的格式,因此我们可以使用keyword类型。 这种类型适用于少量的半结构化数据,例如邮政编码,地址,电子邮件,分类代码和帐号:

"origin": {"properties": {"body": {"properties": {"sort_code": {"type": "keyword"},"account": {"type": "keyword"}}}}
}

现在我们有了索引的完整映射,可以将其插入到Elasticsearch 。 我们只是向它发出PUT请求。

curl -X PUT "http://elasticsearch.com/_template/transfers_template" -d @transfers_template.json
{"index_patterns": ["transfers-*"],"mappings": {"_meta": {"beat": "transfers","version": "7.0.1"},"date_detection": false,"dynamic_templates": [{"labels": {"mapping": {"type": "keyword"},"match_mapping_type": "string","path_match": "labels.*"}},{"container.labels": {"mapping": {"type": "keyword"},"match_mapping_type": "string","path_match": "container.labels.*"}},{"fields": {"mapping": {"type": "keyword"},"match_mapping_type": "string","path_match": "fields.*"}},{"docker.container.labels": {"mapping": {"type": "keyword"},"match_mapping_type": "string","path_match": "docker.container.labels.*"}},{"kibana.log.meta": {"mapping": {"type": "keyword"},"match_mapping_type": "string","path_match": "kibana.log.meta.*"}},{"strings_as_keyword": {"mapping": {"ignore_above": 1024,"type": "keyword"},"match_mapping_type": "string"}}],"properties": {"@timestamp": {"type": "date"},"payment_date": {"type": "date","format": "yyyy-MM-ddTHH:mm:ss.SSSSSS"},"amount": {"type": "scaled_float","scaling_factor": "100"},"message": {"type": "text"},"origin": {"properties": {"body": {"properties": {"sort_code": {"type": "keyword"},"account": {"type": "keyword"}}}}},"destination": {"properties": {"body": {"properties": {"sort_code": {"type": "keyword"},"account": {"type": "keyword"}}}}}}}
}

政策规定

此功能仅在Elasticsearch的高级版本中可用。

索引将一直被数据轰炸,就像日志文件一样,我们需要一个过渡策略来使磁盘不满。 在Elasticsearch的高级版本中,我们拥有索引策略工具来帮助我们进行管理。

首先要知道的是索引可以处于哪些状态。

  • hot :是我们正在写入的索引。
  • warm :是我们经常查询但未写入的索引。
  • cold :是我们不再写的索引,我们也不经常查询数据。
  • delete :是不再需要的索引,可以删除。

索引从hot状态开始,当我们不想再继续写索引时,我们可以对Elasticsearch说。 我们使用max_agemax_size选项告诉它开始使用另一个索引。 在下面的示例中,我们每天或在达到5GB (任意选择该数字)时创建一个新索引。

{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_age": "1d","max_size": "5GB"}}}}}
}

我们不想保持所有索引都hot ,因此我们可以开始更改旧索引的状态并使它们warm 。 定义将进入warm状态的策略的策略始于min_age参数,这听起来很明显。 在本例中,我们将min_age设置为7d ,因此所有7天或更早的hot索引都将转换为warm索引。

对于warm索引,我们提供了一些以前在hot索引中不可用的选项,“ actions部分允许我们在更改索引状态时进行一些更改。

我们可以看到的第一个选项是forcemerge此选项(设置为1 ,它告诉Elasticsearch合并从hotwarm所有索引。 这很有用,因为在Elastisearch当您删除文档时,该文档并没有真正被删除,只有标记为已删除。 在合并过程中,标记为已删除的文档将被正确删除,就像您将文件发送到“ Trash bin然后在以后从系统中删除它们一样。

然后我们进行shrink ,该shrink用于减少索引的分片数量。 由于我们不再写该索引,因此我们不需要之前分配的所有分片。

最后我们allocate 。 在这里,我们可以设置number_of_replicas ,以防万一我们需要数据高度可用,它比只有一个分片更安全。

"warm": {"min_age": "7d","actions": {"forcemerge": {"max_num_segments": 1},"shrink": {"number_of_shards": 1},"allocate": {"number_of_replicas": 2,"require": {"data": "warm"}}}
}

对于甚至比我们为warm状态设置的数据还旧的数据以及出于安全原因而存储的数据,我们可以将其索引设置为cold 。 我们将超过6个月的每个索引设置为cold然后将其冻结。 在此步骤中进行冻结的好处是, Elastisearch不会为冻结的索引使用额外的内存。

"cold": {"min_age": "180d","actions": {"freeze": {}}
}

最后,删除索引非常简单。

"delete": {"min_age": "365d","actions": {"delete": {}}
}

我们拥有的最终政策将如下所示:

{"policy": {"phases": {"hot": {"actions": {"rollover": {"max_age": "1d","max_size": "5GB"}}},"warm": {"min_age": "7d","actions": {"forcemerge": {"max_num_segments": 1},"shrink": {"number_of_shards": 1},"allocate": {"number_of_replicas": 2,"require": {"data": "warm"}}}},"cold": {"min_age": "100d","actions": {"freeze": {}}},"delete": {"min_age": "365d","actions": {"delete": {}}}}}
}

节拍

FileBeat

Filebeat是一个轻量级的工具,可以读取日志并将其发送到ElasticSearchLogstash 。 该工具的唯一目的是读取日志文件,它无法执行任何复杂的操作。 如果要执行复杂的操作,则可以将日志发送到Logstash并解析为所需的信息。

如果您有多台服务器,并且由于Logstash是一个繁重的应用程序而不想在所有计算机上安装Logstash ,则可以使用Filebeat (它是用Go语言编写的,本机已编译且非常轻量级的)。

配置Filebeat并不Filebeat因为它做的并不多。 您具有包含配置的filebeat.yml

filebeat.config.inputs:filebeat:inputs:- type: logpaths:- "/var/log/applog/*.log"output:logstash:hosts: ["logstash:5043"]

我们可以看到inputs部分,该部分从文件夹读取日志Logstash中托管在其他位置的output 。 在此配置文件中,我们正在从文件夹applog中读取日志。 您还可以在路径中使用全局模式来获取多个文件或捕获差异,例如大写或小写字母。

多行字符串

使用Filebeat您可能需要读取多行字符串。 就像Logstash一样,您可以在配置中使用multiline选项来读取文件, Logstash所有相同字段都应用于Filebeat

filebeat.config.inputs:- type: logpaths:- "/var/log/applog/application.log"multiline:pattern: "\\[\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2}:\\d{2}]\\[\\w{2}\\]"negate: Truematch: after

Filebeat如何工作 Filebeat参考[7.1] | 有弹性

领域

您还可以在正在读取的日志中添加其他信息,以便标识从中获取数据的文件,以备日后使用。

filebeat.config.inputs:- type: logpaths:- "/var/log/applog/application.log"fields:file_name: "application_log"multiline:pattern: "\\[\\d{2}\\/\\d{2}\\/\\d{4} \\d{2}:\\d{2}:\\d{2}]\\[\\w{2}\\]"negate: Truematch: after

自动加载

您还可以从配置文件中拆分输入列表,这样就可以用输入更新文件,而无需重新启动Filebeat 。 因此,我们没有将inputs直接添加到主配置文件中,而是将其提供给具有输入配置的文件。

filebeat.config.inputs:enabled: truepath: inputs.ymlreload.enabled: truereload.period: 10s

inputs.yml将要加载的Filebeat

- type: logpaths:- "/var/log/haproxy.log"fields:file_name: "Haproxy"

基巴纳

到目前为止,我们正在收集,结构化和存储所有这些日志。 现在我们需要从中获得一些价值。 仅仅存储它们不是最佳选择,我们需要可视化它们以获取一些反馈。

为了可视化存储到Elasticsearch所有数据,您可以使用Kibana 。 它是一个应用程序,允许您从Elasticsearch查询数据并基于此创建可视化效果。

Kibana主页中,我们选择使用一种模式来连接到Elastisearch的索引,该模式可以指定索引的名称(例如logs-*因此我们可以搜索所有以logs-开头的索引,因为我们可能是按天而不是全部对日志进行了分组在一个索引中。

发现

Discovery区域使您可以可视化和搜索Elastichsearch存储的数据。

1 –过滤器

您可以在一个栏中使用KQL编写查询, KQL是一种自定义查询语言,非常易于使用。 Kibana也将帮助您自动完成查询。

因此,如果我们要搜索,您可以输入:

tags: "retrieve-data" and stats1 >= 10000

或者,您可以使用“ filters部分,在该部分中,您可以使用更加面向UI的方式进行搜索。

您还可以保存搜索以供以后使用,这样就不必每次都重写。 保存的搜索可以在Kibana UI的其他部分中使用。

2 –日期过滤器

如果要按特定时间段过滤结果,则过滤器允许您使用两个选项:

  • 绝对:您可以设置所需的确切日期和时间。
  • 相对:您可以设置所需的日期和时间戳,例如10 minutes ago 。 使用此选项,您还可以设置从Elasticsearch获取最新数据。

3 –记录

您可以以键值方式展开和查看记录,它还显示字段的类型,可以是三种:

  • t –文本字段
  • # –数字字段
  • 时钟符号–日期时间

您还可以通过在左侧的“ Available Fields菜单中选择要过滤的字段来进行过滤

可视化

我们需要一种可视化所有存储良好的数据的方法,而Visualize允许我们创建多种图形。

Y轴

在此示例中,我们将创建一个bar graph 。 在左侧菜单中,您可以设置创建图形的选项。

  1. Aggregation :是您要执行的一种操作,可以是countsumaverage 。 还有更复杂的操作,例如Standard Deviation和使用其他值的操作。
  2. Field :是您要用于进行计算的字段以及要显示的值。 对于简单的聚合,您可以从下拉列表中直接选择字段,对于更复杂的查询,可以使用QueryDSLJSON查找值。
  3. Custom Label :您可能不想无意义地显示数据,因此您可以在此处为其添加漂亮的标签。

水桶

  1. Aggregation :您将如何对数据进行分组。 您可能需要一段时间使用“ Date Histogram或使用特定字段来对具有端点的端点进行分组。
  2. Field :是您将用于拆分数据的字段。 如果您需要更复杂的聚合,则可以使用QueryDSL作为输入。
  3. Interval :如果要按日期分组,可以指定要分割数据的时间段。 对于其他聚合(例如范围),您将获得不同的间隔字段。

仪表板

现在,我们可以将构建在Dashboards的可视化文件放在一起,以便将所有要查看的数据聚合到一个位置。 您可以添加创建的可视化效果,并调整其大小以适合您所需的屏幕。 另外,您可以更改对它们的搜索,甚至可以全屏显示它们,从而非常好地显示它们。

开发工具

Kibana还为您提供了“ Dev Tools部分,其中包含一些有助于您工作的工具。

安慰

我们看到, Elasticsearch具有类似REST的API,控制台也提供了与API交互的简便方法。 提供自动完成功能并立即连接到Elasticsearch因此您无需手动构建整个请求。 您可以仅通过拥有方法和路径来发出请求,还可以编写带有验证和完成的JSON

GET _template/transfers_template
PUT /test-template-000001
{"aliases": {"test-template-alias": {"is_write_index": true}}
}

Grok调试器

当我们谈论Logstash我们看到了Grok插件及其强大功能,但是Grok使用正则表达式工作,而且每个人都知道正则表达式完全疯狂并且很容易破解,因此调试器可以帮助我们构建模式来解析我们的代码。日志行。

我们有从服务器获取统计信息的消息,共有四列,但是我们必须拆分为适当的字段,因此我们需要使用Grok解析器。

16765 | 10475 | 26017 | 27583
%{NUMBER:stats1} \| %{NUMBER:stats2} \| %{NUMBER:stats3} \| %{NUMBER:stats4}

今天就这些

在这篇文章中,我们了解了Elastic Stack的组件,如何开始使用它们以及组织日志的重要性。 另外,您始终可以在这里诉诸Elastic Stack文档,以了解支持的其他功能(我的帖子中未提及)。

翻译自: https://www.javacodegeeks.com/2019/11/elastic-stack-introduction.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340977.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

access统计没有选课的人数_当代大学生发愁求职就业,更发愁“选课”,自主选课变成了负担...

当代大学生除了求职就业&#xff0c;最发愁的就是“选课”。不得不说&#xff0c;随着科技的发展&#xff0c;各行各业都发生了翻天覆地的变化。而在大学里的选课&#xff0c;也因此有了巨大的改变。过去&#xff0c;大学生上课&#xff0c;其实课程都是被安排好的&#xff0c;…

产线数字化软件源码_品质笔记⑥丨卢宇聪:把握数字化趋势,坚定创新发展道路...

6天5夜&#xff0c;跨越3座城市&#xff0c;深度走访7家企业&#xff0c;对话多位企业家……这是一趟开阔视野之旅。我接触了很多之前极少有机会接触的企业&#xff0c;比如做光缆的法尔胜泓晟集团、做节能装备的双良集团、做密封件的天生密封件有限公司等。我以前经常接触的是…

es 安装kopf_Elasticsearch-kopf导览

es 安装kopf当我需要一个插件来显示Elasticsearch的集群状态时&#xff0c;或者需要深入了解通常为经典插件elasticsearch-head所达到的索引时。 由于有很多建议&#xff0c;而且似乎是非官方的继任者&#xff0c;所以我最近更详细地研究了elasticsearch-kopf 。 我喜欢它。 我…

arm 交叉编译找不到so_搭建交叉编译环境并验证

1. 搭建编译环境并验证1.1 实验目的 掌握嵌入式开发环境、交叉编译器的搭建、安装和配置方法 熟悉Linux应用程序的编译、调试方法&#xff0c;能够验证X86平台和ARM平台的差异1.2 实验内容 交叉编译器环境搭建 编写一个典型的Linux应用程序 使用GDB调试Linux程序(PC平台) 用Mak…

雷达的工作原理示意图_电磁阀的构成和工作原理示意图

电磁阀符号的含义&#xff1a;电磁阀符号由方框、箭头、“T”和字符构成。电磁阀图形符号的含义一般如下&#xff1a;1、用方框表示阀的工作位置&#xff0c;每个方块表示电磁阀的一种工作位置&#xff0c;即“位”。有几个方框就表示有几“位”&#xff0c;如二位三通表示有两…

sqlserver拼接字符串换行_1.3【Python】第三章 字符串

人工智能入门与实战第一季&#xff1a;python基础语法字符串是比较常见的数据类型&#xff0c;在第一章中我们最早接触的数据类型就是字符串&#xff1a;"hello world"&#xff0c;字符串可以用单引号’‘或双引号""来表示代码示例&#xff1a;name "…

mot数据集_谈谈ReID与MOT的关系

1.ReID与MOT的联系在MOT任务中&#xff0c;一般常用的特征模型有运动模型和表观模型&#xff0c;其中表观模型以行人重识别(ReID)类算法为主流。Re-ID任务主要解决的是跨摄像头场景下行人的识别与检索&#xff0c;其中存在给定了身份的图片序列query&#xff0c;需要为不同摄像…

jClarity:在Azure上升级到Java

在互联世界公共基础结构的新时代&#xff0c;最大和最重要的两个方面是Java和OpenJDK的诞生和兴起。 因此&#xff0c;许多公司将时间和资源投入到构建最先进的技术上&#xff0c;以确保整个行业在未来几年内在AdoptOpenJDK上拥有丰富的质量&#xff0c;而且免费的OpenJDK二进制…

装饰器模式应用场景_装饰器设计模式的应用

装饰器模式应用场景嗨&#xff0c;您好&#xff01; 今天&#xff0c;我将展示装饰设计模式的实际应用。 装饰器设计模式是一种广泛使用的设计模式&#xff0c;同时在运行期间处理图形&#xff0c;树木和动态更改。 如果您正在寻找或尝试进行递归&#xff0c;这也是一个不错的…

Auto Lisp 标注子样式_CSS 核心样式

CSS核心样式粗细font-weight作用:设置文字是否加粗显示属性名: font-weight, 属于font属性的一个单-属性属性值有两种方式:单词类型、数字类型单词类型数字类型100-900之间的整百数字数字越大&#xff0c;文字显示越粗其中400等价于normal, 700等价于bold字体风格font-style作用…

均质机工作原理动画_3D动画演示:有刷直流电机的工作原理

点上面蓝色字体直观学机械可长期订阅我们法律顾问&#xff1a;赵建英律师下面这张图是电机的分类&#xff0c;在看完这张图后&#xff0c;大家基本也就知道咱们今天说的有刷电机具体属于哪一类了。下面这个是LearnEngineering制作的动画&#xff0c;讲解的是直流电机的工作原理…

a113 智能音箱芯片方案_高通入局智能音箱,首款四核单芯片方案曝光

不得不说&#xff0c;智能音箱已经成为目前重要的科技品类之一&#xff0c;许多公司包括亚马逊、谷歌、苹果、阿里巴巴、小米等等&#xff0c;都在大举进军智能音箱市场。为了尽可能为更多产品提供核心原件&#xff0c;近日&#xff0c;高通公司推出了一款全新的SOC系列——QCS…

隐藏水滴屏的软件_屏下摄像头,实现这一全面屏终极方案有多难?

为了实现真正全面屏&#xff0c;手机厂商们到底能有多拼&#xff1f;在奔向全面屏的征途里&#xff0c;导航键、听筒、传感器、指纹识别模组等都被成功解决&#xff0c;隐藏在边框或屏幕底。唯独前置摄像头&#xff0c;成为全面屏征途的最后一块终极障碍。这场由iPhone X刘海屏…

java ee api_Java EE并发API教程

java ee api这是一个示例章节&#xff0c;摘自Francesco Marchioni编辑的WildFly上的实用Java EE 7开发 。 本章讨论了新的Java EE并发API&#xff08;JSR 236&#xff09; &#xff0c;它概述了使用一组托管资源在Java EE容器上并行执行任务的标准方法。 为了描述如何在您的应…

二进制_简学:二进制数制的应用

设现有正整数150&#xff0c;二进制形式为10010110&#xff0c;现有如下题目&#xff0c;求其尽可能简单的解法。题目一&#xff1a;判断该正整数是否是2的乘方&#xff1b;解法&#xff1a;由上表可以看出2的乘方的二进制形式只有一个bit为1&#xff0c;因此判断一个正整数A是…

swagger 动态设置版本号_如何快速玩转swagger

Spring Boot 框架是目前非常流行的微服务框架&#xff0c;我们很多情况下使用它来提供 Rest API。而对于 Rest API 来说很重要的一部分内容就是文档&#xff0c;Swagger 为我们提供了一套通过代码和注解自动生成文档的方法&#xff0c;这一点对于保证 API 文档的及时性将有很大…

angular java_带有Angular JS的Java EE 7 –第1部分

angular java今天的帖子将向您展示如何使用Java EE 7和Angular JS构建一个非常简单的应用程序。 在去那里之前&#xff0c;让我告诉您一个简短的故事&#xff1a; 我必须承认&#xff0c;我从来都不是Java语言的忠实拥护者&#xff0c;但是我仍然记得我第一次使用它。 我不记得…

操作系统的msxml组件版本过低_Zabbix 5.0 LTS 版本安装

zabbix 5.0 版本于 5 月 11 日正式发布&#xff0c;是最新的 LTS(长期支持)版本&#xff0c;5.0 带来很多功能和特性&#xff0c;后面会陆续推出文章介绍&#xff0c;下面主要介绍下 5.0 版本的安装。环境要求5.0 版本对基础环境的要求有大的变化&#xff0c;最大的就是对 php …

登录判断_Spring Security之多次登录失败后账户锁定功能的实现

在上一次写的文章中&#xff0c;为大家说到了如何动态的从数据库加载用户、角色、权限信息&#xff0c;从而实现登录验证及授权。在实际的开发过程中&#xff0c;我们通常会有这样的一个需求&#xff1a;当用户多次登录失败的时候&#xff0c;我们应该将账户锁定&#xff0c;等…

变压器符号_行输出变压器的结构、符号及电路分析

行输出变压器又称逆程变压器、回扫变压器&#xff0c;俗称行输出&#xff0c;它是电视机、显示器中的一个重要变压器。1.行输出变压器结构行输出变压器的全部绕组和高压整流管均密封在其中&#xff0c;底部引出各个绕组的引脚&#xff0c;高压输出采用高压引线直接送至显像管的…