将日志条目与logstash组合在一起

时间:2016-04-01 15:53:59

标签: elasticsearch logstash elastic-stack logstash-configuration

我想从dnsmasq收集和处理日志,我决定使用ELK。 Dnsmasq用作DHCP服务器和DNS解析器,因此它为两个服务创建日志条目。

我的目标是使用请求者IP,请求者主机名(如果可用)和请求者mac地址向Elasticsearch发送所有DNS查询。无论设备IP是否更改,这都允许我按mac地址对请求进行分组,并显示主机名。

我想做的是以下内容:

1)阅读以下条目:

Mar 30 21:55:34 dnsmasq-dhcp[346]: 3806132383 DHCPACK(eth0)  192.168.0.80 04:0c:ce:d1:af:18 air

2)临时存储关系:

192.168.0.80 =>的 04:0C:CE:D1:AF:18

192.168.0.80 =>的空气

3)丰富下面的条目,添加mac地址和主机名。如果主机名为空,我会添加mac地址。

Mar 30 22:13:05 dnsmasq[346]: query[A] imap.gmail.com from 192.168.0.80

我找到了一个名为“memorize”的模块,允许我存储它们,但遗憾的是它不适用于最新版本的Logstash

我使用的版本:

ElastiSearch 2.3.0
Kibana 4.4.2
Logstash 2.2.2

logstash过滤器(这是我第一次尝试使用logstash,因此我确定可以改进配置文件)

input {
  file {
    path => "/var/log/dnsmasq.log"
    start_position => "beginning"
    type => "dnsmasq"
  }
}  

filter {
  if [type] == "dnsmasq" {
    grok {
      match =>  [ "message", "%{SYSLOGTIMESTAMP:reqtimestamp} %{USER:program}\[%{NONNEGINT:pid}\]\: ?(%{NONNEGINT:num} )?%{NOTSPACE:action} %{IP:clientip} %{MAC:clientmac} ?(%{HOSTNAME:clientname})?"]
      match =>  [ "message", "%{SYSLOGTIMESTAMP:reqtimestamp} %{USER:program}\[%{NONNEGINT:pid}\]\: ?(%{NONNEGINT:num} )?%{USER:action}?(\[%{USER:subaction}\])? %{NOTSPACE:domain} %{NOTSPACE:function} %{IP:clientip}"]
      match =>  [ "message", "%{SYSLOGTIMESTAMP:reqtimestamp} %{USER:program}\[%{NONNEGINT:pid}\]\: %{NOTSPACE:action} %{DATA:data}"]
    }

    if [action] =~ "DHCPACK" {

    }else if [action] == "query" {

    }else
    {
      drop{}
    }
  }
}
output {
  elasticsearch { hosts => ["localhost:9200"] }
  stdout { codec => rubydebug }
}

问题:

1)是否有替代使用最新logstash版本的插件“memorize”?另一个插件或不同的程序。

2)我应该将logstash降级到2之前的版本(我认为之前是1.5.4)?如果是这样,是否存在任何已知的服务器问题或与elasticsearch 2.2.1不兼容?

3)或者我应该修改插件“memorize”允许logstash 2.x(如果是这样我会欣赏任何关于如何开始的指针)?

2 个答案:

答案 0 :(得分:2)

在我看来,没有必要为此重新打包memorize插件。您可以使用aggregate filter来实现您想要的效果。

...

# record host/mac in temporary map
if [action] =~ "DHCPACK" {
  aggregate {
     task_id => "%{clientip}"
     code => "map['clientmac'] = event['clientmac']; map['clientname'] = event['clientname'];"
     map_action => "create_or_update"
     # timeout set to 48h
     timeout => 172800
  }
}

# add host/mac where/when needed
else if [action] == "query" {
   aggregate {
     task_id => "%{clientip}"
     code => "event['clientmac'] = map['clientmac']; event['clientname'] = map['clientname']"
     map_action => "update"
   }
}

答案 1 :(得分:0)

所以使用memstize和logstash> 2.0

  • 克隆存储库。
  • 打开文件logstash-filter-memorize.gemspec
  • s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 2.0.0'更改为s.add_runtime_dependency "logstash-core", '>= 1.4.0', '< 3.0.0'
  • 通过以下方式构建插件:gem build logstash-filter-memorize.gemspec
  • 通过以下方式安装:$ bin/logstash-plugin install /path/to/memorize/logstash-filter-memorize-0.9.1.gem

我试过了,似乎有效。