Logstash管道在大多数用例有一个或多个输入,过滤器,和输出插件。本节中的场景构建Logstash配置文件指定这些插件和讨论每个插件都做什么。
Logstash配置文件定义了你Logstash管道。当你开始一个Logstash实例,使用 - f< path/to/file>选项指定的配置文件,它定义了实例的管道。
Logstash 管道必要的两个元素,input和output,和一个可选的元素,filter。输入插件将数据源的数据输入,过滤器插件主要修改数据成为您指定数据,输出插件主要将数据写入到另一个目的源。
以下文字代表了一个基本管道配置文件的架构:
# 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 {
}
这个构架没有任何功能,因为输入和输出没有任何有效的定义。本教程的示例构建的配置文件用来解决特定的用例。
将基本架构粘贴到你Logstash根目录下的一个名为 first-pipeline.conf的文件中。(没有的话创建一个)
这个示例创建了一个Logstash管道需要Apache web日志作为输入,分析这些日志创建特定的命名字段的日志,并将解析后的数据写入一个Elasticsearch集群。
你可以下载这个例子中使用的样本数据集。解压缩这个文件。
点击下载官方样例
开始使用你的Logstash管道,配置Logstash实例从你的输入管道读取一个文件。
编辑first-pipeline.conf文件,添加下面的内容:
input {
file {
path => "/path/to/logstash-tutorial.log"
start_position => beginning //1
ignore_older => 0 //2
}
}
文件输入插件默认行为忽略最后修改时间大于86400s的文件。因此,为了改变这种默认行为并且处理个别的文件(时间可以大于一天),我们需要指定不要忽略这些旧文件。
在你的文件系统中,用你的实际路径logstash-tutorial.log替换/path/to/。
Grok过滤器插件是Logstash默认可以使用的插件之一。关于如何管理使用Logstash插件,可以查看插件管理章节。
因为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地址在第一行很容易就能看到,时间戳在一个方括号中,在本教程中,使用%{COMBINEDAPACHELOG} 的Grok模式,从Apache Log当中使用下面的字段来标识COMBINEDAPACHELOG:
Information | Field 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 |
编辑first-pipeline.conf 文件,添加下面的内容:
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
处理后,样例线有下面的JSON表示:
{
"clientip" : "83.149.9.216",
"ident" : ,
"auth" : ,
"timestamp" : "04/Jan/2015:05:13:42 +0000",
"verb" : "GET",
"request" : "/presentations/logstash-monitorama-2013/images/kibana-search.png",
"httpversion" : "HTTP/1.1",
"response" : "200",
"bytes" : "203023",
"referrer" : "http://semicomplete.com/presentations/logstash-monitorama-2013/",
"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"
}
现在web日志分解成特定的字段,Logstash管道可以索引的数据变成Elasticsearch集群。编辑first-pipeline.conf文件,在input后面添加下面的内容:
output {
elasticsearch {
}
}
在这个配置中,Elasticsearch Logstash使用http协议连接。上面的示例假定Logstash和Elasticsearch运行在相同的实例。您可以指定一个远程Elasticsearch实例使用主机配置host = >“es-machine:9092”。
除了把解析的日志数据能够更好的搜索,过滤器插件可以从已存在的数据当中推出一些补充信息。作为一个例子,geoip插件查找IP地址,获取地理位置信息的地址,并添加位置信息的日志。配置Logstash实例使用geoip过滤器插件通过在first-pipeline.conf 文件中添加下面的内容到filter部分:
geoip {
source => "clientip"
}
geoip插件配置需要的数据已经定义为单独的字段。需要确保geoip部分配置在grok部分的后面。
指定一个包含IP地址的文件来查找,在本教程中,名字是:clientip。
到现在,你的第一条管道。配置文件输入,过滤器,和输出部分正确配置,和看起来像这样:
input {
file {
path => "/Users/palecur/logstash-1.5.2/logstash-tutorial-dataset"
start_position => beginning
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
geoip {
source => "clientip"
}
}
output {
elasticsearch {}
stdout {}
}
来验证你的配置,运行一下命令:
bin/logstash -f first-pipeline.conf --configtest
—configtest选项解析您的配置文件和报告任何错误。当配置文件通过配置测试,开始Logstash使用下面的命令:
bin/logstash -f first-pipeline.conf
试着测试查询Elasticsearch基于Grok过滤器插件创建的字段:
curl -XGET 'localhost:9200/logstash-$DATE/_search?q=response=200'
取代$Date用当前日期,YYYY.MM.DD格式。
因为我们的样品只有一个200 HTTP响应,我们得到很多返回:
{"took":2,
"timed_out":false,
"_shards":{"total":5,
"successful":5,
"failed":0},
"hits":{"total":1,
"max_score":1.5351382,
"hits":[{"_index":"logstash-2015.07.30",
"_type":"logs",
"_id":"AU7gqOky1um3U6ZomFaF",
"_score":1.5351382,
"_source":{"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\"",
"@version":"1",
"@timestamp":"2015-07-30T20:30:41.265Z",
"host":"localhost",
"path":"/path/to/logstash-tutorial-dataset",
"clientip":"83.149.9.216",
"ident":"-",
"auth":"-",
"timestamp":"04/Jan/2015:05:13:45 +0000",
"verb":"GET",
"request":"/presentations/logstash-monitorama-2013/images/frontend-response-codes.png",
"httpversion":"1.1",
"response":"200",
"bytes":"52878",
"referrer":"\"http://semicomplete.com/presentations/logstash-monitorama-2013/\"",
"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\""
}
}]
}
}
尝试另一个寻找:从IP地址查找地理位置信息:
curl -XGET 'localhost:9200/logstash-$DATE/_search?q=geoip.city_name=Buffalo'
取代$Date用当前日期,YYYY.MM.DD格式。
只有一个日志来自Buffalo,所以我们只得到了一个响应:
{"took":3,
"timed_out":false,
"_shards":{
"total":5,
"successful":5,
"failed":0},
"hits":{"total":1,
"max_score":1.03399,
"hits":[{"_index":"logstash-2015.07.31",
"_type":"logs",
"_id":"AU7mK3CVSiMeBsJ0b_EP",
"_score":1.03399,
"_source":{
"message":"108.174.55.234 - - [04/Jan/2015:05:27:45 +0000] \"GET /?flav=rss20 HTTP/1.1\" 200 29941 \"-\" \"-\"",
"@version":"1",
"@timestamp":"2015-07-31T22:11:22.347Z",
"host":"localhost",
"path":"/path/to/logstash-tutorial-dataset",
"clientip":"108.174.55.234",
"ident":"-",
"auth":"-",
"timestamp":"04/Jan/2015:05:27:45 +0000",
"verb":"GET",
"request":"/?flav=rss20",
"httpversion":"1.1",
"response":"200",
"bytes":"29941",
"referrer":"\"-\"",
"agent":"\"-\"",
"geoip":{
"ip":"108.174.55.234",
"country_code2":"US",
"country_code3":"USA",
"country_name":"United States",
"continent_code":"NA",
"region_name":"NY",
"city_name":"Buffalo",
"postal_code":"14221",
"latitude":42.9864,
"longitude":-78.7279,
"dma_code":514,
"area_code":716,
"timezone":"America/New_York",
"real_region_name":"New York",
"location":[-78.7279,42.9864] }
}
}]
}
}
你需要管理的信息往往来自几个不同来源,并且用例的数据可能需要多个目的地。你的Logstash管道可以使用多个输入和输出插件来处理这些需求。
这个示例创建一个Logstash管道,从Twitter和Filebeat客户机输入,然后将信息发送给一个Elasticsearch集群以及直接写信息到文件中。
添加一个Twitter消息来源,你需要下面几条信息:
(这里其实笔者并不太了解,查询之后oauth这个是账号和密码,然后consumer_key是从Twitter申请的开发号。两个是不一样的账号)
在first-pipeline.conf文件中的input部分,添加下面的信息:
twitter {
consumer_key =>
consumer_secret =>
keywords =>
oauth_token =>
oauth_token_secret =>
}
Filebeat客户端是一个轻量级的资源友好的从服务器搜日志并且发送到Logstash实例进行处理的工具。Filebeat客户机使用的安全比协议与Logstash实例进行数据交换。Lumberjack协议是一个可靠和低延迟的协议。Filebeat使用计算机的主机资源托管源数据,并且Beats输入插件最小化的Logstash实例资源。
在一个典型的用例,Filebeat从机器运行在不同的机器上运行Logstash实例。对于本教程,Logstash和Filebeat是运行在同一台机器上。
默认Logstash配置包括资源友好的Beats输入插件,在数据源上安装Filebeat,从Filebeat产品页面下载适当的包。、
创建一个配置文件Filebeat类似于下面的例子:
filebeat:
prospectors:
-
paths:
- "/path/to/sample-log" //Filebeat执行的路径
fields:
type: syslog
output:
logstash:
hosts: ["localhost:5043"]
tls:
certificate: /path/to/ssl-certificate.crt //Logstash实例的SSL证书路径
certificate_key: /path/to/ssl-certificate.key
certificate_authorities: /path/to/ssl-certificate.crt
timeout: 15
保存配置文件 filebeat.yml。
配置你的Logstash实例来使用Filebeat输入插件:在First-pipeline.conf文件中的input部分添加下面的内容:
beats {
port => "5043"
ssl => true
ssl_certificate => "/path/to/ssl-cert" //Logstash使用的验证Filebeat的SSL证书
ssl_key => "/path/to/ssl-key" //SSL证书的路径
}
你可以直接配置Logstash管道通过输出插件来将数据写入文件。
配置你的Logstash实例,使用file输出插件,在first-pipeline.conf文件的output部分添加下面内容:
file {
path => /path/to/target/file
}
写入多个Elasticsearch节点减轻给定Elasticsearch节点上的资源需求,并且当特定节点不可用时,提供冗余节点进入集群节点。
配置你的Logstash实例来写入多个Elasticsearch节点,编辑first-pipeline.conf文件,在output部分添加:
output {
elasticsearch {
hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
}
}
使用三个非主节点的IP地址在Elasticsearch集群主机线。使用三个非主节点的IP地址在Elasticsearch集群主机线。当主机参数列表多个IP地址,Logstash负载平衡请求在地址的列表。还要注意,Elasticsearch的默认端口是9200,可以省略在上面的配置。
到现在,你的配置文件first-pipeline.conf文件看起来是下面的样子:
input {
twitter {
consumer_key =>
consumer_secret =>
keywords =>
oauth_token =>
oauth_token_secret =>
}
beats {
port => "5043"
ssl => true
ssl_certificate => "/path/to/ssl-cert"
ssl_key => "/path/to/ssl-key"
}
}
output {
elasticsearch {
hosts => ["IP Address 1:port1", "IP Address 2:port2", "IP Address 3"]
}
file {
path => /path/to/target/file
}
}
Logstash使用Twitter的数据配置,从Filebeat接收数据,索引此信息以Elasticsearch集群以及三个节点写入一个文件。
在数据源上,Filebeat运行以下命令:
sudo ./filebeat -e -c filebeat.yml -d "publish"
Filebeat将尝试连接在端口5403上。直到Logstash始于一个活跃的beats插件,在这个端口将不会有任何答案,所以你看到任何关于这个端口的错误消息都是正常的。
来验证您的配置,运行以下命令:
bin/logstash -f first-pipeline.conf --configtest
—configtest选项解析您的配置文件并且报告任何的错误。当配置文件通过配置测试,开始Logstash使用下面的命令:
bin/logstash -f first-pipeline.conf
使用grep工具搜索目标文件存在,验证信息:
grep Mozilla /path/to/target/file
运行一个Elasticsearch语句,来寻找Elasticsearch集群中相同的信息:
curl -XGET 'localhost:9200/logstash-2015.07.30/_search?q=agent=Mozilla'