删除包含特定字符串的日志消息

时间:2016-06-28 06:31:38

标签: elasticsearch logstash logstash-configuration

所以我有格式的日志消息:

[INFO]  <blah.blah>       2016-06-27 21:41:38,263 some text
[INFO]  <blah.blah>       2016-06-28 18:41:38,262 some other text

现在我想删除所有不包含特定字符串“xyz”的日志,并保留所有其余内容。我也想索引时间戳。

grokdebug没有多大帮助。

这是我的尝试:

input {
    file {
         path => "/Users/username/Desktop/validateLogconf/logs/*"
      start_position => "beginning"

   }
}

filter {

  grok {
      match => {
      "message" => '%{SYSLOG5424SD:loglevel}  <%{JAVACLASS:job}>       %{GREEDYDATA:content}'
      }
  }

  date {
    match => [ "Date", "YYYY-mm-dd HH:mm:ss" ]
    locale => en
  }

}

output {
  stdout {
codec => plain {
                        charset => "ISO-8859-1"
                }

}
    elasticsearch {
        hosts => "http://localhost:9201"
        index => "hello"

  }
}

我是grok的新手,所以上面的模式可能没有意义。请帮忙。

2 个答案:

答案 0 :(得分:10)

删除不包含字符串xyz的消息:

if ([message] !~ "xyz") {
    drop { }
}

您的grok模式没有抓住日志的日期部分 从包含日期的grok模式中获得一个字段后,您可以在此字段上调用日期过滤器 所以你的grok过滤器看起来应该是这样的:

grok {
    match => {
        "message" => '%{SYSLOG5424SD:loglevel}  <%{JAVACLASS:job}>       %{TIMESTAMP_ISO8601:Date} %{GREEDYDATA:content}'
    }
}

我添加了一个部分来获取日期,该日期位于Date字段中。然后你可以使用日期过滤器:

date {
    match => [ "Date", "YYYY-mm-dd HH:mm:ss,SSS" ]
    locale => en
}

我添加了,SSS,以便格式与Date字段中的格式匹配。 解析后的日期将存储在@timestamp字段中,除非使用target参数进行不同的指定。

答案 1 :(得分:3)

要检查您的消息是否包含子字符串,您可以执行以下操作:

if [message] =~ "a" {
   mutate {
      add_field => { "hello" => "world" }
   }
}

因此,在您的情况下,您可以使用if来调用drop {}过滤器,或者您可以将输出插件包装在其中。

要解析日期并将其写回时间戳字段,您可以使用以下内容:

date {
    locale => "en"
    match => ["timestamp", "ISO8601"]
    timezone => "UTC"
    target => "@timestamp"
    add_field => { "debug" => "timestampMatched"}
}

这符合我的时间戳:

  • 来源字段:“timestamp”(请参阅​​匹配)
  • 格式为“ISO ...”,您可以使用与时间戳匹配的自定义格式
  • 时区 - 自我解释
  • target - 将其写回事件的“@timestamp”字段
  • 添加调试字段以检查其是否已正确匹配

希望有所帮助,

阿图尔