Logstash详细记录

Logstash详细记录(五)

这篇还是翻译官网,可略过。

官网链接:https://www.elastic.co/guide/en/logstash/current/index.html

一、开始使用Logstash

1.1 安装Logstash

https://www.elastic.co/guide/en/logstash/current/installing-logstash.html

1.2 使用Logstash解析日志

以便运行Logstash时将输出打印到stdout,完成之后,first-pipeline.conf的内容应该如下所示::

Bash

input {
    beats {
        port => "5043"
    }
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
    stdout { codec => rubydebug }
}

要验证配置,请运行以下命令:

Bash

bin/logstash -f first-pipeline.conf --config.test_and_exit

#--config.test_and_exit选项解析您的配置文件并报告任何错误。如果配置文件通过配置测试,请使用以下命令启动Logstash:

Bash

bin/logstash -f first-pipeline.conf --config.reload.automatic

#--config.reload.automatic选项启用自动配置重新加载,因此每次修改配置文件时都不必停止并重新启动Logstash。

#当Logstash启动时,可能会看到有关Logstash的一条或多条警告消息,而忽略了pipelinelines.yml文件。 可以放心地忽略此警告。 pipelines.yml文件用于在单个Logstash实例中运行多个管道。 对于这里显示的示例,正在运行一个管道。

如果你的管道工作正常,你应该看到一系列事件写入控制台:

Bash

{
    "@timestamp" => 2017-11-09T01:44:20.071Z,
        "offset" => 325,
      "@version" => "1",
          "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
          "host" => "My-MacBook-Pro.local",
    "prospector" => {
        "type" => "log"
    },
        "source" => "/path/to/file/logstash-tutorial.log",
       "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ]
}
...

使用Grok过滤器插件解析Web日志

      现在你有一个从Filebeat读取日志行的工作管道。 但是会注意到日志消息的格式并不理想。 需要解析日志消息以从日志创建特定的命名字段。 为此,将使用grok过滤器插件。

      Grok过滤器插件是Logstash中默认可用的几个插件之一。 有关如何管理Logstash插件的详细信息,请参阅插件管理器的参考文档。grok过滤器插件(https://www.elastic.co/guide/en/logstash/6.0/plugins-filters-grok.html)使您能够将非结构化日志数据解析为结构化和可查询的内容。

       由于Grok过滤器插件在传入的日志数据中查找模式,因此配置插件需要您决定如何识别您的用例感兴趣的模式。 Web服务器日志示例中的代表行如下所示:

Bash

83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] "GET /presentations/logstash-monitorama-2013/images/kibana-search.png
HTTP/1.1" 200 203023 "http://semicomplete.com/presentations/logstash-monitorama-2013/" "Mozilla/5.0 (Macintosh; Intel
Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36"

      该行开头的IP地址很容易识别,括号中的时间戳也是如此。 要解析数据,可以使用%{COMBINEDAPACHELOG} grok模式,该模式使用以下模式构建Apache日志中的行:

Bash

#信息     #字段名称
IP Address    #clientip    
User ID       #ident    
User Authentication    #auth    
timestamp    #timestamp    
HTTP Verb    #verb    
Request body    #request    
HTTP Version    #httpversion    
HTTP Status Code    #response    
Bytes served    #bytes    
Referrer URL    #referrer    
User agent    #agent

#如果您需要帮助构建grok模式,请尝试使用Grok调试器。 Grok调试器(https://www.elastic.co/guide/en/kibana/6.0/xpack-grokdebugger.html)是基本许可下的X-Pack功能,因此可以免费使用。

      编辑first-pipeline.conf文件,并用以下文本替换整个过滤器部分:

Bash

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

      完成之后,first-pipeline.conf的内容应该如下所示:

Bash

input {
    beats {
        port => "5043"
    }
}
filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}
output {
    stdout { codec => rubydebug }
}

      保存您的更改。 由于您启用了自动配置重新加载,因此您不必重新启动Logstash即可获取更改。 但是,您需要强制Filebeat从头开始读取日志文件。 为此,进入Filebeat正在运行的终端窗口,然后按Ctrl + C关闭Filebeat。 然后删除Filebeat注册表文件。 例如,运行:

Bash

sudo rm data/registry

      由于Filebeat存储它在注册表中收获的每个文件的状态,因此删除注册表文件将强制Filebeat读取从头开始收集的所有文件。

接下来,使用以下命令重新启动Filebeat:

Bash

sudo ./filebeat -e -c filebeat.yml -d "publish"

     在Filebeat开始处理事件之前,如果需要等待Logstash重新加载配置文件,可能会有一些延迟。Logstash应用grok模式后,事件将具有以下JSON表示形式:

Bash

{
        "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
         "offset" => 325,
           "auth" => "-",
          "ident" => "-",
           "verb" => "GET",
     "prospector" => {
        "type" => "log"
    },
         "source" => "/path/to/file/logstash-tutorial.log",
        "message" => "83.149.9.216 - - [04/Jan/2015:05:13:42 +0000] \"GET /presentations/logstash-monitorama-2013/images/kibana-search.png HTTP/1.1\" 200 203023 \"http://semicomplete.com/presentations/logstash-monitorama-2013/\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
           "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
       "referrer" => "\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
     "@timestamp" => 2017-11-09T02:51:12.416Z,
       "response" => "200",
          "bytes" => "203023",
       "clientip" => "83.149.9.216",
       "@version" => "1",
           "beat" => {
            "name" => "My-MacBook-Pro.local",
        "hostname" => "My-MacBook-Pro.local",
         "version" => "6.0.0"
    },
           "host" => "My-MacBook-Pro.local",
    "httpversion" => "1.1",
      "timestamp" => "04/Jan/2015:05:13:42 +0000"
}

#注意事件包括原始消息,但是日志消息也被分解成特定的字段。

使用Geoip过滤器插件增强你的数据

       除了解析日志数据以获得更好的搜索外,过滤器插件还可以从现有数据中获取补充信息。 例如,geoip插件查找IP地址,从地址派生地理位置信息,并将该位置信息添加到日志中。通过将以下行添加到first-pipeline.conf文件的过滤器部分,将Logstash实例配置为使用geoip过滤器插件:

Bash

 geoip {
        source => "clientip"
    }

      geoip插件配置要求您指定包含要查找的IP地址的源字段的名称。 在本例中,clientip字段包含IP地址。由于按顺序评估了过滤器,请确保geoip部分位于配置文件的grok部分之后,并且grok和geoip部分都嵌套在过滤器部分中。完成之后,first-pipeline.conf的内容应该如下所示:

Bash

input {
    beats {
        port => "5043"
    }
}
 filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    elasticsearch {
        hosts => [ "localhost:9200" ]
    }
}

       保存更改。 如前所述,要强制Filebeat从头开始读取日志文件,请关闭Filebeat(按Ctrl + C),删除注册表文件,然后使用以下命令重新启动Filebeat:

Bash

sudo ./filebeat -e -c filebeat.yml -d "publish"

       注意事件现在包含地理位置信息:

Bash

{
        "request" => "/presentations/logstash-monitorama-2013/images/kibana-search.png",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1700.77 Safari/537.36\"",
          "geoip" => {
              "timezone" => "Europe/Moscow",
                    "ip" => "83.149.9.216",
              "latitude" => 55.7485,
        "continent_code" => "EU",
             "city_name" => "Moscow",
          "country_name" => "Russia",
         "country_code2" => "RU",
         "country_code3" => "RU",
           "region_name" => "Moscow",
              "location" => {
            "lon" => 37.6184,
            "lat" => 55.7485
        },
           "postal_code" => "101194",
           "region_code" => "MOW",
             "longitude" => 37.6184
    },
    ...

测试你的管道

       现在Logstash管道被配置为将数据索引到Elasticsearch集群中,您可以查询Elasticsearch。根据Grok过滤器插件创建的字段,尝试对Elasticsearch进行测试查询。 用YYYY.MM.DD格式的当前日期替换$DATE:

Bash

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=response=200'

#索引名称中使用的日期是基于UTC,而不是Logstash正在运行的时区。 如果查询返回index_not_found_exception,请确保logstash- $ DATE反映索引的实际名称。 要查看可用索引的列表,请使用以下查询:curl 'localhost:9200/_cat/indices?v'。

     尝试另外搜索从IP地址派生的地理信息。 用YYYY.MM.DD格式的当前日期替换$DATE:

Bash

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=geoip.city_name=Buffalo'

博文来自:www.51niux.com

1.3 拼接多个输入和输出插件

       需要管理的信息通常来自多个不同的来源,并且用例可能需要多个目标来存储数据。 Logstash管道可以使用多个输入和输出插件来处理这些需求。在本节中,将创建一个Logstash管道,该管道从Twitter源和Filebeat客户端获取输入,然后将信息发送到Elasticsearch群集,并将信息直接写入文件。

从Twitter Feed中读取

        要添加推文,请使用twitter输入插件(https://www.elastic.co/guide/en/logstash/6.0/plugins-inputs-twitter.html)。

        将以下行添加到second-pipeline.conf文件的输入部分,用您的值替换此处显示的占位符值:

Bash

  twitter {
        consumer_key => "enter_your_consumer_key_here"
        consumer_secret => "enter_your_secret_here"
        keywords => ["cloud"]
        oauth_token => "enter_your_access_token_here"
        oauth_token_secret => "enter_your_access_token_secret_here"
    }

配置Filebeat将日志行发送到Logstash

     正如在前面配置Filebeat以将日志行发送到Logstash时一样,Filebeat客户端是一个轻量级的资源友好的工具,它从服务器上的文件收集日志,并将这些日志转发到Logstash实例进行处理。安装Filebeat后,需要配置它。 打开位于Filebeat安装目录中的filebeat.yml文件,并用以下几行代替内容。 确保路径指向你的系统日志:

Bash

filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log  #Filebeat处理的文件或文件的绝对路径。
  fields:
    type: syslog    #type类型为rsylog
output.logstash:   
  hosts: ["localhost:5043"]

通过将以下行添加到second-pipeline.conf文件的输入部分,将Logstash实例配置为使用Filebeat输入插件:

Bash

beats {
        port => "5043"
    }

将Logstash数据写入文件

可以配置Logstash管道将数据直接写入带有文件输出插件的文件。通过将以下行添加到second-pipeline.conf文件的输出部分,将Logstash实例配置为使用文件输出插件:

Bash

file {
        path => "/path/to/target/file"
    }

写入多个Elasticsearch节点:

       写入多个Elasticsearch节点可减轻给定Elasticsearch节点上的资源需求,并在特定节点不可用时提供冗余入口点。要将Logstash实例配置为写入多个Elasticsearch节点,请编辑second-pipeline.conf文件的输出节以读取:

Bash

output {
    elasticsearch {
        hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
    }
}

#在主机行中的Elasticsearch群集中使用三个非主节点的IP地址。 当hosts参数列出多个IP地址时,Logstash通过地址列表对请求进行负载平衡。 另外请注意,Elasticsearch的默认端口是9200,在上面的配置中可以省略。

测试管道

second-pipeline.conf示例:

Bash

input {
    twitter {
        consumer_key => "enter_your_consumer_key_here"
        consumer_secret => "enter_your_secret_here"
        keywords => ["cloud"]
        oauth_token => "enter_your_access_token_here"
        oauth_token_secret => "enter_your_access_token_secret_here"
    }
    beats {
        port => "5043"
    }
}
output {
    elasticsearch {
        hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
    }
    file {
        path => "/path/to/target/file"
    }
}

 

#Logstash正在使用配置的Twitter Feed中的数据,从Filebeat接收数据,并将这些信息编入索引到Elasticsearch集群中的三个节点以及写入文件。在数据源机器上,使用以下命令运行Filebeat:

Bash

sudo ./filebeat -e -c filebeat.yml -d "publish"

Filebeat将尝试在端口5043上连接。在Logstash以一个活动的Beats插件开始之前,该端口上将不会有任何答案,因此您看到关于在该端口上无法连接的任何消息现在都是正常的。要验证您的配置,请运行以下命令:

Bash

bin/logstash -f second-pipeline.conf --config.test_and_exit

--config.test_and_exit选项解析您的配置文件并报告任何错误。 当配置文件通过配置测试时,使用以下命令启动Logstash:

Bash

bin/logstash -f second-pipeline.conf

使用grep实用程序在目标文件中搜索以验证信息是否存在:

Bash

grep syslog /path/to/target/file

运行Elasticsearch查询以在Elasticsearch集群中查找相同的信息:

Bash

curl -XGET 'localhost:9200/logstash-$DATE/_search?pretty&q=fields.type:syslog'

用YYYY.MM.DD格式的当前日期替换$DATE。要查看Twitter Feed中的数据,请尝试以下查询:

Bash

curl -XGET 'http://localhost:9200/logstash-$DATE/_search?pretty&q=client:iphone'

#同样,请记住用YYYY.MM.DD格式的当前日期替换$DATE。

二、Logstash是如何工作的

       Logstash事件处理管道有三个阶段:输入→过滤器→输出。 输入生成事件,过滤器修改它们,输出将它们运送到别处。 输入和输出支持codecs(编解码器),使您可以在数据进入或退出流水线时进行编码或解码,而无需使用单独的过滤器。

Inputs

使用输入将数据导入Logstash。 一些更常用的输入是:

Bash

file #从文件系统上的文件读取,非常类似于UNIX命令tail -F
syslog #在众所周知的端口514上侦听系统日志消息,并根据RFC3164格式进行解析
redis #用redis通道和redis列表从redis服务器读取数据。 Redis经常用作集中式Logstash安装中的“broker”,它将来自远程Logstash“shippers”的Logstash事件排队。
beats  #处理由Filebeat发送的事件。

输入插件:https://www.elastic.co/guide/en/logstash/current/input-plugins.html

Filters

      过滤器是Logstash管道中的中间处理设备。 如果符合特定条件,您可以将条件过滤器组合在一起,对事件执行操作。 一些有用的滤镜包括:

Bash

grok  #解析和结构任意文本。Grok目前是Logstash中将非结构化日志数据解析为结构化和可查询的最佳方法。Logstash内置了120个模式,这很可能会找到满足您需求的模式!
mutate #对事件字段执行一般转换。可以重命名,删除,替换和修改事件中的字段。
drop  #完全删除一个事件,例如,调试事件。
clone  #制作一个事件的副本,可能会添加或删除字段。
geoip  #添加有关IP地址的地理位置信息(也可以在Kibana中显示惊人的图表!)

filters插件:https://www.elastic.co/guide/en/logstash/current/filter-plugins.html

Outputs

      输出是Logstash管道的最后阶段。 一个事件可以通过多个输出,但是一旦所有输出处理完成,事件就完成了执行。 一些常用的输出包括:

Bash

elasticsearch   #将事件数据发送给Elasticsearch。如果打算以高效方便和易于查询的格式保存您的数据,那么Elasticsearch是一条可行的路线。)
file  #将事件数据写入磁盘上的文件。
graphite  #将事件数据发送给graphite ,graphite 是一种流行的开源工具,用于存储和绘制指标
statsd  #将事件数据发送到statsd,这是一种“侦听统计信息(如计数器和定时器,通过UDP发送并将聚合发送到一个或多个可插入的后端服务”)的服务。如果你已经使用statsd,这可能对你有用!

outputs插件:https://www.elastic.co/guide/en/logstash/current/output-plugins.html

Codecs(编解码器)

      编解码器基本上是可以作为输入或输出的一部分操作的流过滤器。 使用编解码器,可以轻松地将消息从序列化过程中分离出来。 流行的编解码器包括json,msgpack和普通(文本)。

Bash

json:以JSON格式对数据进行编码或解码。
multiline:将多行文本事件(如java异常和堆栈跟踪消息)合并到单个事件中

编解码器插件:https://www.elastic.co/guide/en/logstash/current/codec-plugins.html

执行模型

      Logstash事件处理管道协调输入,过滤器和输出的执行。

      Logstash管道中的每个输入阶段都在其自己的线程中运行。输入将事件写入常见的Java SynchronousQueue(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/SynchronousQueue.html)。此队列不包含事件,而是将每个推送的事件传送给空闲的worker,如果所有worker都忙,则会阻塞。每个管道工作线程从该队列中取一批事件,为每个worker创建一个缓冲区,通过配置的过滤器运行一批事件,然后通过任何输出运行过滤的事件。批处理的大小和管道工作线程的数量是可配置的(请参阅调整和分析Logstash性能https://www.elastic.co/guide/en/logstash/current/tuning-logstash.html)。

     默认情况下,Logstash在流水线阶段(输入→过滤器和过滤器→输出)之间使用内存有界队列来缓冲事件。如果Logstash不安全地终止,则存储在内存中的任何事件都将丢失。为防止数据丢失,您可以启用Logstash将正在进行的事件保存到磁盘。请参阅持久队列了解更多信息(https://www.elastic.co/guide/en/logstash/current/persistent-queues.html)。

博文来自:www.51niux.com

三、设置和运行Logstash

#这个在前面的举例:http://www.51niux.com/?id=203  已经介绍过设置跟运行了,这里就挑着记录一下。

3.1 从命令行运行Logstash

要从命令行运行Logstash,请使用以下命令:

Bash

bin/logstash [options]

在命令行上设置的任何标志都会覆盖Logstash设置文件中的相应设置,但设置文件本身不会更改。 它保持原有的Logstash运行状态。

在测试Logstash时,指定命令行选项很有用。 但是,在生产环境中,我们建议您使用Logstash设置文件来控制Logstash执行。 使用设置文件可以使您更轻松地指定多个选项,并为您提供一个可版本化的文件,您可以使用该文件为每次运行始终如一地启动Logstash。

Logstash有以下标志。 您可以使用--help标志来显示此信息。

Bash

--node.name NAME  #指定此Logstash实例的名称。 如果没有赋值,它将默认为当前主机名。
-f, --path.config CONFIG_PATH   #从特定文件或目录加载Logstash配置。 如果给出了一个目录,那么该目录中的所有文件将按字典顺序连接,然后解析为一个配置文件。 不支持多次指定此标志。 如果多次指定此标志,则Logstash会使用最后一次出现(例如,-f foo -f bar与-f bar相同)。
#你可以指定通配符(globs),任何匹配的文件将按照上面描述的顺序加载。 例如,您可以使用通配符功能按名称加载特定文件:bin/logstash --debug -f '/tmp/{one,two,three}'使用此命令,Logstash会连接三个配置文件/tmp/one,/tmp/two和/tmp/three,并将其解析为单个配置。
-e, --config.string CONFIG_STRING   #使用给定的字符串作为配置数据。 与配置文件相同的语法。 如果没有指定输入,则使用以下内容作为默认输入:input {stdin {type => stdin}},如果没有指定输出,则使用以下内容作为默认输出:output {stdout {codec => rubydebug}}。 如果您希望使用这两个默认值,请使用-e标志的空字符串。 缺省值是零。
--modules  #启动指定的模块。 与-M选项一起使用可将值分配给指定模块的默认变量。 如果在命令行中使用了--modules,那么logstash.yml中的任何模块都将被忽略,其中的任何设置都将被忽略。 这个标志与-f和-e标志是互斥的。 只能指定-f,-e或--modules之一。 可以通过用逗号分隔多个模块,或通过多次调用--modules标志来指定多个模块
-M, --modules.variable   #为模块的可配置选项分配一个值。 对于Logstash变量,赋值变量的格式是-M“MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.KEY_NAME = value”。 对于其他设置,它将是-M“MODULE_NAME.KEY_NAME.SUB_KEYNAME =值”。 -M标志可以根据需要多次使用。 如果未指定-M选项,则将使用该设置的默认值。 -M标志仅与--modules标志结合使用。 如果--modules标志不存在,它将被忽略。
-w, --pipeline.workers COUNT  #设置要运行的管道worker的数量。 此选项设置将并行执行管道的过滤和输出阶段的工作人员数量。 如果发现事件正在备份,或CPU未饱和,请考虑增加此数字以更好地利用机器处理能力。 默认值是主机CPU内核的数量。
-b, --pipeline.batch.size SIZE  #该选项定义了在尝试执行过滤器和输出之前,单个工作线程从输入中收集的最大事件数量。 默认是125个事件。 较大的批量大小一般来说效率更高,但是以增加的内存开销为代价。 您可能必须通过设置LS_HEAP_SIZE变量来有效使用该选项来增加JVM堆大小。
-u, --pipeline.batch.delay DELAY_IN_MS  #在创建管道批次时,轮询下一个事件需要多长时间。 此选项定义在将过小的批次分配给过滤器和工作人员之前轮询下一个事件时需要等待多长时间(以毫秒为单位)。 默认是250ms。
--pipeline.unsafe_shutdown   #强制Logstash在关机过程中退出,即使内存中仍存在飞行事件。 默认情况下,Logstash将拒绝退出,直到所有收到的事件都被推送到输出。 启用此选项可能会导致关机期间数据丢失。
--path.data PATH     #这应该指向一个可写的目录。 Logstash会在需要存储数据时使用这个目录。 插件也可以访问这个路径。 默认值是Logstash home下的数据目录。
-p, --path.plugins PATH   #一个找到自定义插件的路径。 这个标志可以多次给定,以包含多个路径。 预期插件位于特定的目录层次结构中:PATH/logstash/TYPE/NAME.rb其中TYPE是输入,过滤器,输出或编解码器,NAME是插件的名称。
-l, --path.logs PATH   #目录将Logstash内部日志写入。
--log.level LEVEL   #设置Logstash的日志级别。 可能的值是:fatal,error,warn,info,debug,trace
--config.debug   #将完全编译的配置显示为调试日志消息(您还必须启用--log.level = debug)。 警告:日志消息将包括以明文形式传递给插件配置的所有密码选项,并可能导致明文密码出现在您的日志中!
-i, --interactive SHELL   #Drop to shell instead of running as normal. Valid shells are "irb" and "pry".
-V, --version   #版本信息
-t, --config.test_and_exit  #检查配置的有效语法,然后退出。 请注意,grok模式不检查与此标志的正确性。 Logstash可以从目录中读取多个配置文件。 如果将此标志与--log.level = debug结合使用,则Logstash将记录组合的配置文件,并使用它来自的源文件注释每个配置块。
-r, --config.reload.automatic   #监视配置更改,并在配置更改时重新加载。 注:使用SIGHUP手动重新加载配置。 默认值是false。
--config.reload.interval RELOAD_INTERVAL   #轮询轮询配置位置以进行更改的频率。 默认值是“3s”。
--http.host HTTP_HOST   #Web API绑定主机。 此选项指定度量标准REST端点的绑定地址。 默认值是“127.0.0.1”。
--http.port HTTP_PORT   #Web API http端口。 此选项为指标REST端点指定绑定端口。 默认是9600-9700。 该设置接受9600-9700格式的范围。 Logstash会拿起第一个可用的端口。
--log.format FORMAT    #指定Logstash是否应以JSON形式(每行一个事件)或纯文本(使用Ruby的Object#inspect)编写自己的日志。 默认是“plain”。
--path.settings SETTINGS_DIR   #设置包含logstash.yml设置文件的目录以及log4j日志记录配置。 这也可以通过LS_SETTINGS_DIR环境变量来设置。 默认是Logstash home下的config目录
-h, --help   #打印帮助

3.2 Logging

要检索运行时可用的日志记录子系统列表,可以对_node / logging进行GET请求:

Bash

curl -XGET 'localhost:9600/_node/logging?pretty'

官网链接:https://www.elastic.co/guide/en/logstash/current/logging.html

#另外关闭Logstash的命令:

Bash

kill -TERM {logstash_pid}

当你试图关闭Logstash实例运行,Logstash执行几个步骤才能安全地关闭。 它必须:

Bash

停止所有输入,滤波器和输出插件
处理所有飞行事件
终止Logstash过程

四、配置Logstash

4.1 配置文件结构

Logstash配置文件为要添加到事件处理管道的每种类型的插件都有一个单独的部分。 例如:

Bash

# This is a comment. You should use comments to describe
# parts of your configuration.
input {
  ...
}
filter {
  ...
}
output {
  ...
}

#每个部分都包含一个或多个插件的配置选项。 如果指定了多个过滤器,则会按照它们在配置文件中的显示顺序应用它们。

插件配置

      插件的配置由插件名称和插件的一个设置块组成。 例如,这个输入部分配置两个文件输入:

Bash

input {
  file {
    path => "/var/log/messages"
    type => "syslog"
  }

  file {
    path => "/var/log/apache/access.log"
    type => "apache"
  }
}

Value Types

        一个插件可以要求设置的值是一个特定的类型,比如布尔值,列表或哈希值。 以下值类型受支持。

Array  : 

这种类型现在大多被弃用,倾向于使用标准类型如字符串与插件定义:list => true属性更好的类型检查。 仍然需要处理不需要类型检查的散列或混合类型列表。

Lists:不是一个类型本身,而是一个属性类型。这使得对多个值进行类型检查成为可能。插件作者可以通过指定:list => true在声明参数时启用列表检查。例如:

Bash

  path => [ "/var/log/messages", "/var/log/*.log" ]
  uris => [ "http://elastic.co", "http://example.net" ]

#这个例子配置路径,这是一个字符串,它是一个包含三个字符串中的每一个元素的列表。 它还会将uris参数配置为URI列表,如果提供的任何URI无效,则失败。

Boolean : 

布尔值必须是true或false。 请注意,true和false关键字不包含在引号中。

Bytes:

字节字段是表示有效字节单位的字符串字段。 在插件选项中声明特定大小是一种方便的方法。 支持SI(k M G T P E Z Y)和二进制(Ki Mi Gi Ti Pi Ei Zi Yi)单元。 二进制单位以1024为底,SI单位以1000为底。 该字段不区分大小写,并且接受值和单位之间的空格。 如果没有指定单位,则整数字符串表示字节数。例如:

Bash

  my_bytes => "1113"   # 1113 bytes
  my_bytes => "10MiB"  # 10485760 bytes
  my_bytes => "100kib" # 102400 bytes
  my_bytes => "180 mb" # 180000000 bytes

Codec:

编解码器是用于表示数据的Logstash编解码器的名称。 编解码器可用于输入和输出。输入编解码器提供了一种方便的方式来解码数据,然后再进入输入。 输出编解码器提供了一种在数据离开输出之前进行编码的便捷方式。 使用输入或输出编解码器,无需在Logstash管道中使用单独的过滤器。可用编解码器的列表可以在编解码器插件页面找到。例如:

Bash

codec => "json"

Hash:

散列是以“field1”=>“value1”格式指定的键值对的集合。 请注意,多个键值条目由空格而不是逗号分隔。例:

Bash

match => {
  "field1" => "value1"
  "field2" => "value2"
  ...
}

Number:

数字必须是有效的数值(浮点或整数)。例:

Bash

port => 33

Password:

密码是一个没有记录或打印的单个值的字符串。例:

Bash

my_password => "password"

URI:

URI可以是像http://elastic.co/这样的完整URL,也可以是简单的标识符,比如foobar。 如果URI包含诸如http://user:pass@example.net之类的密码,则不会记录或打印URI的密码部分。例:

Bash

 my_uri => "http://foo:bar@example.net"

Path:

路径是表示有效的操作系统路径的字符串。例:

Bash

 my_path => "/tmp/logstash"

String:

一个字符串必须是单个字符序列。 请注意,字符串值用双引号或单引号引起来。

转义序列:

默认情况下,转义序列没有启用。 如果你想在引用的字符串中使用转义序列,你需要在logstash.yml中设置config.support_escapes:true。 如果是true,引用的字符串(双精度和单精度)将会有这样的转换:

Bash

\r  #回车(ASCII 13)

\n   #新行(ASCII 10)

\t   #Tab(ASCII 9)

\\   #反斜杠(ASCII 92)

\”  #双引号(ASCII 34)

\'  #单引号(ASCII 39)

例如:

Bash

name => "Hello world"
name => 'It\'s a beautiful day'

注释与perl,ruby和python相同。 评论以#开头,不需要在行首。 例如:

Bash

# this is a comment

input { # comments can appear at the end of a line, too
  # ...
}

4.2 访问配置中的事件数据和字段

       logstash agent是一个具有3个阶段的处理流水线:输入→过滤器→输出。 输入生成事件,过滤器修改它们,输出将其发送到别处。所有事件都有属性。 例如,apache访问日志会包含状态代码(200,404),请求路径(“/”,“index.html”),HTTP动词(GET,POST),客户端IP地址等.Logstash调用这些 属性“字段”。

        Logstash中的一些配置选项需要存在字段才能运行。 因为输入会生成事件,所以在输入块中没有要评估的字段 - 它们还不存在!由于它们依赖于事件和字段,以下配置选项只能在过滤器和输出块中使用。

下面介绍的字段引用,sprintf格式和条件在输入块中不起作用。

字段参考:

      能够通过名称来引用字段通常是有用的。 为此,可以使用Logstash字段引用语法。访问字段的语法是[fieldname]。 如果您指的是顶级字段,则可以省略[]并简单地使用字段名称。 要引用嵌套字段,请指定该字段的完整路径:[top-level field] [nested field]。

      例如,以下事件有五个顶级字段(agent,ip,request,response,ua)和三个嵌套字段(status,bytes,os)。

Bash

{
  "agent": "Mozilla/5.0 (compatible; MSIE 9.0)",
  "ip": "192.168.24.44",
  "request": "/index.html"
  "response": {
    "status": 200,
    "bytes": 52353
  },
  "ua": {
    "os": "Windows 7"
  }
}

#要引用os字段,请指定[ua] [os]。 要引用顶级字段(如请求),只需指定字段名称即可。

sprintf格式

      Logstash调用sprintf格式时也使用字段引用格式。 这种格式使您能够从其他字符串中引用字段值。 例如,statsd输出有一个增量设置,使您可以通过状态代码保留apache日志的计数:

Bash

output {
  statsd {
    increment => "apache.%{[response][status]}"
  }
}

      同样,您可以将@timestamp字段中的时间戳转换为字符串。 而不是在大括号内指定一个字段名称,使用FORMAT是一个时间格式的+ FORMAT语法。例如,如果要使用文件输出来根据事件的日期和小时以及类型字段写入日志

Bash

output {
  file {
    path => "/var/log/%{type}.%{+yyyy.MM.dd.HH}"
  }
}

条件语句

      有时你只想在某些条件下过滤或输出一个事件。 为此,您可以使用条件。Logstash中的条件与编程语言中的条件相同。 条件支持if,else if和else语句可以嵌套。条件语法是:

Bash

if EXPRESSION {
  ...
} else if EXPRESSION {
  ...
} else {
  ...
}

什么是表达? 比较测试,布尔逻辑等等!您可以使用以下比较运算符:

Bash

比较:==,!=,<,>,<=,> =
正则表达式:=〜,!〜(检查左侧的字符串值的模式)
包含:in,not in

支持的布尔运算符是:

Bash

and, or, nand, xor

支持的一元运算符是:

Bash

!

表达式可以是漫长而复杂的。 表达式可以包含其他表达式,可以用!来否定表达式,并且可以用圆括号(...)对它们进行分组。例如,如果字段操作具有登录值,则以下条件使用mutate过滤器来删除字段密钥:

Bash

filter {
  if [action] == "login" {
    mutate { remove_field => "secret" }
  }
}

可以在单个条件中指定多个表达式:

Bash

output {
  # Send production errors to pagerduty
  if [loglevel] == "ERROR" and [deployment] == "production" {
    pagerduty {
    ...
    }
  }
}

可以使用in运算符来测试某个字段是否包含特定的字符串,键或(用于列表)元素:

Bash

filter {
  if [foo] in [foobar] {
    mutate { add_tag => "field in field" }
  }
  if [foo] in "foo" {
    mutate { add_tag => "field in string" }
  }
  if "hello" in [greeting] {
    mutate { add_tag => "string in field" }
  }
  if [foo] in ["hello", "world", "foo"] {
    mutate { add_tag => "field in list" }
  }
  if [missing] in [alsomissing] {
    mutate { add_tag => "shouldnotexist" }
  }
  if !("foo" in ["hello", "world"]) {
    mutate { add_tag => "shouldexist" }
  }
}

用条件不一样的方式。 例如,当grok成功时,您可以不使用它仅将事件路由到Elasticsearch。

Bash

output {
  if "_grokparsefailure" not in [tags] {
    elasticsearch { ... }
  }
}

可以检查是否存在特定的字段,但目前无法区分不存在的字段与简单的假字段。 表达式if [foo]在下列情况下返回false:

Bash

事件中不存在[foo]
[foo]存在于事件中,但是是假的,或者
事件中存在[foo],但为空

@metadata字段

      在Logstash 1.5及更高版本中,有一个称为@metadata的特殊字段。 @metadata的内容在输出时不会成为你的任何事件的一部分,这使得它很适合用于条件,或者扩展和构建带有字段引用和sprintf格式的事件字段。

     以下配置文件将从STDIN中产生事件。 无论输入什么,都将成为赛事的信息领域。 过滤器块中的mutate事件将添加一些嵌套在@metadata字段中的字段。

Bash

input { stdin { } }

filter {
  mutate { add_field => { "show" => "This data will be in the output" } }
  mutate { add_field => { "[@metadata][test]" => "Hello" } }
  mutate { add_field => { "[@metadata][no_show]" => "This data will not be in the output" } }
}

output {
  if [@metadata][test] == "Hello" {
    stdout { codec => rubydebug }
  }
}

查看下输出:

Bash

$ bin/logstash -f ../test.conf
Pipeline main started
asdf
{
    "@timestamp" => 2016-06-30T02:42:51.496Z,
      "@version" => "1",
          "host" => "example.com",
          "show" => "This data will be in the output",
       "message" => "asdf"
}

 

      输入的“asdf”成为消息字段内容,并且条件成功地评估了嵌套在@metadata字段中的测试字段的内容。 但是输出没有显示一个名为@metadata的字段或其内容。rubydebug编解码器允许您在添加配置标志metadata => true的情况下显示@metadata字段的内容:

Bash

stdout { codec => rubydebug { metadata => true } }

查看输出的改变:

Bash

$ bin/logstash -f ../test.conf
Pipeline main started
asdf
{
    "@timestamp" => 2016-06-30T02:46:48.565Z,
     "@metadata" => {
           "test" => "Hello",
        "no_show" => "This data will not be in the output"
    },
      "@version" => "1",
          "host" => "example.com",
          "show" => "This data will be in the output",
       "message" => "asdf"
}

#只有rubydebug编码器允许显示@ metadata字段的内容。

      每当你需要一个临时的字段,但不希望它在最终的输出中时,使用@metadata字段。也许这个新的领域最常见的用例之一是日期过滤器,并有一个临时的时间戳。这个配置文件已被简化,但是使用Apache和Nginx Web服务器通用的时间戳格式。 过去,在使用它来覆盖@timestamp字段之后,您必须自己删除时间戳字段。 使用@metadata字段,这不再是必要的:

Bash

input { stdin { } }

filter {
  grok { match => [ "message", "%{HTTPDATE:[@metadata][timestamp]}" ] }
  date { match => [ "[@metadata][timestamp]", "dd/MMM/yyyy:HH:mm:ss Z" ] }
}

output {
  stdout { codec => rubydebug }
}

请注意,此配置会将提取的日期放入Grok过滤器的[@metadata] [timestamp]字段中。 让我们给这个配置一个样本日期字符串,看看结果如何:

Bash

$ bin/logstash -f ../test.conf
Pipeline main started
02/Mar/2014:15:36:43 +0100
{
    "@timestamp" => 2014-03-02T14:36:43.000Z,
      "@version" => "1",
          "host" => "example.com",
       "message" => "02/Mar/2014:15:36:43 +0100"
}

输出中没有额外的字段,也没有清洁的配置文件,因为您不必在日期过滤器中转换之后删除“时间戳”字段。另一个用例是CouchDB Changes输入插件(请参阅https://github.com/logstash-plugins/logstash-input-couchdb_changes)。 该插件自动将CouchDB文档字段元数据捕获到输入插件本身的@metadata字段中。 当事件通过Elasticsearch索引时,Elasticsearch输出插件允许您指定动作(删除,更新,插入等)和document_id,如下所示:

Bash

output {
  elasticsearch {
    action => "%{[@metadata][action]}"
    document_id => "%{[@metadata][_id]}"
    hosts => ["example.com"]
    index => "index_name"
    protocol => "http"
  }
}

4.3 在配置中使用环境变量

概述

Bash

可以使用${var}在Logstash插件的配置中设置环境变量引用。
在Logstash启动时,每个引用将被替换为环境变量的值。
替换是区分大小写的。
引用未定义的变量会引起Logstash配置错误。
可以使用${var:default value}的形式给出一个默认值。 如果环境变量未定义,Logstash使用默认值。
可以在任何插件选项类型中添加环境变量引用:string, number, boolean, array, or hash。
环境变量是不可变的。 如果更新环境变量,则必须重新启动Logstash才能获取更新后的值。

以下示例显示如何使用环境变量设置一些常用配置选项的值。

Setting the TCP Port

以下是使用环境变量设置TCP端口的示例:

Bash

input {
  tcp {
    port => "${TCP_PORT}"
  }
}

现在我们来设置TCP_PORT的值:

Bash

export TCP_PORT=12345

启动时,Logstash使用以下配置:

Bash

input {
  tcp {
    port => 12345
  }
}

如果未设置TCP_PORT环境变量,Logstash将返回配置错误。可以通过指定一个默认值来解决这个问题:

Bash

input {
  tcp {
    port => "${TCP_PORT:54321}"
  }
}

现在,如果变量未定义,而不是返回配置错误,Logstash使用默认值:

Bash

input {
  tcp {
    port => 54321
  }
}

#如果定义了环境变量,Logstash将使用为变量指定的值而不是缺省值。

Setting the Value of a Tag

以下是一个使用环境变量设置标签值的示例:

Bash

filter {
  mutate {
    add_tag => [ "tag1", "${ENV_TAG}" ]
  }
}

来设置ENV_TAG的值:

Bash

export ENV_TAG="tag2"

启动时,Logstash使用以下配置:

Bash

filter {
  mutate {
    add_tag => [ "tag1", "tag2" ]
  }
}

设置文件路径

以下是使用环境变量设置日志文件路径的示例:

Bash

filter {
  mutate {
    add_field => {
      "my_path" => "${HOME}/file.log"
    }
  }
}

来设置HOME的值:

Bash

export HOME="/path"

启动时,Logstash使用以下配置:

Bash

filter {
  mutate {
    add_field => {
      "my_path" => "/path/file.log"
    }
  }
}

4.4 配置示例

使用条件

      使用条件来控制过滤器或输出处理的事件。 例如,您可以根据每个事件出现在哪个文件(access_log,error_log和其他以“log”结尾的随机文件)来标记每个事件。

Bash

input {
  file {
    path => "/tmp/*_log"
  }
}

filter {
  if [path] =~ "access" {
    mutate { replace => { type => "apache_access" } }
    grok {
      match => { "message" => "%{COMBINEDAPACHELOG}" }
    }
    date {
      match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
    }
  } else if [path] =~ "error" {
    mutate { replace => { type => "apache_error" } }
  } else {
    mutate { replace => { type => "random_logs" } }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

#此示例使用类型字段标记所有事件,但实际上不分析错误或随机文件。 有很多类型的错误日志,他们应该如何标记真正取决于你正在使用的日志。同样,可以使用条件将事件定向到特定的输出。 例如,您可以:

Bash

状态为5xx的任何apache事件的alert nagios
将任何4xx状态记录到Elasticsearch
通过statsd记录所有的状态码命中

      要告诉nagios任何具有5xx状态码的http事件,首先需要检查type字段的值。 如果是apache,那么可以检查状态字段是否包含5xx错误。 如果是,请将其发送给nagios。 如果不是5xx错误,请检查状态字段是否包含4xx错误。 如果是的话,把它发送给Elasticsearch。 最后,无论状态字段包含什么,都将所有的apache状态码发送到statsd:

Bash

output {
  if [type] == "apache" {
    if [status] =~ /^5\d\d/ {
      nagios { ...  }
    } else if [status] =~ /^4\d\d/ {
      elasticsearch { ... }
    }
    statsd { increment => "apache.%{status}" }
  }
}

处理Syslog消息

      Syslog是Logstash最常见的用例之一,它处理得非常好(只要日志行大致符合RFC3164)。 Syslog是事实上的UNIX联网日志记录标准,通过rsyslog将消息从客户端机器发送到本地文件或发送到集中式日志服务器。 对于这个例子,你将不需要一个正常工作的系统日志实例; 我们将从命令行中伪造它,以便您了解发生的情况。首先,我们为Logstash + syslog创建一个简单的配置文件,名为logstash-syslog.conf。

Bash

input {
  tcp {
    port => 5000
    type => syslog
  }
  udp {
    port => 5000
    type => syslog
  }
}

filter {
  if [type] == "syslog" {
    grok {
      match => { "message" => "%{SYSLOGTIMESTAMP:syslog_timestamp} %{SYSLOGHOST:syslog_hostname} %{DATA:syslog_program}(?:\[%{POSINT:syslog_pid}\])?: %{GREEDYDATA:syslog_message}" }
      add_field => [ "received_at", "%{@timestamp}" ]
      add_field => [ "received_from", "%{host}" ]
    }
    date {
      match => [ "syslog_timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
    }
  }
}

output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

用这个新配置运行Logstash:

Bash

bin/logstash -f logstash-syslog.conf

通常,客户端机器将连接到端口5000上的Logstash实例并发送其消息。 在这个例子中,我们将telnet到Logstash并输入一个日志行(类似于我们之前在日志中输入日志行的方式)。 打开另一个shell窗口与Logstash syslog输入交互并输入以下命令:

Bash

telnet localhost 5000

复制并粘贴以下行作为示例。 (随意尝试一些你自己的,但请记住,如果grok过滤器不正确的数据,他们可能不会解析)。

Bash

Dec 23 12:11:43 louis postfix/smtpd[31499]: connect from unknown[95.75.93.154]
Dec 23 14:42:56 louis named[16000]: client 199.48.164.7#64817: query (cache) 'amsterdamboothuren.com/MX/IN' denied
Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)
Dec 22 18:28:06 louis rsyslogd: [origin software="rsyslogd" swVersion="4.2.0" x-pid="2253" x-info="http://www.rsyslog.com"] rsyslogd was HUPed, type 'lightweight'.

现在,您应该在原始shell中看到Logstash的输出,因为它处理和分析消息!

Bash

{
                 "message" => "Dec 23 14:30:01 louis CRON[619]: (www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",
              "@timestamp" => "2013-12-23T22:30:01.000Z",
                "@version" => "1",
                    "type" => "syslog",
                    "host" => "0:0:0:0:0:0:0:1:52617",
        "syslog_timestamp" => "Dec 23 14:30:01",
         "syslog_hostname" => "louis",
          "syslog_program" => "CRON",
              "syslog_pid" => "619",
          "syslog_message" => "(www-data) CMD (php /usr/share/cacti/site/poller.php >/dev/null 2>/var/log/cacti/poller-error.log)",
             "received_at" => "2013-12-23 22:49:22 UTC",
           "received_from" => "0:0:0:0:0:0:0:1:52617",
    "syslog_severity_code" => 5,
    "syslog_facility_code" => 1,
         "syslog_facility" => "user-level",
         "syslog_severity" => "notice"
}

4.5 多个Pipelines

       如果您需要在同一进程中运行多个管道,Logstash提供了一种通过名为pipelines.yml的配置文件来完成此操作的方法。 该文件必须放置在path.settings文件夹中,并遵循以下结构:

Bash

- pipeline.id: my-pipeline_1
  path.config: "/etc/path/to/p1.config"
  pipeline.workers: 3
- pipeline.id: my-other-pipeline
  path.config: "/etc/different/path/p2.cfg"
  queue.type: persisted

      该文件在YAML中格式化,并包含一个字典列表,其中每个字典描述一个管道,每个键/值对指定该管道的设置。 该示例显示了由它们的ID和配置路径描述的两个不同的管道。 对于第一个管道,pipeline.workers的值设置为3,而另一个则启用持续队列功能。 未在pipelines.yml文件中明确设置的设置的值将回退到logstash.yml设置文件中指定的默认值。

      在不带参数的情况下启动Logstash时,它将读取pipelines.yml文件并实例化文件中指定的所有管道。 另一方面,当使用-e或-f时,Logstash会忽略pipelines.yml文件并记录警告。

使用注意事项

      如果当前的配置具有不共享相同inputs/filters and outputs并且使用标记和条件相互分离的事件流,则使用多个管道尤其有用。 在单个实例中具有多个管道还允许这些事件流具有不同的性能和持久性参数(例如,different settings for pipeline workers and persistent queues)。这种分离意味着一个管道中的阻塞输出不会对另一个管道产生反压力。

     也就是说,考虑到管道之间的资源竞争是重要的,因为默认值是针对单一管道进行调整的。 因此,例如,考虑减少每个管道使用的管道工的数量,因为每个管道默认使用每个CPU核心1个worker。

     持久队列和死信队列在每个流水线上是隔离的,它们的位置由pipeline.id值隔开。

4.6 重新加载配置文件

      从Logstash 2.3开始,可以将Logstash设置为自动检测并重新加载配置更改。要启用自动配置重新加载,请使用指定的--config.reload.automatic(或-r)命令行选项启动Logstash。 例如:

Bash

bin/logstash -f apache.config --config.reload.automatic

#指定-e标志从命令行传入配置设置时,--config.reload.automatic选项不可用。

      默认情况下,Logstash每3秒检查一次配置更改。 要更改此间隔,请使用--config.reload.interval <interval>选项,其中interval指定Logstash检查配置文件的更改频率。

      如果Logstash已经在没有启用自动重新加载的情况下运行,您可以强制Logstash重新加载配置文件,并通过向运行Logstash的进程发送SIGHUP(信号挂起)重新启动管道。 例如:

Bash

kill -1 14175   #其中14175是运行Logstash的进程的ID。

自动配置重新加载如何工作

       当Logstash在配置文件中检测到更改时,它会通过停止所有输入来停止当前管道,并尝试创建使用更新配置的新管道。 验证新配置的语法后,Logstash将验证是否可以初始化所有输入和输出(例如,所有需要的端口均已打开)。 如果检查成功,则Logstash将使用新管道交换现有管道。 如果检查失败,则旧的管道将继续运行,并将错误传播到控制台。

      在自动配置重新加载期间,JVM不会重新启动。 管道的创建和交换都发生在同一个过程中。

      Grok模式文件的更改也会重新加载,但只有当配置文件中的更改触发重新加载(或重新启动管道)时才会重新加载。

4.7 管理多行事件

       几个用例生成跨越多行文本的事件。 为了正确处理这些多行事件,Logstash需要知道如何判断哪些行是单个事件的一部分。多线事件处理是复杂的,并依赖于适当的事件排序。 保证有序日志处理的最好方法就是尽可能早地实现处理。多行编解码器是处理Logstash流水线中多行事件的首选工具。 多行编解码器使用一组简单的规则合并来自单个输入的行。

       如果正在使用支持多个主机的Logstash输入插件(如beats输入插件),则不应使用多行编解码器来处理多行事件。 这样做可能会导致混合的流和损坏的事件数据。 在这种情况下,您需要在将事件数据发送到Logstash之前处理多行事件。

配置多线编解码器最重要的方面如下:

Bash

pattern选项指定一个正则表达式。 与指定的正则表达式匹配的行被认为是前一行的延续或新的多行事件的开始。 可以使用grok正则表达式模板与此配置选项。
什么选项有两个值:previous or next。 previous的值指定与pattern选项中的值匹配的行是上一行的一部分。 next值指定与pattern选项中的值匹配的行是以下行的一部分* negate选项将多行编解码器应用于与pattern选项中指定的正则表达式不匹配的行。

#有关配置选项的更多信息,请参阅多线编解码器插件的完整文档(https://www.elastic.co/guide/en/logstash/current/plugins-codecs-multiline.html)。

多线编解码器配置示例

本节中的示例涵盖以下用例:

Bash

将Java堆栈跟踪组合成一个事件
将C风格的线条连续组合成一个单独的事件
结合时间戳事件的多行

Java stack traces:

Java堆栈跟踪由多行组成,每行以最后一行开头,如下例所示:

Bash

Exception in thread "main" java.lang.NullPointerException
        at com.example.myproject.Book.getTitle(Book.java:16)
        at com.example.myproject.Author.getBookTitles(Author.java:25)
        at com.example.myproject.Bootstrap.main(Bootstrap.java:14)

要将这些行整合到Logstash中的单个事件中,请对多行编解码器使用以下配置:

Bash

input {
  stdin {
    codec => multiline {
      pattern => "^\s"
      what => "previous"
    }
  }
}

#此配置将以空格开头的所有行合并到上一行。

线路延续

几种编程语言使用行尾的\字符来表示该行继续,如下例所示:

Bash

printf ("%10.10ld  \t %10.10ld \t %s\
  %f", w, x, y, z );

要将这些行整合到Logstash中的单个事件中,请对多行编解码器使用以下配置:

Bash

input {
  stdin {
    codec => multiline {
      pattern => "\\$"
      what => "next"
    }
  }
}

#此配置将以\字符结尾的任何行与以下行合并。

Timestamps(时间戳)

来自Elasticsearch等服务的活动日志通常以时间戳开始,然后是关于特定活动的信息,如下例所示:

Bash

[2015-08-24 11:49:14,389][INFO ][env                      ] [Letha] using [1] data paths, mounts [[/
(/dev/disk1)]], net usable_space [34.5gb], net total_space [118.9gb], types [hfs]

要将这些行整合到Logstash中的单个事件中,请对多行编解码器使用以下配置:

Bash

input {
  file {
    path => "/var/log/someapp.log"
    codec => multiline {
      pattern => "^%{TIMESTAMP_ISO8601} "
      negate => true
      what => previous
    }
  }
}

#此配置使用negate选项来指定任何不以时间戳开头的行都属于previous。

4.8 Glob Pattern Support

Logstash在允许使用全局模式的地方支持以下模式:

Bash

*  #匹配任何文件。也可以使用*来限制glob中的其他值。例如,*conf匹配以conf结尾的所有文件。 *apache*在名称中匹配任何带有apache的文件。这种模式与类Unix操作系统上的隐藏文件(点文件)不匹配。 要匹配点文件,请使用{*,.*}之类的模式。
**  #以递归方式匹配目录。
?  #匹配任何一个字符。
[set]  #匹配集合中的任何一个字符。例如,[a-z]。还支持设置否定([^a-z])。
{p,q}   #匹配文字p或文字q。匹配的文字可以是多个字符,并且可以指定两个以上的文字。这种模式相当于在正则表达式(foo|bar)中使用垂直条的交替。
\     #转义下一个元字符。这意味着您不能在Windows中使用反斜杠作为glob的一部分。模式c:\foo*将不起作用,所以请使用foo*。

示例:

Bash

"/path/to/*.conf"   #匹配指定路径中以.conf结尾的配置文件。
"/var/log/*.log"    #在指定的路径中匹配以.log结尾的日志文件。
"/var/log/**/*.log  #匹配以指定路径下的子目录中的.log结尾的日志文件。
"/path/to/logs/{app1,app2,app3}/data.log"   #匹配指定路径下的app1,app2和app3子目录中的应用程序日志文件。

4.9 转换摄取节点管道

     在实现接收管道来分析数据之后,可能会决定要利用Logstash中更丰富的转换功能。 例如,如果想要,可能需要使用Logstash而不是ingest (https://www.elastic.co/guide/en/elasticsearch/reference/6.0/ingest.html)pipelines:

Bash

从更多的输入中获取。Logstash可以从其他许多来源(如TCP,UDP,syslog和关系数据库)本地获取数据。
使用多个输出。摄取节点被设计为仅支持Elasticsearch作为输出,但可能需要使用多个输出。例如,可能想要将传入数据存档到S3以及在Elasticsearch中编制索引。
利用Logstash中更丰富的转换功能,例如外部查找。
使用持续队列功能来处理数据摄取时(来自Beats和其他来源)。

      为了使您更容易地迁移配置,Logstash提供了一个摄取管道转换工具。 转换工具将采集管道定义作为输入,并在可能的情况下创建等效的Logstash配置作为输出。

运行该工具

     可以在Logstash安装的bin目录中找到转换工具。 要运行转换工具,请使用以下命令:

Bash

bin/ingest-convert.sh --input INPUT_FILE_URI --output OUTPUT_FILE_URI [--append-stdio]
#INPUT_FILE_URI是一个文件URI,它指定了定义导入节点管道的JSON文件的完整路径。
#OUTPUT_FILE_URI是将由工具生成的Logstash DSL文件的文件URI。--append-stdio是一个可选标志,它将stdin和stdout部分添加到配置中,而不是添加默认的Elasticsearch输出。

      此命令需要一个文件URI,因此请确保使用正斜杠并指定文件的完整路径。例如:

Bash

bin/ingest-convert.sh --input file:///tmp/ingest/apache.json --output file:///tmp/ingest/apache.conf

限制

Bash

不支持Painless script转换。
只有可用的处理器子集支持转换。对于不支持的处理器,该工具会发出警告并继续进行最佳转换。

支持的处理器

当前工具支持以下接收节点处理器进行转换:

Bash

Append
Convert
Date
GeoIP
Grok
Gsub
Json
Lowercase
Rename
Set

博文来自:www.51niux.com

五、Data Resiliency

       当数据流经事件处理管道时,Logstash可能会遇到阻止将事件传递到配置的输出的情况。 例如,数据可能包含意外的数据类型,或者Logstash可能异常终止。

       为了防止数据丢失并确保事件不间断地流经管道,Logstash提供了以下数据弹性功能。

       (Persistent Queues)持久性队列通过将事件存储在磁盘上的内部队列中来防止数据丢失。

      (Dead Letter Queues)死信队列为Logstash无法处理的事件提供磁盘存储。 可以使用dead_letter_queue输入插件轻松重新处理死信队列中的事件。

       这些弹性功能在默认情况下是禁用的。 要打开这些功能,您必须在Logstash设置文件中明确启用它们。

5.1 持久队列Persistent Queues

官网链接:https://www.elastic.co/guide/en/logstash/current/persistent-queues.html

5.2 Dead Letter Queues

官网链接:https://www.elastic.co/guide/en/logstash/current/dead-letter-queues.html

六、转换数据

       在Logstash插件生态系统中有超过200个插件,选择最好的插件来满足您的数据处理需求有时是一个挑战。 在本节中,我们收集了一些流行的插件列表,并根据其处理能力对其进行组织:

6.1 执行核心操作

date filter

从字段解析日期以用作事件的Logstash时间戳。以下配置解析名为logdate的字段以设置Logstash时间戳:

Bash

filter {
  date {
    match => [ "logdate", "MMM dd yyyy HH:mm:ss" ]
  }
}

drop filter

Drops事件。该过滤器通常与条件结合使用。以下配置将删除调试级别的日志消息:

Bash

filter {
  if [loglevel] == "debug" {
    drop { }
  }
}

fingerprint filter

Fingerprints fields 通过应用一致的散列。以下配置指纹IP,@timestamp和message字段,并将该散列添加到名为generated_id的元数据字段中:

Bash

filter {
  fingerprint {
    source => ["IP", "@timestamp", "message"]
    method => "SHA1"
    key => "0123"
    target => "[@metadata][generated_id]"
  }
}

mutate filter

在字段上执行常规突变。 可以重命名,删除,替换和修改事件中的字段。以下配置将HOSTORIP字段重命名为client_ip:

Bash

filter {
  mutate {
    rename => { "HOSTORIP" => "client_ip" }
  }
}

ruby filter

执行Ruby代码。以下配置执行取消90%事件的Ruby代码:

Bash

filter {
  ruby {
    code => "event.cancel if rand <= 0.90"
  }
}

6.2 反序列化数据

avro codec

       将序列化的Avro记录作为Logstash事件读取。 这个插件反序列化个别Avro记录。 这不适用于阅读Avro文件。 Avro文件具有必须在输入时处理的唯一格式。以下配置反序列化来自Kafka的输入:

Bash

input {
  kafka {
    codec => {
      avro => {
        schema_uri => "/tmp/schema.avsc"
      }
    }
  }
}
...

csv filter

       将逗号分隔的值数据分析为单个字段。 默认情况下,筛选器自动生成字段名称(column1,column2等),或者可以指定一个名称列表。 您也可以更改列分隔符。以下配置将CSV数据分析为列字段中指定的字段名称:

Bash

filter {
  csv {
    separator => ","
    columns => [ "Transaction Number", "Date", "Description", "Amount Debit", "Amount Credit", "Balance" ]
  }
}

json codec

      解码(通过输入)并编码(通过输出)JSON格式的内容,在JSON数组中为每个元素创建一个事件。以下配置解码文件中的JSON格式的内容:

Bash

input {
  file {
    path => "/path/to/myfile.json"
    codec =>"json"
}

protobuf codec

       读取protobuf编码的消息并将其转换为Logstash事件。 需要将protobuf定义编译为Ruby文件。 您可以使用ruby-protoc编译器来编译它们。以下配置解码来自Kafka流的事件:

Bash

input
  kafka {
    zk_connect => "127.0.0.1"
    topic_id => "your_topic_goes_here"
    codec => protobuf {
      class_name => "Animal::Unicorn"
      include_path => ['/path/to/protobuf/definitions/UnicornProtobuf.pb.rb']
    }
  }
}

xml filter

       将XML解析为字段。以下配置解析存储在消息字段中的整个XML文档:

Bash

filter {
  xml {
    source => "message"
  }
}

6.3 提取字段和Wrangling数据

dissect filter

       使用分隔符将非结构化事件数据提取到字段中。 解剖过滤器不使用正则表达式,速度非常快。 但是,如果数据的结构因行而异,grok过滤器更合适。例如,假设日志中包含以下消息:

Bash

Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...

以下配置解析消息:

Bash

filter {
  dissect {
    mapping => { "message" => "%{ts} %{+ts} %{+ts} %{src} %{prog}[%{pid}]: %{msg}" }
  }
}

解剖过滤器应用后,事件将被解剖到以下领域:

Bash

{
  "msg"        => "Starting system activity accounting tool...",
  "@timestamp" => 2017-04-26T19:33:39.257Z,
  "src"        => "localhost",
  "@version"   => "1",
  "host"       => "localhost.localdomain",
  "pid"        => "1",
  "message"    => "Apr 26 12:20:02 localhost systemd[1]: Starting system activity accounting tool...",
  "type"       => "stdin",
  "prog"       => "systemd",
  "ts"         => "Apr 26 12:20:02"
}

kv filter

解析键值对。例如,假设有一条包含以下键值对的日志消息:

Bash

ip=1.2.3.4 error=REFUSED

以下配置将键值对解析为字段:

Bash

filter {
  kv { }
}

应用过滤器后,示例中的事件将具有以下字段:

Bash

ip: 1.2.3.4
error: REFUSED

grok filter

      将非结构化事件数据分析到字段中。 这个工具非常适用于系统日志,Apache和其他网络服务器日志,MySQL日志,以及通常为人类而不是计算机消耗的任何日志格式。 Grok通过将文本模式组合成与日志匹配的东西来工作。例如,假设有一个包含以下消息的HTTP请求日志:

Bash

55.3.244.1 GET /index.html 15824 0.043

以下配置将消息解析为字段:

Bash

filter {
  grok {
    match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
  }
}

应用过滤器后,示例中的事件将具有以下字段:

Bash

client: 55.3.244.1
method: GET
request: /index.html
bytes: 15824
duration: 0.043

#如果您需要帮助构建Grok模式,请尝试使用Grok调试器(https://www.elastic.co/guide/en/kibana/6.0/xpack-grokdebugger.html)。 Grok调试器是基本许可下的X-Pack功能,因此可以免费使用。

6.4 丰富的数据查找

dns filter

执行标准或反向DNS查找。以下配置对source_host字段中的地址执行反向查找,并将其替换为域名:

Bash

filter {
  dns {
    reverse => [ "source_host" ]
    action => "replace"
  }
}

elasticsearch

      将Elasticsearch中以前的日志事件的字段复制到当前事件中。

      以下配置显示了如何使用此过滤器的完整示例。 每当Logstash收到一个“end”事件时,它就会使用这个Elasticsearch过滤器来根据某个操作标识符来查找匹配的“start”事件。 然后它将@timestamp字段从“start”事件复制到“end”事件的新字段。 最后,使用日期过滤器和ruby过滤器的组合,示例中的代码计算两个事件之间的持续时间(小时)。

Bash

if [type] == "end" {
         elasticsearch {
            hosts => ["es-server"]
            query => "type:start AND operation:%{[opid]}"
            fields => { "@timestamp" => "started" }
         }
         date {
            match => ["[started]", "ISO8601"]
            target => "[started]"
         }
         ruby {
            code => 'event.set("duration_hrs", (event.get("@timestamp") - event.get("started")) / 3600) rescue nil'
         }
      }

geoip filter

添加有关IP地址位置的地理信息。 例如:

Bash

filter {
  geoip {
    source => "clientip"
  }
}

jdbc_streaming

用数据库数据丰富事件。以下示例执行SQL查询并将结果集存储在名为country_details的字段中:

Bash

filter {
  jdbc_streaming {
    jdbc_driver_library => "/path/to/mysql-connector-java-5.1.34-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydatabase"
    jdbc_user => "me"
    jdbc_password => "secret"
    statement => "select * from WORLD.COUNTRY WHERE Code = :code"
    parameters => { "code" => "country_code"}
    target => "country_details"
  }
}

translate filter

根据散列或文件中指定的替换值替换字段内容。 目前支持这些文件类型:YAML,JSON和CSV。以下示例采用response_code字段的值,将其翻译为基于字典中指定的值的描述,然后从事件中删除response_code字段:

Bash

filter {
  translate {
    field => "response_code"
    destination => "http_response"
    dictionary => {
      "200" => "OK"
      "403" => "Forbidden"
      "404" => "Not Found"
      "408" => "Request Timeout"
    }
    remove_field => "response_code"
  }
}

useragent filter

将用户agent字符串解析为字段。以下示例将代理字段中的用户agent字符串解析为用户代理字段,并将用户agent字段添加到名为user_agent的新字段。 它还删除了原始代理字段:

Bash

filter {
  useragent {
    source => "agent"
    target => "user_agent"
    remove_field => "agent"
  }
}

过滤器应用后,事件将丰富与用户agent fields。 例如:

Bash

    "user_agent": {
          "os": "Mac OS X 10.12",
          "major": "50",
          "minor": "0",
          "os_minor": "12",
          "os_major": "10",
          "name": "Firefox",
          "os_name": "Mac OS X",
          "device": "Other"
        }

七、部署和扩展Logstash

7.1 入门

       对于初次使用的用户,如果只是想要查看一个日志文件来掌握Elastic Stack的功能,推荐使用Filebeat Modules。 Filebeat模块使能够在几分钟内快速收集,分析和编制流行的日志类型并查看预建的Kibana仪表板。 Metricbeat模块提供了类似的体验,但具有指标数据。 在这种情况下,Beats将把数据直接发送到Elasticsearch,在这里Infinity节点将处理和索引你的数据。

image.png

Beats and Logstash

       Beats运行在成千上万的边缘主机服务器上,收集,tail,并将日志传送到Logstash。 Logstash作为数据统一和丰富的集中式流引擎。 Beats输入插件公开了一个安全的,基于确认的端点,用于Beats将数据发送到Logstash。

image.png

可扩展性

       Logstash是水平可伸缩的,可以形成运行相同管道的节点组。 Logstash的自适应缓冲功能将有助于即使通过可变的吞吐量负载也可以实现流畅的传输 如果Logstash层成为摄取瓶颈,只需添加更多节点即可向外扩展。 以下是一些一般性建议:

Bash

Beats应该在一组Logstash节点间进行负载平衡。
为了实现高可用性,建议至少使用两个Logstash节点。
通常每个Logstash节点只部署一个Beats输入,但是也可以为每个Logstash节点部署多个Beats输入,以便为不同的数据源提供独立的端点。

弹性

      当使用Filebeat或Winlogbeat进行日志收集时,至少一次交付是有保证的。通信协议,从Filebeat或Winlogbeat到log存储,从log存储到弹性搜索,都是同步和支持的确认。其他的Beats还没有对确认的支持。

      日志存储持久队列提供跨节点故障的保护。对于日志存储中的磁盘级别的弹性,确保磁盘冗余是很重要的。对于预先部署,建议配置RAID。当在云或容器环境中运行时,建议使用带有复制策略的持久磁盘,以反映数据SLAs。

#确保queue.checkpoint.writes:1被设置为至少一次保证。

Processing

      Logstash通常会使用grok或剖析来提取字段,增加地理信息,并且可以通过文件,数据库或Elasticsearch查找数据集进一步丰富事件。 请注意,处理复杂性可能会影响整体吞吐量和CPU利用率。 确保检查出其他可用的过滤器插件。

安全运输

企业级安全性在整个交付链中都可用。

Bash

Wire加密建议用于从Beats到Logstash以及从Logstash到Elasticsearch的传输。
与Elasticsearch进行通信时,包括基本身份验证,TLS,PKI,LDAP,AD和其他自定义领域,有很多安全选项。 要启用Elasticsearch安全性,请参阅X-Pack文档。

监控

         运行Logstash 5.2或更高版本时,监视UI可深入查看部署指标,帮助您观察性能,并在缩放时缓解瓶颈。 监控是基本许可下的X-Pack功能,因此可以免费使用。如果首选外部监视,则会有监视API(https://www.elastic.co/guide/en/logstash/current/monitoring.html)返回时间点指标快照。

7.2 添加其他热门Source

       用户可能有其他收集日志数据的机制,并且很容易将它们集成并集中到Elastic Stack中。 我们来看看几个场景:

image.png

TCP,UDP和HTTP协议

       TCP,UDP和HTTP协议是将数据提供给Logstash的常用方法。 Logstash可以将端点侦听器与各自的TCP,UDP和HTTP输入插件一起展示。 下面列举的数据源通常通过这三种协议中的一种被摄入。TCP协议不支持应用程序级别的确认,所以连接问题可能导致数据丢失。对于高可用性场景,应该添加第三方硬件或软件负载均衡器(如HAProxy),以将流量扇出到一组Logstash节点。

网络和安全数据

       尽管Beats可能已经满足您的数据采集用例,但是网络和安全数据集有多种形式。 我们来看看其他几个摄取点。

Bash

网络线数据  #使用Packetbeat收集和分析网络流量。
Netflow v5/v9/v10  #Logstash通过Netflow编解码器了解Netflow/IPFIX导出器中的数据。
Nmap   #Logstash使用Nmap编解码器接受并解析Nmap XML数据。
SNMP trap  #Logstash具有本机SNMP trap输入。
CEF   #Logstash使用CEF编解码器接收和解析来自Arcsight SmartConnectors等系统的CEF数据。

集中式系统日志服务器

       像rsyslog和syslog-ng这样的现有系统日志服务器技术通常会将系统日志发送到Logstash TCP或UDP端点进行提取,处理和持久化。 如果数据格式符合RFC3164,则可以将其直接送入Logstash系统日志输入。

基础设施、应用数据和物联网

      可以使用Metricbeat收集基础架构和应用程序度量标准,但是应用程序也可以将Webhook发送到Logstash HTTP输入或使用HTTP轮询器输入插件从HTTP端点轮询度量标准。

     对于使用log4j2进行登录的应用程序,建议使用SocketAppender将JSON发送到Logstash TCP输入。或者,log4j2也可以使用FIlebeat登录到文件进行收集。不推荐使用log4j1 SocketAppender。

    像Rasberry Pis,智能手机和连接车辆等物联网设备通常通过这些协议之一发送遥测数据。

7.3 与消息队列集成

      如果将消息队列技术作为现有基础架构的一部分,那么将这些数据存入Elastic Stack很容易。 对于正在使用Redis或RabbitMQ等外部队列层的现有用户来说,只是为了使用Logstash进行数据缓冲,建议使用Logstash持久队列而不是外部队列层。 通过消除摄取体系结构中不必要的复杂层次,这将有助于简化管理。

      对于想要集成来自现有Kafka部署的数据或需要临时存储的基础用法的用户,Kafka可以作为Beats可以坚持的数据中心,并且Logstash节点可以从中使用。

image.png

#其他的TCP,UDP和HTTP源可以使用Logstash作为通道来实现高可用性来代替负载平衡器。 然后,一组Logstash节点可以从具有Kafka输入的主题中进行使用,以进一步转换和丰富传输中的数据。

 弹性和恢复

      当Logstash使用Kafka时,应启用持久队列,并增加传输弹性,以减轻Logstash节点故障期间需要重新处理的需求。 在这种情况下,建议使用默认的持久队列磁盘分配大小queue.max_bytes:1GB。

      如果kafka被配置为长时间保留数据,在灾难恢复和和解的情况下,数据可以从卡夫卡重新处理。

其他消息队列集成

      尽管不需要额外的排队层,但Logstash可以从其他各种消息队列技术(如RabbitMQ和Redis)中使用。 它还支持从Pub / Sub,Kinesis和SQS等托管排队服务获取。

八、专业术语

@metadata:

用于存储不希望在输出事件中包含的内容的特殊字段。例如,@metadata字段用于创建条件语句中使用的临时字段。

codec plugin:

一个Logstash插件,用于更改事件的数据表示形式。 编解码器基本上是可以作为输入或输出的一部分操作的流过滤器。 使用编解码器可以将序列化过程中的消息传输分开。 流行的编解码器包括json,msgpack和普通(文本)。

conditional:

根据语句(也称为条件)是真还是假来执行某些操作的控制流。 Logstash支持if,else if和else语句。 您可以使用条件语句来应用过滤器,并根据您指定的条件将事件发送到特定的输出。

event:

一个信息单元,包含时间戳和附加数据。 一个事件通过输入到达,并随后被解析,加盖时间戳,并通过Logstash流水线。

field:

事件属性。例如,apache访问日志中的每个事件都具有属性,例如状态码(200,404),请求路径(“/”,“index.html”),HTTP动词(GET,POST),客户端IP地址, 等等。 Logstash使用术语“域”来引用这些属性。

field reference:

对事件字段的引用。 此引用可能会出现在Logstash配置文件的输出块或过滤器块中。 字段引用通常用方括号([])括起来,例如[fieldname]。 如果您指的是顶级字段,则可以省略[]并简单地使用字段名称。 要引用嵌套字段,请指定该字段的完整路径:[top-level field] [nested field]。

filter plugin:

对事件执行中间处理的Logstash插件。 通常情况下,过滤器在事件数据通过输入被摄取之后,通过根据配置规则对数据进行变异,富集和/或修改来对其进行处理。 过滤器通常根据事件的特征有条件地应用。 流行的过滤器插件包括grok,mutate,drop,clone和geoip。 过滤器阶段是可选的。

gem:

在RubyGems.org上托管的自包含代码包。 Logstash插件被打包成Ruby Gems。 您可以使用Logstash插件管理器来管理Logstash gems。

hot thread:

一个Java线程,CPU使用率高,执行时间长于正常时间。

input plugin:

一个从特定源读取事件数据的Logstash插件。 输入插件是Logstash事件处理管道中的第一个阶段。 流行的输入插件包括file,syslog,Redis和Beat。

indexer:

一个Logstash实例,负责与Elasticsearch集群进行连接,以索引事件数据。

message broker:

也称为消息缓冲区或消息队列,消息代理是外部软件(如Redis,Kafka或RabbitMQ),它将来自Logstash托运人实例的消息存储为中间存储,等待Logstash索引器实例处理。

output plugin:

将事件数据写入特定目标的Logstash插件。 产出是事件管道的最后阶段。 流行的输出插件包括 elasticsearch, file, graphite, and statsd.

pipeline:

用于描述通过Logstash工作流的事件流的术语。 流水线通常由一系列输入,过滤器和输出级组成。 输入阶段从源获取数据并生成事件,筛选阶段(可选),修改事件数据,输出阶段将数据写入目标。 输入和输出支持编解码器,使您可以在数据进入或退出流水线时进行编码或解码,而无需使用单独的过滤器。

plugin:

一个自包含的软件包,实现Logstash事件处理管道中的一个阶段。 可用插件列表包括输入插件,输出插件,编解码器插件和过滤器插件。 这些插件是作为Ruby宝石实现的,并在RubyGems.org上托管。 您可以通过配置插件来定义事件处理管道的阶段。

plugin manager:

通过bin/logstash-plugin脚本访问,插件管理器使您能够管理Logstash部署中插件的生命周期。 您可以使用插件管理器命令行界面(CLI)来安装,删除和升级插件。

shipper:

Logstash的一个实例,它将事件发送到另一个Logstash实例或其他应用程序。

worker:

Logstash使用的过滤器线程模型,其中每个工作程序接收事件并按顺序应用所有过滤器,然后将事件发送到输出队列。 这允许跨CPU的可扩展性,因为许多过滤器是CPU密集型的。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值