Logstash - 内部架构

  • 简述

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

    Logstash 处理来自不同服务器和数据源的日志,它充当托运人。托运人用于收集日志,这些日志安装在每个输入源中。中间件像Redis, Kafka或者RabbitMQ是为索引器保存数据的缓冲区,可能有多个代理作为故障转移实例。
    索引器像Lucene用于索引日志以获得更好的搜索性能,然后将输出存储在 Elasticsearch 或其他输出目标中。输出存储中的数据可用于 Kibana 和其他可视化软件。
    Logstash 服务架构
  • Logstash 内部架构

    Logstash 管道由三个组件组成Input, FiltersOutput. 输入部分负责指定和访问输入数据源,如日志文件夹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
    

    登录日志

    以下代码块显示了输入日志数据。
    
    Hello cainiaoya.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 cainiaoya.com", "tags":[]
    }
    
    正如您所见,Logstash 的输出包含的不仅仅是通过输入日志提供的数据。输出包含 Source Path、Timestamp、Version、Hostname 和 Tag,用于表示错误等额外消息。
    我们可以使用过滤器来处理数据并使其对我们的需求有用。在下一个示例中,我们使用过滤器来获取数据,这将输出限制为仅具有诸如 GET 或 POST 之类的动词后跟一个Unique Resource Identifier.

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