Logstash 内部架构

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

Logstash 服务架构

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

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

Logstash 服务架构

 

Logstash 内部架构

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

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 lidihuo.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 lidihuo.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 /lidihuo/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 /lidihuo/logstash", "uri":"/lidihuo/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"]
}

来自不同服务器或数据源的日志是使用托运人收集的。 Shipper 是安装在服务器中的 Logstash 实例,它访问服务器日志并发送到特定的输出位置。主要是将输出发送到Elasticsearch进行存储。 Log ...