logstash配置文件详解logstash安装与配置logstash 配置文件




logstash配置文件详解logstash安装与配置logstash 配置文件

2022-07-21 2:24:36 网络知识 官方管理员


1写在前面

Logstash被称为数据处理管道,由输入插件、过滤器插件、输出插件三部分构成,在常规的配置下,一个Logstash实例中只有一个管道运行,从6.0版本后,官方逐渐推出了一些多管道的配置,能够在一个Logstash实例中启动多个管道执行。

2版本说明

Logstash6.3.0以上

3配置方案

3.1单管道配置

先讲运行单个Logstash实例的情况,在最基本的单个管道配置下,又有以下几种方案来实现不同的输出方式。

3.1.1单输出插件

logstash配置文件详解(logstash安装与配置)(1)

显而易见,如果只配置一个输出插件,Logstash便只能向一个地方输出结果。

一份简略的配置如下:

input{file{path=>"/tmp/test.log"}}filter{json{skip_on_invalid_json=>truesource=>"message"}}output{stdout{}}

3.1.2多输出插件

logstash配置文件详解(logstash安装与配置)(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条件输出

logstash配置文件详解(logstash安装与配置)(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配置文件详解(logstash安装与配置)(4)

如果想在一个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配置文件详解(logstash安装与配置)(5)

如果想要让事件(数据)在同一个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单管道输出多管道

logstash配置文件详解(logstash安装与配置)(6)

除了汇聚形式的管道搭配,还有各种分发形式的使用,从一个管道接收数据再传递到多个下游管道。

同样可以使用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实例。

logstash配置文件详解(logstash安装与配置)(7)

各实例间或毫无关联,或依然存在一定的逻辑关系,这里就不再举例了。

4最后

Logstash的应用可以说非常灵活,尤其是官方引入了多管道配置后,可以在一个Logstash实例内实现多个管道的搭配运行,方便了整个Logstash服务的管理。


发表评论:

最近发表
网站分类
标签列表