【问题标题】:How to handle multiple heterogeneous inputs with Logstash?如何使用 Logstash 处理多个异构输入?
【发布时间】:2013-08-22 05:42:47
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你应该接受 Ben Lim 的正确答案!

标签: logging elasticsearch logstash graylog2


【解决方案1】:

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

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

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

希望对你有帮助:)

【讨论】:

  • 您还可以在过滤器和输出定义中使用type 属性(具有相同的type => "value" 语法),这应该会减少配置文件中的额外格式。示例:gist.github.com/fairchild/3030472 根据文档:向此输入处理的所有事件添加“类型”字段。类型主要用于过滤器激活。该类型作为事件本身的一部分存储,因此您也可以使用该类型在 Web 界面中搜索它。
  • 嗯,看起来 Ben 提供的实际上是执行此操作的新方法。当我在输出中使用type => "value" 时,我收到以下消息:“您正在使用在标准输出中设置的已弃用的配置设置“类型”。弃用的设置将继续有效,但计划在未来从logstash 中删除。您可以使用新的条件来实现相同的行为,例如:if [type] == "sometype" { stdout { ... } }。”我收回我之前的评论。 :)
  • 请注意,如果输入中已有类型字段,type 属性将不适用。这是一个不会覆盖的特殊属性,并且已记录在案。我在 Elastic 中开了一张票,他们建议我使用 tagsadd_field 而不是 type
  • @BornToCode,我不太明白。你是说 Ben 的代码有问题吗?或者如果日志路径是同一个文件,它不会工作?什么情况下不起作用?
  • @BenLim OP 不接受您的回答,但我发现它对您最有帮助并为您投票。
【解决方案2】:

我认为 logstash 不能在 Input section 中读取超过 2 个文件。试试下面的

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

【讨论】:

  • 是的,遇到同样的“问题”
【解决方案3】:

我使用标签进行多文件输入:

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 中输入多个文件节拍。在这种情况下,“type”属性设置为“log”并且无法修改。
  • 但这不是用最后一个标签(bbb)覆盖标签吗?再一次,在 if 状态中,如果标签是一个数组或单个字符串,那么两个 IF 都可以工作。所以逻辑上这是不正确的,但也许logstash在if的内部有不同的逻辑
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-11
  • 1970-01-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多