天天看点

《ELK Stack权威指南(第2版)》一 1.2 Hello World

本节书摘来自华章出版社《elk stack权威指南(第2版)》一书中的第1章,第1.2节,作者 饶琛琳  更多章节内容可以访问云栖社区“华章计算机”公众号查看。 

1.2 hello world

与绝大多数it技术介绍一样,我们也以一个输出“hello

world”的形式开始学习logstash。

1.命令行运行

在终端中,像下面这样运行命令来启动 logstash 进程:

# bin/logstash

-e 'input{stdin{}}output{stdout{codec=>rubydebug}}'

首先看到终端输出一段进程启动过程的提示输出。提示以"successfully started logstash api endpoint

{:port=>9600}"结束。

然后你会发现终端在等待你的输入。没问题,敲入hello world,回车,看看会返回什么结果!

{

"message"

=>"hello world",

"@version"

=>"1",

"@timestamp"

=>"2014-08-07t10:30:59.937z",

"host"

=>"raochenlindemacbook-air.local",

}

没错!就是这么简单。

2.完整示例

命令行运行当然不是什么特别方便的用法,所以绝大多数情况下,我们都是采用额外定义一个logstash.conf配置文件的方式来启动logstash。下面是我们的第一个完整版logstash.conf的示例:

input {

    stdin { }

output {

    stdout {

        codec => rubydebug {}

    }

    elasticsearch {

        rost=>["127.0.0.1"]

因为在5.0版本中,elasticsearch和kibana都是独立服务。如果你按照上一节的最佳实践配置好了yum的话,通过如下命令启动服务即可:

# service

elasticsearch start && service kibana start

然后在终端上这样运行:

-f logstash.conf

同样,还是输入一次hello world。你会看到和上一次一样的一段ruby对象输出。但事实上,这个完整示例可不止如此。打开另一个终端,输入下面一行命令:

# curl

http://127.0.0.1:9200/_search?q=hello

你会看到终端上输出下面这么一段内容:

{"took":15,"timed_out":false,"_shards":{"total":27,"successful":27,"failed":0},"hits":{"total":1,"max_score":0.095891505,"hits":[{"_index":"logstash-2015.08.22","_type":"logs","_id":"au90s1engg_p5-w7sb32","_score":0.095891505,"_source":{"message":"hello

world","@version":"1","@timestamp":"2014-08-07t10:30:59.937z","host":"raochenlindemacbook-air.local"}}]}}

这时候你打开浏览器,访问http://127.0.0.1:5601地址,按照提示完成index pattern配置(正常的话只需要点击一下create按钮),即可点击discover页面看到如图1-1所示的效果。你在终端上输入的数据,可以从这个页面上任意搜索了。

《ELK Stack权威指南(第2版)》一 1.2 Hello World

对index pattern配置有疑惑的读者,可以阅读本书第三部分关于kibana的章节。

3.解释

每位系统管理员都肯定写过很多类似这样的命令:cat randdata | awk '{print $2}' | sort | uniq -c | tee sortdata。这个管道符|可以算是linux世界最伟大的发明之一(另一个是“一切皆文件”)。

logstash就像管道符一样!

输入(就像命令行的cat)数据,然后处理过滤(就像awk或者uniq之类)数据,最后输出(就像tee)到其他地方。

当然实际上,logstash是用不同的线程来实现这些的。如果你运行top命令然后按下h键,你就可以看到下面这样的输出:

    pid user      pr 

ni  virt  res 

shr s %cpu %mem    time+  command

21401 root      16  

0 1249m 303m  10m s 18.6  0.2 866:25.46 |worker

21467 root      15  

0 1249m 303m  10m s  3.7 

0.2 129:25.59 >elasticsearch.

21468 root      15  

0 1249m 303m  10m s  3.7 

0.2 128:53.39 >elasticsearch.

21400 root      15  

0 1249m 303m  10m s  2.7 

0.2 108:35.80 <file

21403 root      15  

0 1249m 303m  10m s  1.3 

0.2  49:31.89 >output

21470 root      15  

0 1249m 303m  10m s  1.0 

0.2  56:24.24 >elasticsearch.

如上例所示,logstash很温馨地给每类线程都取了名字,输入的叫<xx,过滤的叫|xx,输出的叫>xx。

数据在线程之间以事件的形式流传。不要叫行,因为logstash可以处理多行事件。

logstash会给事件添加一些额外信息。最重要的就是@timestamp,用来标记事件的发生时间。因为这个字段涉及logstash的内部流转,所以必须是一个joda对象,如果你尝试自己给一个字符串字段重命名为@timestamp的话,logstash会直接报错。所以,请使用logstash-filter-date插件来管理这个特殊字段。

此外,大多数时候,还可以见到另外几个:

host标记事件发生在哪里。

type标记事件的唯一类型。

tags标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。

你可以随意给事件添加字段或者从事件里删除字段。事实上事件就是一个ruby对象,或者更简单地理解为就是一个哈希也行。

每个logstash过滤插件,都会有四个方法叫add_tag、remove_tag、add_field和remove_field,它们在插件过滤匹配成功时生效。

推荐阅读

官网上“the life of an event”文档:http://logstash.net/docs/1.4.2/life-of-an-event

elastic{on}上《life of a logstash event》演讲:https://speakerdeck.com/elastic/life-of-a-logstash-event

继续阅读