如何使用Logstash处理多个异构input?

假设您有两种非常不同的日志types,例如技术和业务日志,您需要:

  • 原始的技术日志使用gelf输出路由到一个graylog2服务器,
  • 使用专用的elasticsearch_http输出将json业务日志存储到elasticsearch集群中。

我知道以Syslog-NG为例,configuration文件允许定义几个不同的input,然后可以在分派之前单独处理; Logstash似乎无法做到。 即使一个实例可以使用两个特定的configuration文件启动,所有日志都采用相同的通道并且正在应用相同的处理。

我应该运行尽可能多的实例,因为我有不同types的日志?

我应该运行尽可能多的实例,因为我有不同types的日志?

没有! 您只能运行一个实例来处理不同types的日志。

在logstashconfiguration文件中,可以指定不同types的每个input。 然后在filter中可以使用if来区分不同的处理,并且在输出处也可以使用“if”输出到不同的目的地。

 input { file { type => "technical" path => "/home/technical/log" } file { type => "business" path => "/home/business/log" } } filter { if [type] == "technical" { # processing ....... } if [type] == "business" { # processing ....... } } output { if [type] == "technical" { # output to gelf } if [type] == "business" { # output to elasticsearch } } 

希望这可以帮到你 :)

我认为logstash在input部分不能读取超过2个文件。 尝试下面

 input { file { type => "technical" path => "/home/technical/log" } file { type => "business" path => "/home/business/log" } file { type => "business1" path => "/home/business/log1" } } 

我使用标签进行多个文件input:

 input { file { type => "java" path => "/usr/aaa/logs/stdout.log" codec => multiline { ... }, tags => ["aaa"] } file { type => "java" path => "/usr/bbb/logs/stdout.log" codec => multiline { ... } tags => ["bbb"] } } output { stdout { codec => rubydebug } if "aaa" in [tags] { elasticsearch { hosts => ["192.168.100.211:9200"] index => "aaa" document_type => "aaa-%{+YYYY.MM.dd}" } } if "bbb" in [tags] { elasticsearch { hosts => ["192.168.100.211:9200"] index => "bbb" document_type => "bbb-%{+YYYY.MM.dd}" } } }