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


95

假设您有两种非常不同的日志类型,例如技术日志和业务日志,并且您想要:

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

我知道,Syslog-NG例如,配置文件允许定义几个不同的输入,然后可以在分派输入之前对其进行单独处理。什么Logstash似乎无法做到。即使可以使用两个特定的配置文件启动一个实例,所有日志都使用相同的通道并被应用相同的处理...

是否应该运行与具有不同类型的日志一样多的实例?


2
您应该接受Ben Lim的正确答案!
本·惠勒

Answers:


191

是否应该运行与具有不同类型的日志一样多的实例?

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

在logstash配置文件中,您可以使用不同的类型指定每个输入。然后,可以在过滤器中使用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
    }
}

希望这可以帮到你 :)


1
您还可以在过滤器和输出定义中使用type属性(具有相同的type => "value"语法),这些属性应略微减少配置文件中的额外格式。示例:gist.github.com/fairchild/3030472每个文档:在此输入处理的所有事件中添加“类型”字段。类型主要用于过滤器激活。该类型存储为事件本身的一部分,因此您也可以使用该类型在Web界面中进行搜索。
Tony Cesaro 2014年

5
好吧,看来Ben提供的实际上是执行此操作的新方法。当我type => "value"在输出中使用时,显示以下消息:“您正在使用在stdout中设置的已弃用的配置设置“类型”。已弃用的设置将继续起作用,但计划在将来从logstash中删除。您可以实现新条件的相同行为,例如:if [type] == "sometype" { stdout { ... } }。” 我撤回以前的评论。:)
Tony Cesaro 2014年

请注意,type如果输入中已有类型字段,则该属性将不适用。这是一个不会覆盖的特殊属性,已记录在案。我在Elastic中打开了一张票,他们建议我使用tagsadd_field代替type
BornToCode

@BornToCode,我不太了解。您是说Ben的代码有问题吗?还是如果日志路径是相同的文件将不起作用?在什么情况下不起作用?
本·惠勒

2
@BenLim OP未接受您的回答,但我发现它最有帮助,并为您投票。
bigbadmouse19年

15

我将标签用于多个文件输入:

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}"
        }
    }
}

这比公认的答案要好:它允许在logstash中输入多个文件信号。在这种情况下,“类型”属性将设置为“日志”,并且无法修改。
雷吉斯B.

但是这不是用最后一个标签(bbb)覆盖标签吗?然后,在if statememt中,如果标签是数组或单个字符串,则两个IF都可以工作。因此,从逻辑上讲这是不正确的,但如果
meso_2600

0

我认为Logstash在“输入”部分不能读取超过2个文件。试试下面

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

是的,遇到同样的“问题”
meso_2600 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.