ELK - Logstash + Redis - 数据重复

时间:2016-05-23 15:42:41

标签: logging elasticsearch redis logstash kibana

我需要帮助

我有两个Logstash配置文件:

agent.conf

 input {
  log4j {
    type => "bdj"
    port => 25827
  }
}

filter{
    json{
        source => "message"
    }

}

output {
  stdout { 
    codec => rubydebug
  }
  redis {
    host => "127.0.0.1"
    data_type => "list"
    key => "logstash"
  }
}

agent.conf 通过tcp将它们发送到redis来接收数据日志。

central.conf

input {
  redis {
    host => "localhost"
    type => "redis-input"
    data_type => "list"
    key => "logstash"
  }
}

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

output {
  stdout { }
  elasticsearch {
    hosts => "localhost"
    index => "logstash-%{+YYYY.MM.dd}"
  }

}

central.conf 获取redis并将它们发送给弹性系统。

我的问题是数据被复制,作为循环或类似的东西。

我正在运行logstash作为Debian的服务;

root@logs:~# uname -a
Linux logs 3.2.0-4-amd64 #1 SMP Debian 3.2.78-1 x86_64 GNU/Linux

同时查看图像,相同的数据日志,我只发送了一个日志请求。

enter image description here

任何帮助?

2 个答案:

答案 0 :(得分:0)

当我发现logstash做了奇怪的事情时,它有时会导致运行两个副本或者目录中的旧配置文件也被logstash读取。这不是每个问题,但最好检查一下。

答案 1 :(得分:0)

我遇到了同样的问题几天,直到我得到了正在发生的事情:Logstash的一个实例只有一个管道处理事件! Logstash提供了将配置拆分为不同文件以便于阅读的功能,但最后它们全部合并一起组成一个配置。

在这种情况下,在加载central.conf和agent.conf之后,Logstash实例管道有两个输入(log4j和redis),一个过滤器(应该只定义一次以避免重复)和两个输出(redis和elasticsearch) 。事件来自两个输入,通过过滤器处理,然后推送到两个输出。

来自log4j输入的事件被推送到redis输出后,再次从redis输入处理到redis输出。这是你的无限循环。

解决方案是“标记”您的事件,以便在事件的生命周期中选择性地应用过滤器和输出。所有输入插件都有一个共同选项 type ,可用于此目的。但正如在documentation中所说的那样,事件的类型是不可变的,所以一旦设置它就不能改变它。我宁愿在此上下文中使用@metadata字段,请参阅下文。

agent.conf

input {
  log4j {
    type => "bdj"
    port => 25827
    add_field => { 
      "[@metadata][event_origin]" => "log4j"
    }
  }
}

filter {
  if [@metadata][event_origin] == "log4j" {
    json {
      source => "message"
    }
  }
}

output {
  if [@metadata][event_origin] == "log4j" {
    redis {
      host => "127.0.0.1"
      data_type => "list"
      key => "logstash"
    }
  }
}

central.conf

input {
  redis {
    host => "localhost"
    data_type => "list"
    key => "logstash"
    add_field => { 
      "[@metadata][event_origin]" => "redis"
    }
  }
}

output {
  if [@metadata][event_origin] == "redis" {
    elasticsearch {
      hosts => "localhost"
      index => "logstash-%{+YYYY.MM.dd}"
    }
  }
}