1.2 Hello World
与绝大多数IT技术介绍一样,我们也以一个输出“Hello World”的形式开始学习Logstash。
1.命令行运行
在终端中,像下面这样运行命令来启动Logstash进程:
# bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
然后你会发现终端在等待你的输入。没问题,敲入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 { embedded => true } }
然后在终端上这样运行:
# bin/logstash -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”}}]}}
如果你使用的是Logstash-1.5以下的版本,你还可以直接通过bin/logstash web命令,启动Kibana应用,然后在浏览器上访问http://127.0.0.1:9292/地址,可以看到如图1-1所示的效果。我们在终端上输入的数据,就可以从页面上任意搜索了。
图1-1 Kibana上搜索的hello world
如果你使用的是Logstash-1.5以上版本,Logstash已经不再自带Kibana代码,你就只能自己安装部署一套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 <f?ile 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