1写在前面
Logstash被称为数据处理管道,由输入插件、过滤器插件、输出插件三部分构成,在常规的配置下,一个Logstash实例中只有一个管道运行,从6.0版本后,官方逐渐推出了一些多管道的配置,能够在一个Logstash实例中启动多个管道执行。
2版本说明
Logstash6.3.0以上
3配置方案
3.1单管道配置
先讲运行单个Logstash实例的情况,在最基本的单个管道配置下,又有以下几种方案来实现不同的输出方式。
3.1.1单输出插件
显而易见,如果只配置一个输出插件,Logstash便只能向一个地方输出结果。
一份简略的配置如下:
input{file{path=>"/tmp/test.log"}}filter{json{skip_on_invalid_json=>truesource=>"message"}}output{stdout{}}
3.1.2多输出插件
更进一步,如果配置多个输出插件,Logstash运行正常的情况下,就能依次向多个地方输出结果。
为什么说运行正常的情况下?因为前一个输出插件如果出了意外,导致消息不能被正常处理,后面的插件就不能继续收到消息,所以这样的方式配置多个输出插件时,插件之间会存在相互影响。
一份简略的配置如下:
input{file{path=>"/tmp/test.log"}}filter{urldecode{}}output{http{method=>"get"url=>"http://127.0.0.1:8080/test"}stdout{}}
3.1.3条件输出
如果需要根据不同的情况,执行不同的输出逻辑,则可以在配置文件中使用if…else…语句实现。
一份简略的配置如下:
input{file{path=>"/tmp/test.log"}}filter{json{skip_on_invalid_json=>truesource=>"message"}}output{if[testParam]=="http"{http{method=>"get"url=>"http://127.0.0.1:8080/test"}stdout{}}else{tcp{host=>"192.168.10.123"port=>9999}}}
3.2多管道配置
在上一节单管道配置的基础上,现在可以实现单个Logstash实例运行多个管道,其中每个管道的配置跟上述单管道一致,这里就不再赘述,主要讲讲多管道的几种模式。
官方在6.0版本时推出了multiple-pipelines的功能,让Logstash能在一个实例内同时启动多个管道;之后又在6.3版本时推出了pipeline-to-pipeline的功能,让同一个Logstash实例内的不同管道间可以产生逻辑关系。
注意,多管道的使用必须使用pipelines.yml文件,这个配置文件中的配置有两点要注意,首先要指定不重复的pipeline.id,其次要说明每个管道的插件配置,可以使用path.config指定插件配置文件的路径,也可以使用config.string直接把插件的配置写在该pipelines.yml文件中。而其余的配置,都跟logstash.yml中一样。
同时,启动Logstash时不再需要使用-f参数指定专门的配置文件,它会默认使用pipelines.yml的配置启动。
3.2.1多管道相互独立
如果想在一个Logstash中启动多个管道,让它们各自运行,互不影响,在6.0版本后已经可以实现。
官方文档给的一份示例配置如下:
-pipeline.id:my-pipeline_1path.config:"/etc/path/to/p1.config"pipeline.workers:3-pipeline.id:my-other-pipelinepath.config:"/etc/different/path/p2.cfg"queue.type:persisted
它使用插件配置文件p1.config启动了一个叫my-pipeline_1的管道,又设置这个管道的工作线程为3个;而同时又使用p2.cfg启动了一个叫my-other-pipeline的管道,设置这个管道的队列为持久化管道。
另外,官方还有一篇博客《如何创建易于维护和再利用的Logstash管道》介绍了这样的玩法:
-pipeline.id:my-pipeline_1path.config:"<path>/{01_in,01_filter,02_filter,01_out}.cfg"-pipeline.id:my-pipeline_2path.config:"<path>/{02_in,02_filter,03_filter,01_out}.cfg"
简单来说,就是把各种输入插件、过滤器、输出插件拆分出来,成为不同的配置文件,再在pipelines.yml中使用glob表达式拼接它们,其中的好处是复用相同的插件配置,避免某一处问题修改还要到多个配置文件中去做。
3.2.2多管道输出单管道
如果想要让事件(数据)在同一个Logstash实例上的多个管道内依次流动(处理),可以使用pipeline-to-pipeline功能,Logstash提供了一个pipeline输出插件,可以将当前管道内的数据发送至Logstash实例内的虚拟服务上的指定虚拟地址,同时又提供了一个pipeline输入插件,根据虚拟地址,从虚拟服务中获取这些数据。
比如有多个不同来源的数据,分别经过各自的管道处理后,再流向通用的输出管道做最终处理,形成一种汇聚型的结构。
参考官方博客的一个示例配置:
-pipeline.id:beatsconfig.string:|input{beats{port=>5044}}output{pipeline{send_to=>[commonOut]}}-pipeline.id:kafkaconfig.string:|input{kafka{...}}output{pipeline{send_to=>[commonOut]}}-pipeline.id:partner#ThiscommonpipelineenforcesthesamelogicwhetherdatacomesfromKafkaorBeatsconfig.string:|input{pipeline{address=>commonOut}}filter{#Alwaysremovesensitivedatafromallinputsourcesmutate{remove_field=>'sensitive-data'}}output{elasticsearch{}}
它使用beats插件同时又使用kafka插件采集不同地方的数据,分别使用pipeline插件将所有的数据发送到commonOut这个虚拟地址,最后启动一个专门的管道,从该地址接收全部的数据,写入elasticsearch。
3.2.3单管道输出多管道
除了汇聚形式的管道搭配,还有各种分发形式的使用,从一个管道接收数据再传递到多个下游管道。
同样可以使用if…else…语句进行选择,究竟要发到哪个管道:
-pipeline.id:beats-serverconfig.string:|input{beats{port=>5044}}output{if[type]==apache{pipeline{send_to=>weblogs}}elseif[type]==system{pipeline{send_to=>syslog}}else{pipeline{send_to=>fallback}}}-pipeline.id:weblog-processingconfig.string:|input{pipeline{address=>weblogs}}filter{#Weblogfilterstatementshere...}output{elasticsearch{hosts=>[es_cluster_a_host]}}-pipeline.id:syslog-processingconfig.string:|input{pipeline{address=>syslog}}filter{#Syslogfilterstatementshere...}output{elasticsearch{hosts=>[es_cluster_b_host]}}-pipeline.id:fallback-processingconfig.string:|input{pipeline{address=>fallback}}output{elasticsearch{hosts=>[es_cluster_b_host]}}
或者直接把数据发到全部下游管道:
-pipeline.id:intakequeue.type:persistedconfig.string:|input{beats{port=>5044}}output{pipeline{send_to=>[es,http]}}-pipeline.id:buffered-esqueue.type:persistedconfig.string:|input{pipeline{address=>es}}output{elasticsearch{}}-pipeline.id:buffered-httpqueue.type:persistedconfig.string:|input{pipeline{address=>http}}output{http{}}
3.3多Logstash实例
除此之外,当然,还可以直接根据上述单管道或多管道的配置,直接启动多个Logstash实例。
各实例间或毫无关联,或依然存在一定的逻辑关系,这里就不再举例了。
4最后
Logstash的应用可以说非常灵活,尤其是官方引入了多管道配置后,可以在一个Logstash实例内实现多个管道的搭配运行,方便了整个Logstash服务的管理。