Logstash - 内部架构


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

Logstash服务架构

Logstash 处理来自不同服务器和数据源的日志,它充当托运者。托运人用于收集日志,并将这些日志安装在每个输入源中。像Redis、KafkaRabbitMQ这样的代理是保存索引器数据的缓冲区,可能有多个代理作为故障转移实例。

Lucene等索引器用于索引日志以获得更好的搜索性能,然后将输出存储在 Elasticsearch 或其他输出目的地中。输出存储中的数据可用于 Kibana 和其他可视化软件。

Logstash服务架构

Logstash 内部架构

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

Logstash 内部架构

解释 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

输入日志

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

Hello tutorialspoint.com

输出日志

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 在输出事件中添加了一个名为“_grokparsefailure”的标签,该标签与 grok 过滤器模式序列不匹配。

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

输出日志2.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"]
}