Logstash - 内部架构



在本章中,我们将讨论 Logstash 的内部架构及其不同的组件。

Logstash 服务架构

Logstash 从不同的服务器和数据源处理日志,并且它充当发货人。发货人用于收集日志,并且安装在每个输入源中。像 **Redis、Kafka** 或 **RabbitMQ** 这样的代理是缓冲区,用于保存索引器的文件,可能有多个代理作为故障转移实例。

像 **Lucene** 这样的索引器用于索引日志以提高搜索性能,然后输出存储在 Elasticsearch 或其他输出目标中。输出存储中的数据可用于 Kibana 和其他可视化软件。

Logstash Service Architecture

Logstash 内部架构

Logstash 管道由三个组件组成:**输入、过滤器** 和 **输出**。输入部分负责指定和访问输入数据源,例如 **Apache Tomcat 服务器** 的日志文件夹。

Logstash Internal Architecture

解释 Logstash 管道的示例

Logstash 配置文件包含有关 Logstash 的三个组件的详细信息。在本例中,我们创建一个名为 **Logstash.conf** 的文件。

以下配置从输入日志“inlog.log”捕获数据,并在没有任何过滤器的情况下将其写入输出日志“outlog.log”。

Logstash.conf

Logstash 配置文件仅使用输入插件从 **inlog.log** 文件复制数据,并使用输出插件将日志数据刷新到 **outlog.log** 文件。

input {
   file {
      path => "C:/tpwork/logstash/bin/log/inlog.log"
   }
}
output {
   file {
      path => "C:/tpwork/logstash/bin/log/outlog.log"
   }
}

运行 Logstash

Logstash 使用 **–f** 选项指定配置文件。

C:\logstash\bin> logstash –f logstash.conf

inlog.log

以下代码块显示了输入日志数据。

Hello tutorialspoint.com

outlog.log

Logstash 输出包含消息字段中的输入数据。Logstash 还向输出添加其他字段,如时间戳、输入源路径、版本、主机和标签。

{
   "path":"C:/tpwork/logstash/bin/log/inlog1.log",
   "@timestamp":"2016-12-13T02:28:38.763Z",
   "@version":"1", "host":"Dell-PC",
   "message":" Hello tutorialspoint.com", "tags":[]
}

如您所见,Logstash 的输出包含超出输入日志提供的的数据。输出包含源路径、时间戳、版本、主机名和标签,这些用于表示额外的消息,例如错误。

我们可以使用过滤器来处理数据并使其对我们的需求有用。在下一个示例中,我们使用过滤器获取数据,该数据将输出限制为仅包含类似 GET 或 POST 后跟 **唯一资源标识符** 的数据。

Logstash.conf

在此 Logstash 配置中,我们添加了一个名为 **grok** 的过滤器以过滤输入数据。与输入日志模式序列匹配的输入日志事件仅会带有错误传递到输出目标。Logstash 在不匹配 grok 过滤器模式序列的输出事件中添加了一个名为“_grokparsefailure”的标签。

Logstash 提供了许多用于解析流行服务器日志(如 Apache)的内置正则表达式模式。此处使用的模式需要一个类似 get、post 等的动词,后跟一个统一资源标识符。

input {
   file {
      path => "C:/tpwork/logstash/bin/log/inlog2.log"
   }
}
filter {
   grok {
      match => {"message" => "%{WORD:verb} %{URIPATHPARAM:uri}"}
   }
}
output {
   file {
      path => "C:/tpwork/logstash/bin/log/outlog2.log"
   }
}

运行 Logstash

我们可以使用以下命令运行 Logstash。

C:\logstash\bin> logstash –f  Logstash.conf

inlog2.log

我们的输入文件包含两个由默认分隔符(即换行符)分隔的事件。第一个事件与 GROk 中指定的模式匹配,第二个事件不匹配。

GET /tutorialspoint/Logstash
Input 1234

outlog2.log

我们可以看到,第二个输出事件包含“_grokparsefailure”标签,因为它不匹配 grok 过滤器模式。用户还可以通过在输出插件中使用 **‘if’** 条件来删除输出中的这些不匹配事件。

{
   "path":"C:/tpwork/logstash/bin/log/inlog2.log",
   "@timestamp":"2016-12-13T02:47:10.352Z","@version":"1","host":"Dell-PC","verb":"GET",
   "message":"GET /tutorialspoint/logstash", "uri":"/tutorialspoint/logstash", "tags":[]
}
{
   "path":"C:/tpwork/logstash/bin/log/inlog2.log",
   "@timestamp":"2016-12-13T02:48:12.418Z", "@version":"1", "host":"Dell-PC",
   "message":"t 1234\r", "tags":["_grokparsefailure"]
}
广告

© . All rights reserved.