在logstash中使用来自Kafka的字段的条件问题----> FileBeat探矿者

时间:2016-11-25 17:22:14

标签: apache-kafka logstash filebeat

我有以下情况:

FileBeat ---->卡夫卡-----> Logstash ----->弹性----> Kibana

在Filebeat中,我在YML文件中有2个探矿者,。我添加了一些字段来识别日志数据。 但问题是:Logstash中的我无法验证此字段。

配置文件是:

1。 filebeat.yml

filebeat.prospectors:
- input_type: log
  paths:
    - /opt/jboss/server.log*
  tags: ["log_server"]
  fields:
    environment: integracion
    log_type: log_server

  document_type: log_server
  fields_under_root: true


- input_type: log
  paths:
    - /var/todo1_apps/ebanTX.log*
  tags: ["log_eban"]
  fields:
    environment: integracion
    log_type: log_ebanking

  document_type: log_ebanking
  fields_under_root: true

output.kafka:
    enabled: true
    hosts: ["192.168.105.68:9092"]
    topic: "sve_logs"
    timeout: 30s

2。 logstash.conf

input {
  kafka {
    bootstrap_servers => "192.xxx.xxx.xxx:9092"
    group_id => "sve_banistmo"
    topics => ["sve_logs"]
    decorate_events => true
    codec => "plain"
    }
  }

filter {
if [type] == "log_ebanking" {
    grok {
       patterns_dir => ["patterns/patterns"]
        match => { "message" => "%{TIMESTAMP_ISO8601:logdate}%{SPACE}%{LOGLEVEL:level}%{SPACE}\[%{DATA:thread}]%{SPACE}-%{SPACE}%{GREEDYDATA:message_log}" }
        }
  }
}

output {
if [type] == "log_ebanking" {
      elasticsearch {
        hosts => ["192.168.105.67:9200"]
        index => "sve-banistmo-ebanking-%{+YYYY.MM.dd}"
      }
        stdout { codec => json}
  }
}

问题出在条件过滤器输出部分。我试过

@[metadata][type]
@metadata][type]
@metadata.type
metadata.type
[type]

同时包含type和log_type变量。什么都行不通!! :S 如果我不放置条件,数据流没有问题。我的意思是,这不是一个连接问题。

请帮帮我。我已经审核了所有相关的信息,但就我而言,条件无效。

提前致谢

Dario R

4 个答案:

答案 0 :(得分:1)

使用codec => "json"logstash.conf kafka输入conf中提取消息中的所有字段。

答案 1 :(得分:0)

问题是来自kafka的消息未被解码。 Logstash将把filebeat报告的整个json消息作为消息。 您可以添加json过滤器来解码json格式的消息。

filter {
  json {
    source => "message"
  }
}

字段将被解码。消息字段将替换为真实消息,而不是整个json字符串。

然后你可以在条件块中使用[type]。 使用kafka作为输出时,filebeat不会报告@metadata。所以你看不到@metadata。

答案 2 :(得分:0)

之前和Kafka一起经历过这个! 以下是我为使其发挥作用所采取的步骤:

  1. 更新您的Kafka输入插件  cd / usr / share / logstash / bin  然后./logstash-plugin更新logstash-input-kafka
  2. 在你的LS配置文件中将此添加到你的Kakfa输入插件codec => "json"
  3. 暂时保持过滤空,首先需要确保在Elasticsearch上接收JSON中的数据。如果你有Kibana在那里检查或运行ES查询,如果你不。
  4. 然后您应该能够访问LS配置文件中的任何字段。
  5. 现在您的输出我看到您正在添加" log_type"对于filebeat中的事件,我建议您在LS输出插件中if "log_ebanking" == [log_type]

    字段[type]默认为"日志"对于filebeat和" metricsets"用于所有事件的metricbeat。

    不确定您的Filebeat版本是什么,但请注意这一点,因为https://www.elastic.co/guide/en/beats/filebeat/current/configuration-filebeat-options.html#filebeat-document-type

    中不推荐使用document_type

答案 3 :(得分:0)

您可以通过以下方式访问自定义字段:

  if [kafka][fields][log_type] == "nginx_access" {
    grok {
        patterns_dir => "/etc/logstash/patterns"
        match => { "message" => "%{nginx_access}" }
    }
  }