Logstash Cookbook 2.1第一章

基本Logstash示例

为了验证你的Logstash安装,可以执行下面的最简单的Logstash管道(pipeline):

1
2
cd logstash-{logstash_version}
bin/logstash -e 'input { stdin { } } output { stdout {} }'

符号-e使得stash能够直接从命令行识别你所指定的配置。通过命令行指定配置让你在不需要编辑
文件的情况下,能够快速的测试配置。上面的管道(pipeline)从标准输入stdin获取输入,并且将
输入进行化后输出到标准输出stdout。在命令行输入hello world,可以看到Logstash
有如下的响应:

1
2
Hello World
2016-01-17T14:27:25.278Z vincent-pc Hello World

Logstash把时间戳和宿主机器IP信息(或者DNS)添加到了输出的消息中。在shell窗口中输入CTRL-D
结束正在该shell窗口中执行的logstash。

下一节将会介绍更复杂的例子来覆盖更广泛的使用场景。

配置高级Logstash管道

在大多数的使用情况下,一个logstash管道有一个或多个inputfilter,和output插件。
在本节的场景中将构造一个配置文件来制定这些插件,并讨论每个插件的功能。

Logstash配置文件定义了Lostash的管道。当你启动一个logstash实例时,通过-f <path/to/file
选项指定一个配置文件来定义该实例的管道。

一个Lostash管道有两个必须的元素,inputoutput,以及一个可选的元素 filter
input插件从一个数据源消耗数据,filter插件按照你的意愿对数据进行修改,output插件将数据写到制定的地点。

Logstash and pipeline

下面的内容是管道配置的一个基本结构

1
2
3
4
5
6
7
8
9
10
11
# 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,所以上面的配置不会有任何效果。本节的配置文件将会对起进行补充。
讲上面的草稿复制粘贴到一个名为first-pipeline.onf的文件,并放在Logstash的根目录。

将Apache日志解析到Elasticsearch

这个例子将创建一个logstash管道,以Apcache Web日志作为输入,对这些日志进行解析,并创建指定的、已命名
的域,并将解析后的数据写到Elasticsearch集群。

你可以从这里
下载例子中用到的数据集。

配置File Input

在开始Logstash管道之前,需要对Lostash实例进行配置,让他能够使用文件input插件从一个文件中读取数据。
编辑first-pipeline.conf文件,添加如下内容:

1
2
3
4
5
6
input {
file {
path => "/path/to/logstash-tutorial.log"
start_position => beginning
}
}

文件input插件的默认作用监控新写入文件中的内容,类似于UNIX中的tail -f命令。如果要修改默认行为,
并处理整个文件,需要指定Logstash从文件的开头部分开始处理。这就是start_position标签的作用。

path/to替换成你本地的logstash-tutorial.log的位置。

使用Grok filter插件解析饿Web日志

grok logstash自带的众多插件中的一个。关于如何管理Logstash的插件,参考该文档

grok 插件会从输入的日志数据中寻找patterns,在配置时需要你决定那些pattern是你关心的patern。本例中处理的
Web日志结构如下:

1
2
3
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"

可以发现,这里的Web日志以IP地址开头,时间戳放在在中括号中。在本例中,用COMBINEDAPACHELOGgrok pattern,该pattern将Apache日志的一行日志结构化,
如下面的表格所示:

1
todo

编辑first-pipeline.conf加入下面的内容:

1
2
3
4
5
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}

处理后,Web日志中一条采样行会转化成下面的JSON格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
{
"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"
}

在Elasticsearch中存储解析后的数据

现在Web日志被拆解成各个指定好的域,Logstash管道可以将数据存储(index)到Elasticsearch集群中。
编辑first-pipeline.conf文件,加入如下内容:

1
2
3
4
output {
elasticsearch {
}
}

通过该配置,Logstash使用http协议链接Elasticsearch。上面的配置基于Logstash和Elastcisarch都运行
在同一个系统中。你可以通过hosts配置项指定远程Elasticsearch实例,例如hosts => “elasticsearch:9200

使用Geoip filter插件

为了方便更好的搜索解析好的日志数据,filter插件可以从现有数据中得到一些额外的信息。例如, geoip 插件
寻找IP地址,通过该地址得到位置信息,并将该信息加到记录中。

将如下内容加到配置文件的filter部分,变可以将geoip插件配置到Logstash实例中:

1
2
3
geoip {
source => "clientip"
}

geoip插件需要数据已经被定义成各个单独的域。请确认geoip配置在grok域后面。

测试你的第一个管道

到目前,你的first-pipeline.conf包含inputfilter,以及output域,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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 {}
}

执行下面的命令,检查你的配置文件是否正确:

1
bin/logstash -f first-pipeline.conf --configtest

选项configtest将会解析你的配置文件,并汇报任何存在的错误。当配置文件通过配置测试,用如下命令启动logstash:

1
bin/logstash -f first-pipeline.conf

通过下面的查询语句,根据通过grokfilter插件创建的域查询,查看Elasticserach中是否有相关的信息:

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

将$DATE替换成党建的时间,格式为YYYY.MM.DD。
由于本例中只有一个200 HTTP响应,所以我们查询到一个命中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
{"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地址推到出的位置信息查找:

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

结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
{"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":{wx295eebe0b032c5b0 4e9106458904ecc853689fdc90dbf0c7
"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]
}
}
}]
}
}

SEDA架构与高性能程序 [LeetCode] 318 Maximum Product of Word Lengths

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×