Logstash简介

https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html

https://www.kancloud.cn/aiyinsi-tan/logstash/849518

Logstash Introduction
Logstash 是一个实时的管道式开源日志收集引擎。Logstash可以动态的将不同来源的数据进行归一并且将格式化的数据存储到你选择的位置。对你的所有做数据清洗和大众化处理,以便做数据分析和可视化。

我们对Logstash的日志收集做了大量的创新,但它的能力远不止收集日志这么简单。通过输入、过滤和输出插件Logstash可以对任何类型的事件丰富和转换,通过本地编码器还可以进一步简化此过程。Logstash通过大量的多样化数据来提升你的洞察力。

The Power of Logstash
Elasticsearch或其他更多应用的收集器
水平可扩展的数据处理管道和强大的Elasticsearch、Kibana组合协同工作。

插件式架构
混合、匹配和编排不同的输入、过滤器和输出,以便在管道协调中发挥作用。(原文:Mix, match, and orchestrate different inputs, filters, and outputs to play in pipeline harmony。个人认为其含义应该为:在输入、过滤、输出的管道中协调混合、过滤和匹配。)

Community-extensible and developer-friendly plugin ecosystem
超过200个可用插件,加上你自己创造和贡献的灵活性。(根据标题的意思应该是要表达可以根据需要自己灵活创建插件,原文如下:Over 200 plugins available, plus the flexibility of creating and contributing your own)

static/images/logstash.png

Analysis:分析

Archiving:归档

Monitoring:监控

Alerting:报警

Logstash Loves Data
收集越多知道的越多,Logstash欢迎任意形式和大小的数据。

Logs and Metrics(日志和指标)
一切从哪里开始。

处理所有类型的日志数据

轻松收集大量web日志如:Apache,和应用程序日志如:log4j for java

捕获许多其他日志格式如:syslog,网络和防火墙日志,以及更多类型

享受和Filebeat互补的安全的日志转发能力。

通过TCP和UDP从Ganglia,collectd,NetFlow,JMX和其他众多的基础架构和应用平台收集指标。

The Web
Unlock the World Wide Web.

将HTTP requests转换成事件

如Twitter用来做社会感情分析(只翻译了后半句,前半句实在整不出来啥意思。原文:Consume from web service firehoses like Twitter for social sentiment analysis)
支持GitHub,HipChat,JIRA和无数其他应用程序的Webhook。
启用多个监控报警用例(原文:Enables many Watcher alerting use cases)
按需轮询 HTTP endpoints来创建事件

从网络应用程序接口捕获健康、性能、指标等其他类型的数据。
Perfect for scenarios where the control of polling is preferred over receiving。(不会,大意是说他的最佳使用场景。)
Data Stores and Streams
发掘你的数据的更多价值。

使用JDBC接口从任何关系型或非关系型数据库存储总更好的理解你的数据。
从消息队列中统一不同的数据流。如:Kafka,RabbitMQ,Amazor SQS
Sensors and loT
探索其他更广泛的数据

在这个技术大爆炸的时代,通过获取和分析连接在这个庞大的物联网世界上的传感器获取的数据释放了无数的用例。
从移动设备到智能家庭、车联网、健康传感器以及其他的行业应用,Logstash也是最常见的事件收集器支柱。
Easily Enrich Everything
更好的数据意味着更好的知识。通过清洗和转换数据来提升实时洞察数据的能力。Logstash提供了许多聚合和转换以及模式匹配、地理映射和动态查找功能。

Grok是Logstash基本的过滤器,被广泛的用于将非结构化的数据结构化。享受其为致力于快速解决Web、System、Networking和其他类型的事件格式附带的丰富的集成模式,
扩展你的视野通过从IP地址解析地理坐标,将复杂的日期规范化展示,简化K/V数据和CSV数据,指纹(匿名)敏感信息。并进一步从本地或Elasticsearch查询中丰富你的数据。(原文:Expand your horizons by deciphering geo coordinates from IP addresses, normalizing date complexity, simplifying key-value pairs and CSV data, fingerprinting(anonymizing) sensitive information, and further enriching your data with local lookups or Elasticsearch queries.)
编码器通常用于简化对JSON和多行事件等常见事件结构的处理。

安装Logstash

NOTE : Logstash支持Java8,不支持Java9,使用Oracle 版JDK或开源的OpenJDK

使用下面的命令检查你的Java版本:

java -version

执行sudo apt-get update准备好之后使用下面的明星安装:

sudo apt-get update && sudo apt-get install logstash

查看运行Logstash查看如何以系统服务管理Logstash。

YUM

下载并安装公钥:

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch

/etc/yum.repos.d/目录下创建一个.repo结尾的文件,内容如下:

[logstash-6.x]
name=Elastic repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
复制

准备好之后运行下面的命令来安装:

sudo yum install logstash

储存你的第一个事件

首先,让我们运行一个最基本的Logstash管道来确保你的Logstash运行正常。

一个Logstash管道有两个必须的组件,inputoutput,除此之外还有一个可选的组件filter。input插件将数据从源读入,filter插件按照你的定义处理数据,最后通过output插件写入到目的地。

static/images/basic_logstash_pipeline.png

参照如下示例来运行最基本的Logstash管道来检查Logstash的安装:

cd logstash-6.4.3
bin/logstash -e 'input { stdin { } } output { stdout {} }'

NOTE:bin目录的位置因平台而异,查看Directory layout来找到你系统上的bin/logstash。(如果使用yum进行安装,通常尝试直接执行logstash -e 'input { stdin { } } output { stdout {} }',如果使用二进制安装,则bin目录位于你解压的目录下。)

使用-e选项允许你在命令行快速配置而不必修改配置文件,这个示例将从stdin来读取你的输入,并将输出以结构化的方式输出至stdout。(就是从命令行读取,在终端上输出。)

Logstash启动之后你可以在屏幕上看到"Pipeline main started",输入hello world并回车:

hello world
2013-11-21T01:22:14.405+0000 0.0.0.0 hello world

通过Logstash解析日志

上面的示例中你已经创建了一个最基本的Logstash管道来测试你的Logstash,在实际的情形中,Logstash通常面临着更加复杂的场景:一个或多个input、filter和output插件。

本段,你将创建一个Logstash管道,使用Filebeat采集的Apache日志作为input,从日志中解析特殊字段,然后将解析后的数据写入一个Elasticsearch集群。这次你将定义一个配置文件,而不是在命令行中设定。

这里下载示例数据,以便我们可以开始。

配置Filebeat来发送日志到Logstash

在创建Logstash管道之前,你需要配置Filebeat来将日志发送到Logstash。Filebeat是一个轻量的、友好的日志收集客户端,它从你服务器上的文件中收集日志,并转发到Logstash以进行实时处理。Filebeat是为可靠性和低延迟设计的。Filebeat可以在你的主机上占用更少的资源,使用Beats input插件将让你的Logstash实例的资源使用降到最低。

NOTE:在一个典型的使用场景中,Filebeat运行在和Logstash不同的单独的主机上,在这个演示的实例中我们将Logstash和Filebeat运行在同一台主机上。

默认情况下Logstash会安装Beats input插件。Beats input插件允许Logstash接收来自Elastic Beats框架的事件,这意味着任何基于Beats框架的Beat written如Packetbeat和Metricbeta都可以给Logstash发送事件。

要在你的数据源主机上安装适合的Filebeat,可以在这里下载。你也可以在这里查看Beats的安装文档。

安装完成之后你需要进行一些配置。在你的安装目录中找到并打开filebeat.yml文件,然后使用下面的内容替换其中的内容。确保paths指向下载的测试用的Apache日志文件logstash-tutorial.log

filebeat.prospectors:
- type: log
  paths:
    - /path/to/file/logstash-tutorial.log ①
output.logstash:
  hosts: ["localhost:5044"]

① 文件或目录的绝对路径。(原文:Absolute path to the file or files that Filebeat processes.)

保存更改。

为了更加简单,这里不用配置TLS/SSL。在生产中,通常需要配置这些。

在数据源的主机上执行下面的命令来运行Filebeat:

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

NOTE:如果你以root的身份运行Filebeat,你需要更改配置文件的所有权.(参考:Config File OwnerShip and Permissions)。

Filebeat使用5044进行连接,在Logstash启动Beats插件之前,Filebeat不会收到任何响应,所以此时你看到的任何连接此端口失败的消息都是正常的。

配置Logstash使用Filebeat作为输入

接下来,你将创建一个Logstash管道使用Beats input插件接收来自Beats的事件。

下面是一个配置文件的框架:

# The # character at the beginning of a line indicates a comment. Use
# comments to describe your configuration.
input {
}
# The filter part of this file is commented out to indicate that it is
# optional.
# filter {
#
# }
output {
}

这个框架没有任何功能,因为在input 和 output 没有定义任何选项。

在Logstash的home目录下创建一个文件,名为first-pipeline.conf,将上述内容复制进去。(Logstash的home目录应该是指Logstash安装目录。)

接下来,在first-pipeline.conf文件中的input配置段添加以下内容来使用Beats input 插件:

    beats {
        port => "5044"
    }

你可以稍后配置Elasticsearch。现在,将下面的内容填入到配置文件中的output配置段。其作用是在你运行Logstash的时候将输出结果输出到stdout。

    stdout { codec => rubydebug }

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

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

你可以使用下面的命令来检查你的配置文件:

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

--config.test_and_exit选项会分析你的配置文件并将其中的错误输出。

如果配置文件通过了检查,你可以使用下面的命令来启动Logstash:

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

--config.reload.automatic选项可以让Logstash在你修改配置文件之后重载而不必重新启动。

当Logstash启动之后,你可能会看到一到多条关于忽略pipelines.yml文件的警告信息。你可以忽略这些警告。pipelines.yml文件是用来在一个Logstash示例中运行多个管道使用的。在这个演示的示例中,你只运行一个管道。

如果运行正确你应该能在屏幕上看到如下的输出信息:

{
    "@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 Filter插件解析Web Logs

现在你已经有了一个正常工作的从Filebeat读取日志的管道。但是,你知道日志的格式并不理想。你希望解析这些日志文件中的特殊字段。为了实现这个,你需要用到grok filter插件。

Grok filter插件是少数Logstash默认可以使用的插件之一。更多关于管理Logstash插件的信息,参考reference documentation

Grok插件可以将非结构化的数据转换为高质量的结构化数据。

由于grok插件从传入的日志中进行匹配查找,所以需要你根据自己感兴趣的数据来配置插件。如典型的Web服务日志如下:

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地址,方括号中的是时间标签。对于Apache日志你可以使用%{COMBINEDAPACHELOG}来将数据解析成如下结构。

InformationField Name
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

TIP:如果在构建Grok匹配模式上需要帮助,你可以使用Grok Debugger。Grok Debugger是基本许可下的X-Pack的一个附加特性,可以免费使用。

编辑first-pipeline.conf文件并使用下面的内容替换其中的filter字段:

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

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

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

保存更改,由于已经开启了自动重载配置文件,因此你不必重新启动Logstash来使配置生效。但是你需要让Filebeat强制从头开始读取日志文件。在对应的终端上使用Ctrl+C组合键来关闭Filebeat。然后删除Filebeat的registry文件,命令如下:

sudo rm data/registry

Filebeat的registry文件保存了它读取的文件的状态,删除之后可以强制让Filebeat重新从头读取这些文件。

然后使用下面的命令重启Filebeat:

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

你可能需要等待一小会儿如果Filebeat等待Logstash重读配置文件的话。

在Logstash完成重读并匹配完成之后,事件将用JSON的格式表示如下:

{
        "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插件丰富你的数据

除了解析日志以便于搜索,filter插件还可以从现有的数据中进行扩展。举个例子,geoip插件可以从IP地址获取物理位置信息并将其添加到日志中。

first-pipeline.conf文件的filter字段中添加以下内容来使用geoipfilter插件:

    geoip {
        source => "clientip"
    }

geoip插件的配置需要你指定包含要查找的IP地址的源字段的名称。在示例中,clientip字段包含IP地址。

因为filter是按照顺序进行解析,所以配置文件中的geoip字段要在grok字段之后且这两个字段都要在filter字段中

当你做完之后,first-pipeline.conf文件中的内容应该如下:

input {
    beats {
        port => "5044"
    }
}
 filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
    geoip {
        source => "clientip"
    }
}
output {
    stdout { codec => rubydebug }
}

保存设置,和之前一样强制停止Filebeat然后删除registry文件,然后使用下面的命令重启Filebeat:

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

注意事件中现在已经包含了物理位置信息:

{
        "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
    },
    ...

将你的数据索引到Elasticsearch

现在web日志已经按照字段进行分割,你已经准备好将数据写入Elasticsearch。

TIP:你可以在你自己的硬件上运行Elasticsearch,也可以使用我们的Elastic云上的Elasticsearch主机服务。AWS和GCP都提供了Elasticsearch服务。免费试用一下

Logstash可以将数据索引到Elasticsearch集群。编辑first-pipeline.conf文件中的output字段,内容如下:

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

这个配置中,Logstash使用HTTP协议连接Elasticsearch。上面的示例中Logstash和Elasticsearch运行在相同 的实例中。你也可以指定一个远程Elasticsearch实例通过配置hosts如:hosts => ["es-machine:9200"]

到这里,你的first-pipeline.conf包含input,filter,和output配置,没问题的话,应该是下面这样:

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

保存配置,像之前一样强制中止Filebeat,删除registry文件,然后使用下面的命令重启Filebeat:

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

测试你的管道

现在你的Logstash已经将数据存储到Elasticsearch集群中,你可以在Elasticsearch集群中进行查询。

尝试在Elasticsearch中查询grokfilter插件创建的字段。用YYYY.MM.DD格式的当前时间替换下面的$DATE:

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

NOTE:数据使用的索引名称基于UTC时间,并非Logstash运行的当地时间。如果查询返回index_not_found_exception,确保logstash-$DATE对应的名字是正确的索引名。可以使用这个查询指令来查看所有可用的索引:curl 'localhost:9200/_cat/indices?v'

应该会返回多个命中结果。如下:

{
  "took": 50,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 98,
    "max_score": 2.793642,
    "hits": [
      {
        "_index": "logstash-2017.11.09",
        "_type": "doc",
        "_id": "3IzDnl8BW52sR0fx5wdV",
        "_score": 2.793642,
        "_source": {
          "request": "/presentations/logstash-monitorama-2013/images/frontend-response-codes.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
          },
          "offset": 2932,
          "auth": "-",
          "ident": "-",
          "verb": "GET",
          "prospector": {
            "type": "log"
          },
          "source": "/path/to/file/logstash-tutorial.log",
          "message": """83.149.9.216 - - [04/Jan/2015:05:13:45 +0000] "GET /presentations/logstash-monitorama-2013/images/frontend-response-codes.png HTTP/1.1" 200 52878 "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": [
            "beats_input_codec_plain_applied"
          ],
          "referrer": """"http://semicomplete.com/presentations/logstash-monitorama-2013/"""",
          "@timestamp": "2017-11-09T03:11:35.304Z",
          "response": "200",
          "bytes": "52878",
          "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:45 +0000"
        }
      },
    ...

尝试使用从IP地址派生出的地理信息来查询。使用当前时间替换$DATE,用YYYY.MM.DD格式的时间:

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

有些日志来自Buffalo,所以应该会返回下面的结果:

{
  "took": 9,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 2.6390574,
    "hits": [
      {
        "_index": "logstash-2017.11.09",
        "_type": "doc",
        "_id": "L4zDnl8BW52sR0fx5whY",
        "_score": 2.6390574,
        "_source": {
          "request": "/blog/geekery/disabling-battery-in-ubuntu-vms.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29",
          "agent": """"Tiny Tiny RSS/1.11 (http://tt-rss.org/)"""",
          "geoip": {
            "timezone": "America/New_York",
            "ip": "198.46.149.143",
            "latitude": 42.8864,
            "continent_code": "NA",
            "city_name": "Buffalo",
            "country_name": "United States",
            "country_code2": "US",
            "dma_code": 514,
            "country_code3": "US",
            "region_name": "New York",
            "location": {
              "lon": -78.8781,
              "lat": 42.8864
            },
            "postal_code": "14202",
            "region_code": "NY",
            "longitude": -78.8781
          },
          "offset": 22795,
          "auth": "-",
          "ident": "-",
          "verb": "GET",
          "prospector": {
            "type": "log"
          },
          "source": "/path/to/file/logstash-tutorial.log",
          "message": """198.46.149.143 - - [04/Jan/2015:05:29:13 +0000] "GET /blog/geekery/disabling-battery-in-ubuntu-vms.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+semicomplete%2Fmain+%28semicomplete.com+-+Jordan+Sissel%29 HTTP/1.1" 200 9316 "-" "Tiny Tiny RSS/1.11 (http://tt-rss.org/)"""",
          "tags": [
            "beats_input_codec_plain_applied"
          ],
          "referrer": """"-"""",
          "@timestamp": "2017-11-09T03:11:35.321Z",
          "response": "200",
          "bytes": "9316",
          "clientip": "198.46.149.143",
          "@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:29:13 +0000"
        }
      },
     ...

如果你使用Kibana来可视化你的数据,你可以在Kibana中查看你通过Filebeat获取的数据:

Discovering Filebeat data in Kibana

查看Filebeat getting started docs获取关于在Kibana中加载Filebeat索引的信息。

你已经成功的创建了一个Logstash管道,通过Filebeat采集Apache日志作为input,分析其中的特殊字段,然后将分析后的字段写入到Elasticsearch集群中。接下来,即将学习如何创建一个管道同时使用多个input和output插件。

多个输入和输出插件的混合使用

通常你管理的信息会来自于不同的地方,你的用例也可能要求将数据存储到不同的目的地。你的Logstash管道可以使用多个input和output插件来满足这些需求。

在本章节,你将创建一个Logstash管道同时从Twitter和Filebeat客户端获取信息,然后将这些信息存储到Elasticsearch集群的同时直接写入文件。

从Twitter读取

要添加一个Twitter输入,你可以使用twitterinput插件。要配置这个插件,你需要下面几条信息:

  • 一个用来唯一标示您的Twitter应用程序的用户密钥。
  • 一个用来充当Twitter应用密码的秘密。(不知道怎么翻译这一句,原文:A consumer secret, which serves as the password for your Twitter app.)
  • 要在传入的Feed中搜索的一个或多个关键字。在这个例子中使用“Cloud”作为关键字,你可以自定义你想要搜索的任何东西。
  • 一个认证令牌,使此应用可以识别一个Twitter帐号。
  • 一个认证令牌秘密,用作Twitter帐号密码。(原文:An oauth token secret, which serves as the password of the Twitter account.)

访问https://dev.twitter.com/apps来设置Twitter帐号和生成你的用户密钥和秘密,以及你的认证令牌和秘密。如果你不确定如何生成这些信息,查看twitterinput插件的文档来获取更多信息。

注:这个Twitter app似乎有些类似在微信或者其他什么开发平台申请的一个自己创建的应用,并非Twitter应用本身,至于那什么用户密钥,秘密,认证令牌什么的应该于此有关。鉴于Twitter属于404网站,不好研究。自己感受下吧。

和之前一样创建一个配置文件(命名为second-pipeline.conf)并且使用同样的配置框架。如果你懒,还可以复制一份刚才的,只是运行的时候确保使用的是正确的配置文件。

将下面的内容填写到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"
    }

配置Filebeat将日志发送到Logstash

正如之前了解的,Filebeat是一个轻量级,资源友好的工具用来从服务器文件上收集日志并将其转发给Logstash实例进行处理。

在安装Filebeat之后,你需要进行一些配置。在本地安装目录中打开filebeat.yml文件,并用下面的内容替换其中内容。确保path指向你的系统日志:

filebeat.prospectors:
- type: log
  paths:
    - /var/log/*.log ①
  fields:
    type: syslog ②
output.logstash:
  hosts: ["localhost:5044"]

① 指定一个或多个文件的绝对路径


② 向事件添加一个type字段,值为syslog

保存设置。

同样,为了简单,这里你不需要配置TLS/SSL,但在生产中可能并非如此。

通过向second-pipeline.conf文件的input配置段添加以下信息来使用Filebeat input 插件。

    beats {
        port => "5044"
    }

把Logstash数据写入文件

使用fileoutput插件,可以配置你的Logstash管道直接将数据写入文件。

通过向second-pipeline.conf文件的output配置段添加如下信息来使用fileoutput插件:

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

写入多个Elasticsearch节点

写入多个Elasticsearch节点可以减轻特定节点的负载,并且可以在主节点不可用时提供冗余入口。

要配置此功能,在second-pipeline.conf文件的output配置段中添加如下信息:

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

在hosts行配置三个非主节点的Elasticsearch节点IP地址。当hosts中配置多个IP地址的时候,Logstash会在地址列表中进行负载均衡,如果Elasticsearch使用的是默认的9200端口,你可以在上面的配置中省略它。

测试

通过上面的配置,second-pipeline.conf内容应该如下:

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 => "5044"
    }
}
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:

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

Logstash启动之前,Filebeat会收到连接5044失败的错误信息,这是正常的。

要验证你的配置,使用下面的命令:

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

--config.test_and_exit选项检查你的配置文件并向你报告其中的错误。当配置文件通过检查之后,使用下面的命令启动Logstash:

bin/logstash -f second-pipeline.conf

使用grep工具在目标文件中搜索来验证是否存在信息:

grep syslog /path/to/target/file

然后运行一个Elasticsearch查询来搜索同样的内容:

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

用当前的时间替换其中的$DATE,时间使用YYYY.MM.DD格式。

使用下面的查询语句从Twitter feed,中查询数据:

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

同样的,记得用当前的时间替换其中的$DATE变量,格式依然是YYYY.MM.DD

Logstash是如何工作的

Logstash事件处理管道有三个阶段:input →filters→outputs。Input获取数据,filter处理这些数据,然后outputs将处理过的数据送到你需要的任何地方。Inputs和outputs支持编码器,以便你可以在数据输入或输出的时候进行编码或解码而不必使用一个单独的过滤器。

Inputs

你得使用Inputs将数据交给Logstash。下面是几个最常用的Inputs:

  • file:从文件系统上的一个文件进行读取,其工作原理有些类似UNIX的tail -0F命令
  • syslog:监听来自514端口的syslog消息,并将其转换为RFC3164格式
  • redis:从redis服务器读取。可以是redis频道或者redis列表。在一个集中部署的Logstash中,redis也用作中间件用来将传入的消息排队。(这段的意思应该是,redis可以用作消息队列将消息传递给Logstash或者作为数据源直接将数据传递给Logstash。原文:reads from a redis server, using both redis channels and redis lists. Redis is often used as a "broker" in a centralized Logstash installation, which queues Logstash events from remote Logstash "shippers".)
  • beats:处理由Beats发送过来的事件。

关于更多可用的inputs的信息,查看:Input Plugins

Filters

Filters在Logstash管道中是一个中间件的角色。你可以对符合某些条件的事件结合filters和附加条件对其进行处理,下面是一些比较实用的filters(原文:Filters are intermediary processing devices in the Logstash pipeline. You can combine filters with conditionals to perform an action on an event if it meets certain criteria. Some useful filters include:):

  • grok:解析和构造文本。Grok是你将非结构化数据转换成高质量的结构化数据的最佳选择。Logstash集成了超过120条匹配规则,很大程度上你会找到一个你需要的。
  • mutate:对事件字段做常用的转换,比如:重命名、移动、替换或者修改某些字段。
  • drop:彻底丢弃某个事件,如debug事件。
  • clone:创建一个时间的副本,可能增加或移除字段。(直译。原文:make a copy of an event, possibly adding or removing fields.)
  • geoip:从IP地址添加物理地址信息(可以在Kibana创建很棒的图表。)

更多关于Filter Plugins的信息,查看Filter Plugins

Outputs

Outputs是Logstash管道的最后阶段。一个事件可以通过Outputs发送到多个目的地。当这些过程一旦完成,这个事件的处理也就完全结束了。下面是一些使用的Outputs:

  • Elasticsearch:将事件数据发送到Elasticsearch。如果你计划以高效、方便和容易查询的格式存储数据,你应该选择Elasticsearch。是的,我们就是这么真实 : )

  • file:把事件数据写到磁盘上的文件

  • graphite:将数据发送给graphite,这是一个流行的开源存储和图形化工具。http://graphite.readthedocs.io/en/latest/

  • statsd:将数据发送给是statsd,statsd是一个“像计数器和计时器一样监听统计数据,并通过UDP发送聚合信息到一个或多个可插入后端”的服务。如果你准备好使用statsd,这个会对你有帮助。

    注:引号部分为官方statsd官方介绍信息。有人翻译为“通过 UDP 或者 TCP 方式侦听各种统计信息,包括计数器和定时器,并发送聚合信息到后端服务”,不过我更倾向于我自己的翻译,因为statsd是一个监控软件,其应该是想表达像计时器一样统计信息而不是统计像计时器和定时器这样的数据。附上原文:listens for statistics, like counters and timers, sent over UDP and sends aggregates to one or more pluggable backend services

更多关于Outputs的信息,查看Output Plugins

编码器Codecs

编码器是最基本的流过滤器,可以替代部分input和output。编码器可以让你更容易的的从序列化数据中分离传送你的信息(原文:Codecs enable you to easily separate the transport of your messages from the serialization process)。流行的编码器包括jsonmsgpack,和plain(text)。

  • json:将数据编码或解码为JSON格式。
  • multiline:将类似java异常和java栈之类的多行文本事件合并成单个事件。

Logstash事件处理管道协调inputs、filters和outputs的执行。

Each input stage in the Logstash pipeline runs in its own thread.(这句直接翻译应该是每个input阶段在Logstash中都有自己独立的线程。但是,我感觉他想表达的可能是Logstash的input、filter、output三个阶段都有自己独立的线程。)Inputs将事件写入内存(默认)或磁盘上的中央队列。每个管道中的工作线程从队列中取走一部分事件。通过配置的filters处理这些事件,然后通过outputs处理filters处理过的时间。工作线程的多少和取走部分的大小是可以配置的。(参见:Tuning and Profiling Logstash Performance)。

默认情况下,Logstash使用每个阶段中内存中的消息队列来缓存事件。如果Logstash被不安全的停止,则会丢失内存中的数据。要降低数据丢失的风险,可以打开Logstash持久化到磁盘的功能。参见Persistent Queues获取更多信息。

LogstashDirectory Layout

这节介绍当你解压Logstash之后默认创建的目录结构。

Directory Layout of .zip and .tar.gz Archives

.zip.tar.gz的包是完全独立的。默认情况下,所有的文件和目录都包含在解压之后创建的主目录中。

这使得你不必创建目录就可以使用Logstash,也可以通过直接删除主目录来卸载Logstash。但是我们建议将配置文件和日志文件的目录放在不同的地方,以避免删除重要数据。

类型Description(描述)Default Location默认位置Setting
home Logstash的安装目录 {extract.path}-解压之后创建的目录  
bin 二进制脚本,包含用来启动的logstash和安装插件的logstash-plugin {extract.path}/bin  
settings 配置文件,包括 logstash.yml和 jvm.options {extract.path}/config path.settings
logs Log files {extract.path}/logs path.logs
plugins 本地非Ruby-Gem插件文件,每个插件都有独立的目录,建议仅用作开发。 {extract.path}/plugins path.plugins
data Logstash以及插件做所有持久化数据时使用的文件。 {extract.path}/data path.data

注:{extract.path}表示Logstash的解压目录

Directory Layout of Debian and RPM Packages

Debian包和RPM包安装之后配置文件,日志文件和设置文件在各自系统上的位置

TypeDescriptionDefault LocationSetting
home Logstash的安装目录 /usr/share/logstash  
bin 二进制脚本,包含用来启动的logstash和安装插件的logstash-plugin /usr/share/logstash/bin  
settings 配置文件,包括 logstash.yml和 jvm.options和 startup.options /etc/logstash path.settings
conf Logstash 管道配置文件 /etc/logstash/conf.d/*.conf See/etc/logstash/pipelines.yml
logs Log files /var/log/logstash path.logs
plugins 本地非Ruby-Gem插件文件,每个插件都有独立的目录,建议仅用作开发。 /usr/share/logstash/plugins path.plugins
data Logstash以及插件做所有持久化数据时使用的文件。 /var/lib/logstash path.data

Directory Layout of Docker Images

Docker镜像是从一个.tar.gz包创建的,包含相似的目录布局

TypeDescriptionDefault LocationSetting
home Logstash的安装目录 /usr/share/logstash  
bin 二进制脚本,包含用来启动的logstash和安装插件的logstash-plugin /usr/share/logstash/bin  
settings 配置文件,包括 logstash.yml和 jvm.options /usr/share/logstash/config path.settings
conf Logstash 管道配置文件 /usr/share/logstash/pipeline path.config
plugins 本地非Ruby-Gem插件文件,每个插件都有独立的目录,建议仅用作开发。 /usr/share/logstash/plugins path.plugins
data Logstash以及插件做所有持久化数据时使用的文件。 /usr/share/logstash/data path.data

NOTE:默认情况下Logstash Docker容器不会创建日志文件。日志会输出到标准输出。

Logstash配置文件 

Logstash有两种类型的配置文件:pipeline 配置文件,用来定义管道。(后面我称之为管道配置文件)settings 文件,用来控制Logstash的启动和运行。
(后面我称之为应用配置文件)

Pipeline配置文件

当你定义Logstash处理阶段的时候,你需要定义pipeline配置文件。对于使用deb或rpm安装的Logstash,pipeline配置文件位于/etc/logstash/conf.d/目录。Logstash会尝试加载.conf结尾以及位于/etc/logstash/conf.d/目录中同类型的的文件,并且会忽略非.conf结尾的文件。

更多信息查看Configuring Logstash

Settings Files

应用设置文件在安装Logstash的时候已经定义。包含以下文件:

logstash.yml

包含Logstash的配置项,你可以在这里进行设置,而不是在命令行中指定。在命令行中指定的所有设定会覆盖配置文件中的设定。更多信息参考:logstash.yml

pipelines.yml

包含在单个Logstash实例中运行多个管道的框架和说明。更多信息参考:Multiple Pipelines

jvm.options

JVM相关设置,用来设定Java堆初始内存和最大内存。也可以在此文件中设置语言环境。一行一个设置。(这句的意思应该是每行只有一个设置。原文:Specify each flag on a separate line.)此文件中的所有设置都必须由专业人士进行。

startup.options(Linux)

包含/usr/logstash/bin/下的system-install用来创建启动脚本的配置。当你安装Logstash的时候,system-install脚本在安装的最后阶段根据此文件中的配置来设置用户、用户组、服务名和服务简介。默认情况下Logstash服务以logstash用户的身份进行安装。startup.options文件让你更容易安装Logstash服务的多实例。你可以复制并自定义其中的设置。注意startup.options文件在服务启动的时候不会读取。如果你想修改Logstash启动脚本(如更改运行用户或更改配置文件路径。)你必须以root身份重新运行system-install脚本来使新的设置生效。

logstash.yml

你可以在此文件中设置如何运行Logstash。如:你可以对管道进行配置,设置配置文件的位置,日志文件的选项和其他设置。此文件中的大多数设置可以在命令行运行Logstash的时候直接指定。所有在命令行指定的设置会覆盖此文件中的配置。

logstash.yml文件使用YAML语言进行书写。此文件的位置因不同的平台有所不同,参考Logstash目录布局。你可以使用分级或平级的方式进行设置。例如以分级的方式设置管道中batch的大小和延迟:

pipeline:
  batch:
    size: 125
    delay: 50

TIP:关于batch的概念,在Logstash是如何运行的中有提到。在Logstash管道中,Inputs会将采集的内容发送到中央处理队列,后续的Logstash worker每次从这个队列中取走的数量叫batch。我也不知道这个要翻译成什么。直译过来有批处理的意思。

以平级的方式设置上面的内容:

pipeline.batch.size: 125
pipeline.batch.delay: 50

logstash.yml中支持bash风格的环境变量来设置各项的值。

pipeline:
  batch:
    size: ${BATCH_SIZE}
    delay: ${BATCH_DELAY:50}
node:
  name: "node_${LS_NODE_NAME}"
path:
   queue: "/tmp/${QUEUE_DIR:queue}"

注意形如${VAR_NAME:default_value}这种写法是支持的,如上面的示例中设定了一个batch延迟为50的默认值和path.queue的默认值为/tmp/queue

TIP:${VAR_NAME:default_value}这种写法的意思是如果变量有值,就用变量里的值,如果变量为空,就用默认值。

模块也可以在logstash.yml文件中进行配置。模块定义的格式如下:

modules:
  - name: MODULE_NAME1
    var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY1: VALUE
    var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY2: VALUE
    var.PLUGIN_TYPE2.PLUGIN_NAME2.KEY1: VALUE
    var.PLUGIN_TYPE3.PLUGIN_NAME3.KEY1: VALUE
  - name: MODULE_NAME2
    var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY1: VALUE
    var.PLUGIN_TYPE1.PLUGIN_NAME1.KEY2: VALUE

IMPORTANT:如果在命令行中使用 --modules指定模块选项,则文件中的定义会被忽略。

logstash.yml文件包含一下设置。如果你使用X-Pack,查看X-Pack在Logstash中的设置

SettingDescription(描述)Default value(默认值)
node.name 节点的描述性名称。 Machine’s hostname
path.data Logstash及其插件持久化的数据的目录 LOGSTASH_HOME/data
pipeline.id The ID of the pipeline. main
pipeline.workers 管道中filter和output阶段并行工作的worker的数量。 如果发现事件正在备份,或者CPU未饱和,请考虑增加此数量以更好地利用机器处理能力。 CPU核心数量
pipeline.batch.size 前面有提到,用来定义worker每次从inputs发送到中央队列中取出的batch的数量。更大的数量通常意味着更好的性能,但也会占用更多的内存,你可以在 jvm.options文件中增加JVM堆空间。更多信息参考: Logstash配置文件 125
pipeline.batch.delay 当创建管道数据batch都时候,worker等待inputs数据的时间,即使没有拿到batch.size定义的数据量。 50
pipeline.unsafe_shutdown 当此项设置为true的时候,在收到shutdown事件的时候Logstash会强制退出,即使仍有数据在内存中。默认情况下,Logstash会拒绝退出直到所有接收到的数据发送给outputs。启用此选项可能导致在关闭期间丢失数据。 false
path.config 指定主管道配置文件路径,如果路径是目录或者通配符,Logstash会根据字母顺序进行读取。 根据平台而异,参考: Logstash 目录布局.
config.string 包含用于主管道配置的一个字符串。和配置文件语法相同。 None
config.test_and_exit 当此项设置为true的时候,会检查配置文件,在完成之后退出。注意此项设置不会检查Grok匹配的正确性。 Logstash 可以从目录中读取多个配置文件。如果此项配置结合 log.level: debug,Logstash会对组合的配置的每一个配置添加注释。(Logstash会将配置文件中的每一项以Debug的形式显示出来) false
config.reload.automatic 当此项设置为true的时候,程序会周期性的检查配置文件的变化,并在有变化的时候重新加载配置文件。可以通过给进程发送SIGHUP信号来重读配置文件。 false
config.reload.interval Logstash检查配置文件变动的频率。 3s
config.debug 设置为 true的时候,将完整的编译配置作为debug日志消息。同时必须设置 log.level: debug. WARNING: 日志信息会包含明文密码。可能会导致你的密码明文出现在你的日志中。原文:The log message will include any password options passed to plugin configs as plaintext, and may result in plaintext passwords appearing in your logs! false
config.support_escapes 设置为true之后,将处理一下转意: \n 转成换行符 (ASCII 10). \r 转成回车(ASCII 13). \t 转成tab (ASCII 9). \\ 转成"\"本身 \\" 变成双引号 \'变成引号 false
modules When configured, modules must be in the nested YAML structure described above this table. None
queue.type 用于事件缓冲的内部队列模型。 设置为 memory 使用基于内存的队列, 或设置为 persisted 使用基于磁盘的 ACKed 队列 (persistent queues). memory
path.queue 启用持久化队列时的数据存储目录。 (queue.type: persisted). path.data/queue
queue.page_capacity 启用持久化队列时可以使用的页面文件大小。 (queue.type: persisted). The queue data consists of append-only data files separated into pages. 64mb
queue.max_events 启用持久化之后队列中未读事件的最大数量。 (queue.type: persisted). 0 (unlimited)
queue.max_bytes 队列最大的容量,以字节为单位,确保你定义的位置的磁盘上有足够的空间。 如果queue.max_eventsqueue.max_bytes同时定义,先到达的会生效。也就是小的生效。 1024mb (1g)
queue.checkpoint.acks 持久化队列开启的情况下,强制检查点之前ACKed事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.acks: 0 1024
queue.checkpoint.writes 持久化队列开启的情况下,强制检查点之前writes事件的最大数量。 (queue.type: persisted)。 设置为0表示不限制:queue.checkpoint.writes: 0 1024
queue.drain 开启之后,Logstash处理完成持久化队列之后才会关闭。 false
dead_letter_queue.enable 开启由插件提供的DLQ功能。 false
dead_letter_queue.max_bytes 每个dead letter队列的最大值。 超出的部分会被删除。 1024mb
path.dead_letter_queue 存储dead-letter队列的目录。 path.data/dead_letter_queue
http.host 设置绑定的IP地址 "127.0.0.1"
http.port 设置绑定的端口 9600
log.level 设置日志级别,有以下几种: fatalerrorwarninfodebugtrace info
log.format 设置日志格式。设置为json以JSON格式记录日志。或这只为 plain 使用 Object#.inspect记录日志。(应该是设置Logstash日志格式) plain
path.logs The directory where Logstash will write its log to. LOGSTASH_HOME/logs
path.plugins 指定Logstash搜索插件的目录,可以多次设置以设置多个查检目录。目录必须遵循以下结构: PATH/logstash/TYPE/NAME.rb其中TYPE is inputsfiltersoutputs, 或 codecsNAME就是插件的名字。 根据平台有差异,参考 Logstash 目录布局.
 

Secrets keystore for secure settings

当你配置Logstash的时候,你可能需要指定敏感设置或配置,如密码。你可以使用Logstash keystore安全的存储这些秘密的数据以便在配置中使用,而不是依赖文件系统权限来保护这些数据。

在往keystore添加一个key和其Secret value之后,你就可以在配置敏感设置的时候使用key来替代Secret value。

引用key的方式(语法)和引用变量的方式(语法)是一样的:

${KEY}

花括号中是key的名字。

如:假定keystore中包含一个名为ES_PWD值为yourelasticsearchpassword

  • 在配置文件中,使用方式:output { elasticsearch {...password => "${ES_PWD}" } } }(不是我多了一个括号,文档中就是多了一个括号。)
  • logstash.yml文件使用方式:xpack.management.elasticsearch.password: ${ES_PWD}

注意Logstash keystore有别于Elasticsearch keystore。Elasticsearch的keystore让你以名字的方式存储elasticsearch.yml中的值,Logstash的keystore允许你自定义在Logstash配置中引用的名字。(原文:Whereas the Elasticsearch keystore lets you store elasticsearch.yml values by name, the Logstash keystore lets you specify arbitrary names that you can reference in the Logstash configuration.)

NOTE:目前不支持从pipeline.yml文件和命令行(-e)选项引用keystore 数据。

NOTE:从centralized pipeline management引用keystore数据,需要每一个部署Logstash的实例本地有一个keystore副本。

当Logstash分析设置(logstash.yml)或配置(/etc/logstash/conf.d/*.conf)的时候,会在解析变量之前从keystore解析key。

Keystore password

你可以通过在环境变量LOGSTASH_KEYSTORE_PASS中存储密码来保护对Logstash keystore的访问。如果你在设置了这个变量之后创建Logstash keystore,这个keystore会被密码保护。这意味着这个环境变量必须可以被运行的Logstash实例访问。对于任何需要发出keystore命令的用户,也必须正确设置此环境变量。

我们推荐使用keystore密码,但这并不是强制的。即使你没有设置密码,数据依然会被加密。但是,我们仍然强烈建议您设置密码,并且对任何可能包含密码的环境变量的文件进行权限控制。如果你决定不设置密码,你可以跳过此章节。

示例:

set +o history
export LOGSTASH_KEYSTORE_PASS=mypassword
set -o history
bin/logstash-keystore create

此设置要求运行Logstash的用户定义环境变量LOGSTASH_KeyStore_PASS=mypassword。如果未定义环境变量,则Logstash无法访问keystore。(原文:This setup requires the user running Logstash to have the environment variableLOGSTASH_KEYSTORE_PASS=mypassword defined. If the environment variable is not defined, Logstash cannot access the the keystore.)

当你运行RPM或DEB包安装的Logstash的时候,环境变量来自于/etc/sysconfig/logstash

NOTE:你可能需要手动创建/etc/sysconfig/logstash文件。文件的属主必须是root权限600。文件内容的格式是ENVIRONMENT_VARIABLE=VALUE,每行一个条目。

对于如其他分发版,如Docker或ZIP,查看你的运行环境的文档(Windows,Docker,etc)来学习如何给运行Logstash的用户设置变量。并确保变量(以及密码)只能被那个用户访问。

Keystore location(Keystore的位置)

Keystore必须位于Logstash的path.settings目录。此目录和包含logstash.yml文件的目录是同一个目录。当对Keystore执行任何操作的时候,建议为Keystore 命令设置path.settings。如,对于使用RPM和DEB安装的Logstash创建一个keystore:

set +o history
export LOGSTASH_KEYSTORE_PASS=mypassword
set -o history
sudo -E /usr/share/logstash/bin/logstash-keystore --path.settings /etc/logstash create

查看Logstash目录布局来获取更多关于默认目录位置的信息。

NOTE:如果给path.settings指定了一个和logstash.yml所在目录不同的目录,你将会收到一个警告。

Create a keystore

使用create来创建一个keystore:

bin/logstash-keystore create

创建的keystore所在目录是在path.settings配置中定义的。

NOTE:创建keystore的时候建议设置一个keystore password

Add keys

要存储敏感信息,如Elasticsearch的认证凭据,使用add命令:

bin/logstash-keystore add ES_PWD

当出现提示的时候,为key输入一个值。

List keys

要查看keystore中定义的key列表,使用:

bin/logstash-keystore list

Remove keys

从keystore中移除key,使用:

bin/logstash-keystore remove ES_PWD

从命令行运行Logstash

使用下面的命令来从命令行中运行Logstash:

bin/logstash [options]

options是在命令行指定的可以用来控制Logstash运行的命令行标记。bin目录根据不同的平台有所不同,详见Logstash 目录布局

下面的示例从mypipeline.conf文件运行一个Logstash:

bin/logstash -f mypipeline.conf

命令行指定的选项将会覆盖logstash.yml中的选项,但文件并不会改变。后续的运行仍然会使用文件中的设定。

在你测试Logstash运行的时候,指定命令行选项是非常有用的。但是我们建议在生产环境中使用logstash.yml来控制Logstash的运行。使用设置文件让定义多个选项变得容易,且为你的每次运行Logstash提供了一个单一的可验证的文件。

Command-Line Flags

Logstash有下面这些选项(标记),你可以使用--help来查看相关信息。

--node.name NAME

​ 给Logstash实例定义名字,如果未定义,则默认值为当前的hostname。

-f, --path.config CONFIG_PATH

​ 从给定的文件或目录加载配置文件。如果给定的是目录,目录下的所有文件会按照字母顺序解析为一个文件加载。(文档没说,但应该是所有以conf结尾的文件,而不是所有文件)。此项不支持多次指定,如果你指定的多次,则最后一个生效。(如:-f foo -f bar等同于-f bar)。

​ 你可以使用通配符,匹配的所有文件会按照上述规则进行加载。如,你可以使用通配符按照名称加载特定的配置文件:

bin/logstash --debug -f '/tmp/{one,two,three}'

​ 这个命令中,Logstash包含了三个配置文件,/tmp/one,/tmp/two,/tmp/three,并将他们解析为一个文件。

-e, --config.string CONFIG_STRING

​ 使用给定的字符串作为配置数据。语法和配置文件相同。如果没有指定input,则使用下面的默认input:input { stdin { typre => stdin } },如果没有指定output,则使用下面的默认output:output { stdout { codec => rubydebug } },如果你希望全部使用默认值,给-e选项空字符串即可。默认为空。

--modules

​ 启动命名的模块。与-M选项配合给指定的模块的默认变量赋值。如果--modules在命令行中使用,所有在logstash.yml中定义的模块包括其他任何设定都会被忽略。此选项和-f,-e互斥,只能指定他们中的一个。可以使用逗号分隔多个模块,或者使用多次使用--modules

-M, --modules.variable

​ 为一个模块的可配置选项指定值。格式-M "MODULE_NAME.var.PLUGIN_TYPE.PLUGIN_NAME.KEY_NAME=value"用来给Logstash 变量设定。对于其他设定,可能是-M "MODULE_NAME.KEY_NAME.SUB_KEYNAME=value"。必要的是后-M可以使用多次。如果没有指定-M,则会使用默认值。-M选项只能配合--modules。如果没有指定--modules-M会被忽略。

--pipeline.id ID

​ 设定pipeline的ID,默认是main

-w, --pipeline.workers COUNT

​ 设置管道中worker的数量。此选项设置在filter和output阶段并行执行的worker的数量。如果发现事件正在备份或者CPU负载较低,可以考虑增加worker的数量,以最大化利用机器性能。默认情况下worker的数量为CPU核心数量。

-b, --pipeline.batch.size SIZE

​ batches的大小。这个选项定义了单个worker在执行filters和outputs之前从input每次取走的事件的最大数量。默认是125。通常更大的batch意味着更高的收益,但也意味着更大的内存消耗。为此可能需要在jvm.options中增加JVM的可用空间。更多相关信息查看Logstash 配置文件

-u, --pipeline.batch.delay DELAY_IN_MS

​ 当创建batches的时候,从input等待事件的超时时长。这个选项定义了如果取不到定义的batch的大小的情况下等待多少毫秒。默认是50毫秒。

--pipeline.unsafe_shutdown

​ 强制退出Logstash即使内存中仍有在处理的事件。默认情况下Logstash会拒绝退出直到接收的事件处理全部交给outputs。开启之后可能在关闭的时候丢失数据。

--path.data PATH

​ 此选项须指向一个可写的目录。Logstash会在需要存储数据的时候使用次目录。插件也需要对此目录可以访问。默认的data目录是Logstash的家目录。

-p, --path.plugins PATH

​ 指定插件的默认目录。可以通过引用多次来包含多个目录。插件应该位于特定的目录层次之中:/PATH/logstash/TYPE/NAME.rb其中TYPE指的是inputs,filters,outputscodecsNAME即插件名。

-l, --path.logs PATH

​ Logstash的日志目录。

--log.level LEVEL

​ 设置日志等级,可能的值包括:

  • fatal:记录非常严重的错误信息,通常此信息之后程序即异常中止。
  • error:记录错误信息
  • warn:记录警告信息
  • info:记录运行的详细信息(默认)
  • debug:记录debugging信息(用于开发者)
  • trace:记录比debugging更加详细的信息

--config.debug

​ 将完全编译的配置作为调试日志输出(必须同时将--log.level=debug开启)。警告:日志信息会包含所有明文传递的密码,这些信息会被记录到日志中!(原文:The log message will include any passwordoptions passed to plugin configs as plaintext, and may result in plaintext passwords appearing in your logs!)注:这里的密码应该指的是程序、插件通信用到的配置中的密码。

-i, interactive SHELL

​ Drop to shell instead of running as normal. Valid shells are "irb" and "pry".(不知道这个设定是什么意思。)

-V, --version

​ 显示版本,然后退出。原文:Emit the version of Logstash and its friends, then exit.

-t, --config.test_and_exit

​ 价差配置文件的语法,然后退出。注意Grok匹配规则不会被检查。Logstash可以读取多个配置文件从一个目录。如果同时指定了--log.level=debug,Logstash将组合多个配置文件的日志,并给每个配置块添加来源注释。

-r, --config.reload.automatic

​ 监控配置文件的变化,并在其发生变化的是后重载。NOTE:使用SIGHUP信号也可以重载配置文件,默认此配置为false。

--config.reload.interval RELOAD_INTERVAL

​ 检查配置文件变化的间隔时间,默认是"3s"。

--http.host HTTP_HOST

​ 指定要绑定的IP地址,默认是"127.0.0.1"。

--http.port HTTP_PORT

​ 指定监听的端口。默认是9600-9700。可以接受9600-9700这种格式的范围设定,Logstash会使用第一个可用的端口。

--log.format FORMAT

​ 指定Logstash记录日志的格式,JSON(每行一个事件)或文本(使用Ruby’s Object#inspect)。默认是文本。

--path.settings SETTINGS_DIR

​ 指定包含logstash.yml配置文件以及log4j配置。此设置还可以通过LS_SETTINGS_DIR 变量来设置。默认的目录是Logstash家目录下的config目录。

-h, --help

​ 显示帮助信息。

Logging

Logstash会在运行过程将自身内部的日志发出,存放在LS_HOME/logs(使用RPM/DEB安装的放在/var/log/logstash下)。默认的日志级别是INFO。Logstash的日志框架基于Log4j 2,其大部分的功能面向用户开放。

你可以为子系统,模块或插件配置特定的日志。

当你需要进行故障排查尤其是和插件相关的时候。将日志等级调整到DEBUG来获的更多信息。比如你要对Elasticsearch Output的问题进行Debug,你可以只为这个组件升级日志。这种方法可以帮你降低过多信息带来的干扰,帮助你更好的将精力集中在问题区域。

你可以通过log4j2.properties文件或Logstash API来配置日志。

  • log4j2.properties文件。通过修改log4j2.properties文件配置,需要你重启Logstash来生效。更改之后在之后的运行中设置会一直生效。
  • Logstash API。通过此种方法可以使修改立即生效,但在Logstash重启之后配置丢失。

Log4j2 configuration

Logstash附带了一个可以直接使用的log4j2.properties文件。你可以通过修改此文件来配置轮转策略,类型和其他log4j2 configuration

你必须重启Logstash来应用此文件中的更改。更改会在之后的运行中一直有效。

这儿有一个使用outputs.elasticsearch做的演示:

logger.elasticsearchoutput.name = logstash.outputs.elasticsearch
logger.elasticsearchoutput.level = debug

Logging APIs

对于临时修改配置,编辑log4j2.properties会带来不必要的停机时间。你可以通过logging API来动态修改配置。这些修改会立即生效,且不需要重新启动Logstash。

NOTE:默认情况下,Logging API绑定在tcp:9600端口。如果端口被另一个Logstash实例占用,你需要使用

--http.port来绑定一个不同的端口。更多信息可以查看命令行选项

Retrieve list of Logging configurations

要在运行的时候获取可用的日志配置列表,可以使用GET请求_node/logging。(原文:To retrieve a list of logging subsystems available at runtime, you can do a GET request to _node/logging

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

返回示例:

{
...
  "loggers" : {
    "logstash.agent" : "INFO",
    "logstash.api.service" : "INFO",
    "logstash.basepipeline" : "INFO",
    "logstash.codecs.plain" : "INFO",
    "logstash.codecs.rubydebug" : "INFO",
    "logstash.filters.grok" : "INFO",
    "logstash.inputs.beats" : "INFO",
    "logstash.instrument.periodicpoller.jvm" : "INFO",
    "logstash.instrument.periodicpoller.os" : "INFO",
    "logstash.instrument.periodicpoller.persistentqueue" : "INFO",
    "logstash.outputs.stdout" : "INFO",
    "logstash.pipeline" : "INFO",
    "logstash.plugins.registry" : "INFO",
    "logstash.runner" : "INFO",
    "logstash.shutdownwatcher" : "INFO",
    "org.logstash.Event" : "INFO",
    "slowlog.logstash.codecs.plain" : "TRACE",
    "slowlog.logstash.codecs.rubydebug" : "TRACE",
    "slowlog.logstash.filters.grok" : "TRACE",
    "slowlog.logstash.inputs.beats" : "TRACE",
    "slowlog.logstash.outputs.stdout" : "TRACE"
  }
}

Update logging levels

Prepend the name of the subsystem, module, or plugin with logger..

这里是使用outputs.elasticsearch的一个示例:

curl -XPUT 'localhost:9600/_node/logging?pretty' -H 'Content-Type: application/json' -d'
{
    "logger.logstash.outputs.elasticsearch" : "DEBUG"
}'

当次设置生效的时候,Logstash配置中所有Elasticsearch outputs日志将调整为DEBUG级别。注意这个设置是暂时的,会在重启Logstash之后失效。

NOTE:如果你想要在重启之后仍然有效,将此配置添加到log4j2.properties文件中。

Reset dynamic logging levels

要将通过logging API动态修改的配置恢复,发送一个PUT请求到_node/logging/reset。所有的日志级别会恢复到log4j2.properties文件中定义的级别。

curl -XPUT 'localhost:9600/_node/logging/reset?pretty'

Log file location

你可以通过--path.logs来指定日志文件的位置。

Slowlog

慢日志给Logstash增加了一种当某个特定事件花费了异常时间之后才能过管道时进行记录的能力。就像正常的应用日志,你可以在你--path.log指定的目录中找到慢日志。慢日志在logstash.yml文件中定义,使用下面的选项:

slowlog.threshold.warn (default: -1)
slowlog.threshold.info (default: -1)
slowlog.threshold.debug (default: -1)
slowlog.threshold.trace (default: -1)

慢日志默认是关闭的。默认的阈值为-1nanos表示没有限制,即不会产生慢日志。(即无论多久都不算慢)

Enable slowlog

slowlog.threshold字段支持多种时间格式,且支持广泛的触发间隔。可以使用的单元有:nanos(飞秒),micros(微秒),ms(毫秒),s(秒),m(分钟),h(小时),d(天)。

慢日志会随着日志级别的提高变得更加敏感,从而生成更多事件。

slowlog.threshold.warn: 2s
slowlog.threshold.info: 1s
slowlog.threshold.debug: 500ms
slowlog.threshold.trace: 100ms

这个示例中:

  • 如果日志级别为warn,慢日志将会记录超过2s的事件
  • 如果日志级别为info,慢日志将会记录超过1s的事件
  • 如果日志级别为trace,慢日志将会记录超过100ms的事件
  • 如果日志级别为debug,慢日志将会记录超过500ms的事件

The logs include the full event and filter configuration that are responsible for the slowness.(不知道怎么翻译,大概意思应该是,日志会包含慢日志相关的日志。)

Shutting Down Logstash

如果你是以服务方式运行Logstash,使用下面的命令来停止它:

  • 在使用systemd的系统上:
systemctl stop logstash
  • 在使用upstart的系统上:
initctl stop logstash
  • 在使用sysv的系统上:
/etc/init.d/logstash stop

如果你在一个POSIX系统上的命令行中运行Logstash,你可以通过发送SIGTERM给Logstash进程来停止它。如:

kill -TERM {logstash_pid}

或者在命令行中按Ctrl+C

What Happens During a Controlled Shutdown?

当你试图关闭一个正在运行的Logstash实例的时候,Logstash在其安全关闭之前会执行一些步骤。包括:

  • 停止所有的input,filter和output插件
  • 处理所有in-flight事件
  • 中止Logstash进程

下面的情况会影响Logstash的关闭进程。

  • Input插件在缓慢的接收数据
  • 一个缓慢的过滤器,例如Ruby filter执行了一个sleep(10000)或者Elasticsearch filter执行了一个非常繁重的查询。
  • 一个已经断开的output插件,等待重连来刷新in-flight事件。

管道配置文件的结构

Configuring Logstash(管道)

要配置Logstash,创建一个配置文件,指定要使用的插件以及每个插件的配置.您可以引用配置中的事件字段,并在事件符合特定标准时使用条件语句来处理事件。当你运行Logstash的时候,使用-f来指定你的配置文件.

让我们通过创建一个简单的配置文件并使用它来运行logstash.创建一个名为logstash-simple.conf的文件并将其放在和Logstash主目录中.

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

然后运行logstash并使用-f指定你的配置文件

bin/logstash -f logstash-simple.conf

管道配置文件的结构

对于每一种你想要添加到事件处理管道中的插件,Logstash管道配置文件中都有一个独立的配置段.示例:

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

filter {
  ...
}

output {
  ...
}

每个配置段包含一个或多个插件的配置.如果你定义了多个filter,他们会按照配置文件中出现的顺序生效.

插件配置

一个插件的配置由插件名和其后跟随的一块此插件的设置组成.如,这个配置段包含两个文件的inputs:

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

这个示例中,配置了两个设置给两个不同的inputs类型:path 和 type.
你可以根据插件的不同类型进行不同的配置.更多关于每个插件的信息可以查看:Input PluginsOutput PluginsFilter Plugins, and Codec Plugins.

值类型

插件的某个设定的值可以使用某些类型的值来指定.如布尔,列表,或哈希.下面是支持的数据类型.

数组

现在这种类型基本不再使用,而是使用标准类型如string来定义为形如:list => true以方便检查.对于仍然需要处理哈希列表或混合之类不需要检查的地方仍然需要.

原文:This type is now mostly deprecated in favor of using a standard type like string with the plugin defining the :list => true property for better type checking. It is still needed to handle lists of hashes or mixed types where type checking is not desired.

示例:

  users => [ {id => 1, name => bob}, {id => 2, name => jane } ]

列表

本身不是类型,但是可以有属性类型.This makes it possible to type check multiple values. Plugin authors can enable list checking by specifying :list => true when declaring an argument.
示例:

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

这个示例配置path,一个包含三个字符串中的每个元素的string列表.同时使用uris配置了一个URI列表,如果包含不可用的URIs,配置将会失败.原文:This example configures path, which is a string to be a list that contains an element for each of the three strings. It also will configure the uris parameter to be a list of URIs, failing if any of the URIs provided are not valid.

TIP :我只看到两个字符串,但是原文是三个.可能我理解有误.但我觉得是文档写错了.

布尔

一个布尔值必然是truefalse.注意truefalse关键字不要使用引号引起来.

示例:

  ssl_enable => true

字节

字节字段是表示有效字节单位的字符串的字段.是一种很方便的方式在你的插件配置中声明特定的大小. SI (k M G T P E Z Y)和二进制(Ki Mi Gi Ti Pi Ei Zi Yi)单位都是支持的.二进制使用base-1024换算,SI使用1000换算.这个字段不区分大小写,并且在值和单位之间可以有空格.如果没有指定单位,则表示字节.

示例:

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

一个codec是Logstash codec用来表示数据的名字.Codec可以同时用在inputs和outputs.

Input codecs提供了一中在你的数据进入input之前解码数据的简单的方法.Output codecs提供了一种在你的数据从output出去之前编码的简单的方法.使用input和output codecs可以不必在你的Logstash管道中设置单独的filter.

可以在Codec Plugins页面查看可用的codecs列表.

示例:

  codec => "json"

哈希

一个哈希是一个格式为"fild1" => "value1"的K/V集合.注意多个键值对使用空格而不是逗号分隔.

示例:

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

数字

数字必须是一个有效的数值(浮点型或整型).

示例:

port => 33

密码

密码是一个不会被记录日志或输出的单一的字符串值.

示例:

my_password => "password"

URI

URI可以是完整的URL,如http://elastic.co/,也可以是像foobar这样的简单标识符。如果一个URI包含密码类似http://user:pass@example.net,其中的密码部分将不会被记录日志或显示.

示例:

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

Path

一个Path是一个用来表示一个有效的操作系统path的字符串.

示例:

my_path => "/tmp/logstash"

字符串

字符串必须是一个单字符序列.注意字符串的值需要用引号引起来,单引号双引号都可以.

转义序列

默认情况下转义序列是未开启的.如果你想在引用的字符串中使用转义序列.你需要在logstash.yml文件中设置config.support_escapes: true.当设置为true时,带引号(单引号和双引号)的字符串将按照下面的进行转义:

TextResult
\r 回车(ASCII 13)
\n 换行(ASCII 10)
\t tab(ASCII 9)
\\ 反斜杠(ASCII 92)
\" 双引号(ASCII 34)
\' 单引号(ASCII 39)

示例:

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

注释

注释方式同perl,ruby,python相同.在注释内容的前面加一个#号,并且不需要在行首.如:

# this is a comment

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

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

 

Logstash agent是一个有着三个阶段的处理管道。包括:inputs→filters→outputs。Inputs生成事件,filters修改他们,outputs将他们送到任何地方。

所有的事件都有自己的特性。如Apache的访问日志会包括如状态码(200,404),请求路径("/","index.html"),HTTP verb(GET,POST),客户端IP地址等。Logstash将这些特性称作"fields"。

Logstash中的一些配置选项需要字段的存在才能发挥作用。因为inputs生成事件,所以在input阶段没有可用发fields,此时fields还不存在。原文:Because inputs generate events, there are no fields to evaluate within the input block—they do not exist yet!

因为对事件和fields的依赖,下面的配置仅工作在filter和output。

IMPORTANT:下面提到的字段引用,sprintf格式和条件不能在input工作。

字段引用

通常来说能够使用名字引用字段是很有用的。为此你可以使用Logstash的字段引用语法。

访问字段的语法是[fieldname]。如果你访问一个top-level field(顶级字段),你可以省略[]只用fieldname。要引用一个nested field(嵌套字段),你需要声明字段的完整路径:[top-level field][nested field]

示例:下面的事件有5个顶级字段(agent,ip,request,response,ua)和三个嵌套字段(status,bytes,os)。

{
  "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].要引用顶级字段如request,你可以值声明字段名.

sprintf 格式

字段引用格式还可以用一种Logstash称作sprintf的格式.这种格式允许你引用字段值从其他字符串中. For example, the statsd output has an incrementsetting that enables you to keep a count of apache logs by status code:

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

注:这段,有点难度.示例使用了一个叫statsd的插件.由于目前我还不知道这个插件的用途.所以,示例的描述信息不好理解.放上原文,自行脑补.

The field reference format is also used in what Logstash calls sprintf format. This format enables you to refer to field values from within other strings. For example, the statsd output has an incrementsetting that enables you to keep a count of apache logs by status code:

同样的,您可以将@timestamp字段中的时间戳转换为字符串。不要在大括号内指定字段名,而是使用+FORMAT语法,其中FORMAT时间格式

Similarly, you can convert the timestamp in the @timestamp field into a string. Instead of specifying a field name inside the curly braces, use the +FORMAT syntax where FORMAT is a time format.

比如,你想要文件输出根据事件的日期和时间以及类型字段写入日志:

For example, if you want to use the file output to write to logs based on the event’s date and hour and the type field:

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

条件式

有些时候你只想在特定条件下过滤和输出事件.这种情况,你可以使用条件式.

Logstash的条件式看起来和其他编程语言用法相同.条件式支持if,else ifelse语句,并且支持嵌套.

条件式的语法是:

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

什么是条件式?测试比较,布尔逻辑等等!

你可以使用下面的比较运算符.

  • 等式:==,!=,<,>,<=,>=
  • 正则匹配:=~,!~(检查右边的正则能否匹配左边的字符串)
  • 包含:in,not in

支持的布尔操作为:

  • and,or,nand(与非,具体怎么运算自行百度吧.头一次听这个逻辑运算),xor

表达式可以写的很长很复杂,表达式中可以包含其他的表达式,你可以使用!来让表达式失效,也可以使用(...)来给他们分组.

比如下面的条件式使用mutate过滤器来移除secret字段,如果field字段的值为login:

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

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

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

你可以使用in来测试一个字段是否包含一个特定的字符串,key,或(for lists) 元素

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" }
  }
}

你可以以同样的方式使用not in条件式.比如你可以使用not in来只将grok成功的事件存入Elasticsearch:

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

你可以检查一个特定的字段是否存在,但是目前并不能区分不存在的字段和有错误的字段.表达式if [foo]会返回false在以下情况:

  • [foo]字段不存在,
  • [foo]存在,but is false(应是其值为false),或者
  • [foo]存在,但为空

更多示例参考使用条件式章节.

@metadata字段

在Logstash1.5及之后的版本中,有一个叫做@metadata的特殊字段.@metadata中的内容不会在输出的时候成为你事件的一部分,这使得它很适合用于条件式,或者使用字段引用和sprintf格式来扩展和构建事件字段.

下面的配置文件将从STDIN产生事件.任何输入都会变成事件中的message字段.Filter块中的mutate事件将添加一些字段,其中有些嵌套在@metadata字段.

input { stdin { } }

filter {
    mutate { add_field => { "show" => "This date 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 }
    }
}

让我们看看输出了什么:

$ 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变成了message字段的内容,并且条件式成功的评估了@metadata中嵌套的test字段中的内容.但是在output中并没有显示一个叫@metadata的字段及其内容.

Rubydebug codec允许你暴露@metadata字段中的内容,如果你在配置中添加了metadata => true:

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

让我们看看这次的输出有什么变化:

$ 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"
}

现在你可以看到@metadata字段和它的子字段了.

IMPORTANT:只有rubydebug codec可以允许你显示@metadata字段中的内容.

在你需要一个临时字段,但又不想它最终输出的时候,可以使用@metadata字段.

这个新字段最常见的用例之一可能是日期过滤器和临时时间戳.

这个配置文件已经被简化,但使用了Apache和Nginx通用的时间戳格式.过去,在使用时间戳字段覆盖@timestamp字段之后你必须自己删除时间戳字段.使用@metadata字段,这不在是必要操作.

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 filter中提取的日期放入[@metadata][timestamp]字段中.让我们给这个配置提供一个日期字符串样本,看看结果如何:

$ 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"
}

Logstash配置示例

 

以下示例说明如何配置LogStash来过滤事件,对Apache日志和syslog进行处理,并且使用条件式来控制被filter或output处理的事件.

TIP:如果你需要构建grok匹配的帮助,试试我们的Grok Debugger.Grok Debugger是基础授权下的X-Pack的一个特性所以是可以免费使用的.

配置Filters

Filters是一种在线处理机制,可以灵活地对数据进行切片和切割,以满足您的需求.让我们看一些正在使用的filters.下面的配置文件设置了grokdatefilters.

input { stdin { } }

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}" }
        }
    date {
        match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
        }
    }
output {
    elasticsearch { hosts => ["localhost:9200"] }
    stdout { codec => rubydebug }
    }

使用此配置文件运行Logstash:

bin/logstash -f logstash-filter.conf

现在,将下面的内容粘贴到你的终端上,并按下回车stdin input进行处理:

127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] "GET /xampp/status.php HTTP/1.1" 200 3891 "http://cadenza/xampp/navi.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0"

你会看到类似下面的输出:

{
        "message" => "127.0.0.1 - - [11/Dec/2013:00:01:45 -0800] \"GET /xampp/status.php HTTP/1.1\" 200 3891 \"http://cadenza/xampp/navi.php\" \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\"",
     "@timestamp" => "2013-12-11T08:01:45.000Z",
       "@version" => "1",
           "host" => "cadenza",
       "clientip" => "127.0.0.1",
          "ident" => "-",
           "auth" => "-",
      "timestamp" => "11/Dec/2013:00:01:45 -0800",
           "verb" => "GET",
        "request" => "/xampp/status.php",
    "httpversion" => "1.1",
       "response" => "200",
          "bytes" => "3891",
       "referrer" => "\"http://cadenza/xampp/navi.php\"",
          "agent" => "\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:25.0) Gecko/20100101 Firefox/25.0\""
}

如你所见,Logstash(在grokfilter的帮助下)可以解析日志行(日志刚好是Apache "combined log"格式的)并将其分解为分散的信息位.这是非常有用的,一旦你开始查询和分析我们的日志数据.比如,你可以更加轻松的管理关于HTTP响应码,IP地址,referres等信息. Logstash中包含了相当多的开箱即用的grok匹配.因此,如果你需要解析一个通用的日志格式,很有可能有人已经为你做了这项工作。更多信息,可以查看我们在GitHub上的Logstash grok patterns列表.

另一个在本示例中使用的filter是datefilter.这个filter解析出一个timestamp(时间戳)并将其作为事件的时间戳(不论你何时获取的你的日志数据).你可能注意到了在这个示例中@timestamp字段被设置为2013.12.11尽管Logstash是在这之后的某个事件点接收的这个事件.

处理Apache日志

让我们做一些真正有用的事情:处理Apache2的访问日志文件!我们将从本地读取一个文件到input,并且使用条件式来根据我们的需要处理事件.首先,创建一个名字类似于logstash-apache.conf的文件,内容如下(你可以根据自己的情况修改日志文件的路径):

input {
  file {
    path => "/tmp/access_log"
    start_position => "beginning"
  }
}

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

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

然后,创建你在上述配置中的input文件(示例中为"/tmp/access_log")并使用下面的日志内容(或者你可以使用来自自己网站的内容):

71.141.244.242 - kurt [18/May/2011:01:48:10 -0700] "GET /admin HTTP/1.1" 301 566 "-" "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
134.39.72.245 - - [18/May/2011:12:40:18 -0700] "GET /favicon.ico HTTP/1.1" 200 1189 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.2; .NET4.0C; .NET4.0E)"
98.83.179.51 - - [18/May/2011:19:35:08 -0700] "GET /css/main.css HTTP/1.1" 200 1837 "http://www.safesand.com/information.htm" "Mozilla/5.0 (Windows NT 6.0; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"

现在,用-f选项来使用指定的配置文件启动Logstash

bin/logstash -f logstash-apache.conf

现在你应该可以在Elasticsearch中看到你的Apache日志数据.Logstash打开并读取指定的input文件,处理每一个遇到的事件.所有向此文件追加的行也会被捕获,被Logstash作为事件处理,然后存储在Elasticsearch中.一个额外的好处是"type"字段被设置为"apache_access"(这是由 type => "apache_access"这一行决定的).

这个配置文件中,Logstash只监视了Apache访问日志,不过你可以很轻松的监控访问日志和错误日志(事实上,所有可以匹配*log的文件),通过修改上述配置中的一行:

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

当你重启Logstash,它将同时处理错误日志和访问日志.不过,如果你检查你的数据(使用Elasticsearch-kopf之类的),你可能会发现access_log被解析成了多个字段,但是error_log不是.这是因为我们使用的grokfilter只匹配了标准的apache日志格式,并自动将其分割成不同的字段.如果我们能根据每一行的格式来控制其解析方式不是更好吗?当然,我们可以...

注意Logstash不会重新处理已经看到过的access_log文件中的时间.当从一个文件读取的时候,Logstash会保存其位置并且只处理新增的行.Neat!

使用条件式

你可以使用条件式来控制被filter或output处理的事件.比如,你可以根据事件出现在的文件对其进行标记(access_log, error_log, 或者随便其他以 "log"结尾的文件).

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 }
}

这个示例使用type字段标记了所有事件,但并没有真正解析errorrandom文件.错误日志的类型如此之多,如何给它们标记取决于你使用的日志文件.

同样的,你可以使用条件式来将时间重定向到指定的outputs.比如,你可以:

  • 将apache状态码为5xx的时间发送给nagios报警
  • 将状态码4xx的记录到Elasticsearch
  • 将所有的信息记录到statsd

要通知nagios关于http 5xx的事件,首先需要检查type字段.如果是apache,就看它的状态码是否包含5xx错误.如果是,发送给nagios.如果不是5xx错误,检查是够包含4xx错误,如果是,发送给Elasticsearch.最后将所有的apache状态码发送给statsd.

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发送给集中式的日志服务器.对于这个例子,你不需要一个syslog实例,我们将从命令行中模拟它,以便您能够了解所发生的事情。

首先,我们为Logstash+syslog创建一个简单的配置文件,叫做logstash-syslog.conf.

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

bin/logstash -f logstash-syslog.conf

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

telnet localhost 5000

粘贴下面的示例内容(你可以使用自己的内容,但要注意,grokfilter可能不能正确解析你的数据)

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'.

现在你应该可以在你之前的Logstash窗口看到处理并解析过的信息.

{
                 "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"
}

配置集中式管道管理

要安装集中式管道管理

  1. 确定你使用的授权包括管道管理功能。

    更多信息,查看https://www.elastic.co/subscriptionsLicense Management

  2. logstash.yml中指定configuration management settings。至少包含下面的设置

    • xpack.management.enable: true来开启集中式配置管理。
    • xpack.management.elasticsearch.url来指定将会存储Logstash管道配置和元数据的Elasticsearch实例。
    • xpack.management.pipeline.id来注册你想要集中管理的管道。
  3. 重启Logstash。

  4. 如果Elasticsearch使用了基本认证进行保护,给将要使用集中管道管理的任何用户分配logstash_admin的角色。参见X-Pack security

NOTE:在配置并启用X-Pack security之前,集中式管理是禁用的。(这句话让我不是很明白集中式管道管理开启的前提是开启X-Pack Security还是说在开启X-Pack Security之后如果没有正确配置则集中式管理会被禁用,区别在于X-Pack security是否是必须开启的。)

Centralized management is disabled until you configure and enable X-Pack security.

IMPORTANT:在配置Logstash使用集中式管道管理之后,本地管道配置将不再可用。这意味着pipeline.yml文件和类似path.config以及config.string的设置将不再处于活跃状态。

Logstash中的配置管理策略(设置)

你可以设置下面的xpack.management设置在logstash.yml文件中来开启集中式管道管理。更多配置Logstash的信息,查看logstash.yml

下面的基本示例假定Elasticsearch和Kibana已经在本地安装并且开启了基本认证,但没有SSL。如果你使用SSL,你需要指定额外的SSL设置。

xpack.management.enabled: true
xpack.management.elasticsearch.url: "http://localhost:9200/"
xpack.management.elasticsearch.username: logstash_admin_user
xpack.management.elasticsearch.password: t0p.s3cr3t
xpack.management.logstash.poll_interval: 5s
xpack.management.pipeline.id: ["apache", "cloudwatch_logs"]

xpack.management.enabled

​ 设置为true表示为Logstash开启X-Pack 集中式配置管理。

xpack.management.logstash.poll_interval

​ Logstash实例轮询来自Elasticsearch的管道更改的频率。默认值为5s。

​ How often the Logstash instance polls for pipeline changes from Elasticsearch. The default is 5s.

xpack.management.pipeline.id

​ 指定以逗号分隔的管道标识列表,以便为集中式管道生产管理注册。更改此设置后,您需要重新启动Logstash来使更改生效。

xpack.management.elasticsearch.url

​ 存储Logstash管道配置和元数据的Elasticsearch示例。可以是和outputs中的相同的实例,也可以是不同的。默认是 http://localhost:9200.

xpack.management.elasticsearch.username and xpack.management.elasticsearch.password

​ 如果你的Elasticsearch集群使用基本认证进行保护,这些设置提供用户名和密码,Logstash实例使用这些用户名和密码对访问配置数据进行身份验证。你在这里指定的用户名和密码必须具有logstash_admin角色,它提供对于.logstash-*的索引的认证。

xpack.management.elasticsearch.ssl.ca

​ 可选项,你可以给你的Elasticsearch示例指定一个.pem文件格式的证书的路径。

xpack.management.elasticsearch.ssl.truststore.path

​ 可选设置,提供了验证服务器证书的Java密钥库(JKS)的路径。

​ Optional setting that provides the path to the Java keystore (JKS) to validate the server’s certificate.

xpack.management.elasticsearch.ssl.truststore.password

可选项,向truststore提供一个密码

xpack.management.elasticsearch.ssl.keystore.path

​ 可选设置,提供了验证客户端证书的Java密钥库(JKS)的路径。

​ Optional setting that provides the path to the Java keystore (JKS) to validate the client’s certificate.

xpack.management.elasticsearch.ssl.keystore.password

​ 可选设置,向keystore提供密码。

​ Optional setting that provides the password to the keystore.

集中式管道管理

 

管道管理特性在Kibana中集中了创建和管理Logstash管道配置的功能.

NOTE:集中式管道管理是不包括在基本许可内的X-Pack的特性.如果你想要使用所有的功能,你可以试用30天.试用结束后,你可以购买我们的订阅来继续使用X-Pack的所有功能.更多信息请参考https://www.elastic.co/subscriptions 和 License Management.

你可以在Kibana的管理页面中控制多个Logstash的实例.你可以增加,编辑和删除管道配置.在Logstash端,你只需要简单的配置以开启配置管理以及注册Logstash以使用集中式的管道配置.

IMPORTANT:在你配置Logstash使用集中式管道管理之后,你可以不必在指定本地配置.并且pipelins.yml文件以及path.configconfig.string的设置也将在开启集中式管道管理之后失效.

管理管道

在使用管道管理之前,你必须:

额外信息:上面两个链接中的章节,在官方文档目录中并不存在.但根据页面上的前后翻页信息来看,是有完整的一个章节的.

在Kibana中管理Logstash管道:

  1. 在你的浏览器中打开Kibana并切换到Management标签.如果你正确配置了配置管理,你会看到一个管理Logstash的区域.static/management/images/centralized_config.png

  2. 点击 Pipeline链接.

  3. 要添加新的管道,点击Create pipeline并制定值.

Pipeline IDA name that uniquely identifies the pipeline. This is the ID that you used when you configured centralized pipeline management and specified a list of pipeline IDs in the xpack.management.pipeline.id setting.
Description 管道配置的描述.这个信息是你自己用的.
Pipeline 管道配置,你可以像对待其他编辑器一样对待这里的编辑器.并且你不必担心空白和所进的问题.
Pipeline workers 管道中运行filter以及output阶段并行工作的worker的数量
Pipeline batch size 每个工作线程向filter和output传递事件的时候,每次传送的事件的最大数量
Pipeline batch delay 每个工作线程在获取事件时,在无法达到最大事件数量的时候每个worker等待的时长(以毫秒为单位) (这个配置和上一个是有关系的,即Logstash在处理事件的时候每个worker会收集一定量的事件交由后续处理,如果在在规定时间内依旧无法收集到足够的事件,worker不会在继续等待.这里配置的就是这个等待时间.)
Queue type 事件缓冲区的队列模型.
Queue max bytes 所有队列的容量
Queue checkpoint writes 启用持久队列时,在强制检查点之前写入的最大事件数。The maximum number of events written before a checkpoint is forced when persistent queues are enabled.

管道行为

  • 管道的配置和元数据存储在Elasticsearch中.对管道定义所做的任何更改都会被注册使用的所有Logstash示例自动读取和加载.(类似配置中心的概念).更改会立即生效.如果Logstash注册使用了管道,你不必重新启动Logstash来读取配置.
  • 管道将在所有注册使用的Logstash上运行.Kibana保存新的配置,Logstash尝试载入.There is no validation done at the UI level.
  • 你需要在本地Logstash日志中检查配置错误.如果你使用了X-Pack的监控功能,在监控页面查看Logstash实例的状态.
  • 你可以定义多个管道配置并行运行在同一个Logstash节点上.
  • 如果你编辑并保存了配置,Logstash会在后台重新加载配置并继续处理事件.
  • 如果你尝试在Kibana中删除一个正在运行中的管道,Logstash将会尝试停止这个管道.Logstash会等待事件处理完毕.在你删除一个管道之前,确保你理解你的数据源.停止管道可能会导致数据丢失.

 

posted @ 2022-04-20 23:14  hanease  阅读(685)  评论(0编辑  收藏  举报