弹性堆栈介绍

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

大多数应用程序都将具有日志记录,即使它只是一个文本文件,也需要使用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.log
    id => 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.TransactionTooOldException
  at 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.log
    id => realworld
    codec => multiline {
      pattern => "^\s"
      what => "previous"
    }
  }
}

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

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

    codec => multiline {
      pattern => "\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3} \w+ \d+ --- \[\s+\w+]"
      negate => true
      what => "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} (?\w{46})(?\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: log
 paths:
  - "/var/log/applog/*.log"

 output:
 logstash:
 hosts: ["logstash:5043"]

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

多行字符串

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

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

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

领域

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

filebeat.config.inputs:
  - type: log
    paths:
      - "/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: True
      match: after
自动加载

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

filebeat.config.inputs:
  enabled: true
  path: inputs.yml
  reload.enabled: true
  reload.period: 10s

inputs.yml将要加载的Filebeat

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

基巴纳

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

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

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

发现

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

弹性堆栈介绍_第1张图片
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 。 在左侧菜单中,您可以设置创建图形的选项。

弹性堆栈介绍_第2张图片
  1. Aggregation :是您要执行的一种操作,可以是countsumaverage 。 还有更复杂的操作,例如Standard Deviation和使用其他值的操作。
  2. Field :是您要用于进行计算的字段以及要显示的值。 对于简单的聚合,您可以从下拉列表中直接选择字段,对于更复杂的查询,可以使用QueryDSLJSON查找值。
  3. Custom Label :您可能不想无意义地显示数据,因此您可以在此处为其添加漂亮的标签。
水桶
弹性堆栈介绍_第3张图片
  1. Aggregation :您将如何对数据进行分组。 您可能需要一段时间使用“ Date Histogram或使用特定字段来对具有端点的端点进行分组。
  2. Field :是您将用于拆分数据的字段。 如果您需要更复杂的聚合,则可以使用QueryDSL作为输入。
  3. Interval :如果要按日期分组,可以指定要分割数据的时间段。 对于其他聚合(例如范围),您将获得不同的间隔字段。

仪表板

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

弹性堆栈介绍_第4张图片

开发工具

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

安慰

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

弹性堆栈介绍_第5张图片
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}
弹性堆栈介绍_第6张图片

今天就这些

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

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

你可能感兴趣的:(可视化,大数据,数据库,python,java)