
1.4 Logstash概览
Logstash可以看成是数据传输的管道,它可以从多个数据源提取数据,然后再清洗过滤并发送到指定的目标数据源。目标数据源也可以是多个,而且只要修改Logstash管道配置就可以轻松扩展数据的源头和目标。这在实际应用中非常有价值,尤其是在提取或发送的数据源发生变更时更为明显。比如原来只将数据提取到Elasticsearch中做检索,但现在需要将它们同时传给Spark做实时分析。如果事先没有使用Logstash就必须设计新代码向Spark发送数据,而如果预先使用了Logstash则只需要在管道配置中添加新的输出配置。这极大增强了数据传输的灵活性。
1.4.1 安装Logstash
Logstash是基于Java语言开发的,所以安装Logstash之前需要先安装JDK 。Logstash 7目前只支持Java 8或Java 11,所以安装前要检查安装JDK的版本是否正确。在Linux上安装Logstash时,最好将JDK安装路径设置到JAVA_HOME环境变量中。Logstash提供了DEB、RPM安装包,还提供了tar.gz和zip压缩包,也可以直接通过Docker启动Logstash。安装过程比较简单,直接解压缩文件是最简单的办法,这里不再赘述。
1.4.2 启动Logstash
Logstash的启动命令位于安装路径的bin目录中,如果使用DEB或RPM安装则位于/usr/share/logstash/bin目录中。直接运行logstash会报错,需要按如下方式提供参数:

示例1-5 启动Logstash
启动时应注意两点:一是在Windows下要使用logstash.bat;二是-e参数后要使用双引号,否则启动会出错。如果在命令行启动日志中看到“Successfully started Logstash API endpoint {:port=>9600}”,就证明启动成功。在上面的命令行中,-e代表输入配置字符串,定义了一个标准输入插件(即stdin)和一个标准输出插件(即stdout),意思就是从命令行提取输入,并在命令行直接将提取的数据输出。如果想要更换输入或输出,只要将input或output中的插件名称更改即可,这充分体现了Logstash管道配置的灵活性。按示例1-5启动Logstash,命令行将会等待输入,键入“Hello, World!”后会在命令行返回结果如下:

示例1-6 stdout输出
在默认情况下,stdout输出插件的编解码器为rubydebug,所以输出内容中包含了版本、时间等信息,其中message属性包含的就是在命令行输入的内容。试着将输出插件的编码器更换为plain或line,则输入的结果将会发生变化:

示例1-7 更换编解码器
如果想要终止Logstash,只要在命令行中输入“Ctrl+C”即可。
1.4.3 连接Elasticsearch
Logstash基于插件开发和应用,包括输入、过滤器和输出三大类插件。输入插件指定了数据来源,过滤器插件则对数据做过滤清洗,而输出插件则指定了数据将被传输到哪里。在示例1-5中启动Logstash时,是通过命令行并使用-e参数传入了配置字符串,指定了标准输入stdin插件和标准输出stdout插件。但在实际应用中,通常都是使用配置文件指定插件。配置文件的语法形式与命令行相同,要使用的插件是通过插件名称来指定。例如,想要向Elasticsearch中发送数据,则应该使用名称为elasticsearch的输出插件。在Logstash安装路径下的config目录中(使用DEB或RPM安装时目录为/etc/logstash),有一个名为logstash-sample.conf的文件,提供了配置插件的参考。这个文件配置的输入插件为beats,输出插件为elasticsearch。复制这个文件并重命名为std_es.conf(也可以直接创建空文件),下面通过修改这个文件配置一个从命令行提取输入,并传输到Elasticsearch的Logstash实例。按如下内容修改std_es.conf文件的输入输出插件:


示例1-8 使用文件配置管道
在上面的配置中,elasticsearch输出插件中的hosts参数指定了Elasticsearch地址和端口,index参数则指定了存储的索引。Elasticsearch索引不需要预先创建,但要保证它启动的地址和端口与配置文件中的一致。按如下方式启动Elasticsearch:

示例1-9 使用-f设置管道配置
其中,-f参数后面指定了配置文件的路径。启动后如果没有异常,可在命令行窗口中输入“Hello,World!”等任意字符串,Logstash将把输入内容提取到指定的Elasticsearch服务中。通过Kibana开发工具输入GET _cat/indices,可以看到stdin这个索引已经创建出来了。输入GET /stdin/_search,则返回结果为


示例1-10 查看Logstash索引数据
通过示例1-10可以看到,Elasticsearch为输入创建了一个stdin索引,在命令行输入的“Hello,World!”已经被索引,在返回结果的_source字段上可以看到文档内容。有关Logstash的具体内容,将在本书第12~14章中介绍。