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

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 在输出事件中添加了一个名为"_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
输入 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
", "tags":["_grokparsefailure"]
}