【问题标题】:Drop log messages containing a specific string删除包含特定字符串的日志消息
【发布时间】:2016-10-30 08:02:39
【问题描述】:

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

[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"

  }
}

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

【问题讨论】:

  • 你应该问两个问题而不是一个问题。

标签: elasticsearch logstash logstash-configuration


【解决方案1】:

要检查您的消息是否包含子字符串,您可以这样做:

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

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

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

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

这与我的时间戳相匹配:

  • 源字段:“时间戳”(参见匹配项)
  • 格式为“ISO...”,您可以使用与您的时间戳匹配的自定义格式
  • 时区 - 不言自明
  • 目标 - 将其写回事件的“@timestamp”字段
  • 添加调试字段以检查是否匹配正确

希望对你有帮助,

阿图尔

【讨论】:

    【解决方案2】:

    删除不包含字符串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 参数另有指定。

    【讨论】:

    • 我可以做target =&gt; "Date" ...它会覆盖最初的“日期”吗?
    • 是的,它将覆盖Date 字段,将字符串替换为日期。如果目标选项不存在,它将覆盖@timestamp 字段
    • 官方文档说 - “对于非格式化语法,你需要在值周围加上单引号字符。例如,如果你正在解析 ISO8601 时间,“2015-01-01T01 :12:23”那个小“T”不是有效的时间格式,而你想说“字面意思是一个T”,你的格式应该是这样的:“yyyy-MM-dd'T'HH:mm:ss ""
    • 我需要像match =&gt; [ "Date", "YYYY-mm-dd'T'HH:mm:ss" ]那样添加T吗?虽然我的日志没有 T 。
    • 因为只要按照你说的做 ..Kibana 将 Date 显示为例如。 2016-01-06T23:27:32.797Z。我不明白 T 和 Z 是干什么用的?
    猜你喜欢
    • 2020-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2012-03-21
    • 2012-07-02
    • 1970-01-01
    相关资源
    最近更新 更多