Logstash过滤器Regex到Field

时间:2015-10-21 09:21:34

标签: regex filter logstash

我在解析日志时面临一些问题。

我有日志行,并且每个日志都包含一个主机名,如ABC123DF 我写了一个正则表达式,我想将它应用于日志并将主机名放在“受害者”字段中这样:

add_field => [ "victim", "/[a-z][a-z][a-z][0-9][0-9][0-9].."

我使用了Mutate过滤器但结果是

受害者/ [a-z] [a-z] [a-z] [0-9] [0-9] [0-9] ..

我想看看:

受害者ABC123DF

我该怎么做?

3 个答案:

答案 0 :(得分:2)

您甚至不需要复杂的正则表达式操作来实现此目的。您可以使用several filters提取字段。在您的情况下,grok filter是一个不错的选择。

我们假设您的日志行如下所示:

20:20:20 ABC123DF 192.168.1.1

然后像这样的 grok过滤器会正确解析主机名:

grok {
    match => { "message" => "%{TIME:timestamp} %{HOST:host} %{IP:srcip}" }
}

您还可以在grok (docs)中使用正则表达式。示例模式:

%{GREEDYDATA} (?<host>.*) %{GREEDYDATA}

但是,我建议在grok中避免使用正则表达式。使用包含的模式是一种更好的方法。使用grok debugger为您找到合适的模式。

答案 1 :(得分:2)

我使用此网站http://grokconstructor.appspot.com/do/match#result来测试我的正则表达式。

在我的mongodb日志中,我有这样的文字:

  

2016-05-17T16:26:07.018-0300 I QUERY [conn50628097] getmore   dataBaseName.collectionName查询:{empresa:&#34; ********&#34; }   cursorid:443889850763 ntoreturn:0 keyUpdates:0 writeConflicts:0   numYields:69 nreturned:8886 reslen:1184746 locks:{Global:{   acquireCount:{r:140}},数据库:{acquireCount:{r:70},   acquireWaitCount:{r:66},timeAcquiringMicros:{r:98046}},   收集:{acquireCount:{r:70}}} 178ms

为了获取查询和时间,在配置文件中,我创建了这个过滤器:

    filter {
      if [source] == "/var/log/mongodb/mongod.log" {
        grok {
          match=> {
            "message" => [
              "(getmore|query)\s(?<mongo_database>[a-zA-Z_]+)\.(?<mongo_collection>[a-zA-Z_.]+)\s?query:\s(?<mongo_query>\{.*?\})\s(cursorid|planSummary).*?\s(?<mongo_totaltime>[0-9]+ms)"
            ]
          }
        }
      }
    }

使用:

    (?<you_new_field_name>you_regex)you_regex(?<you_new_field_name>you_regex)(?<you_new_field_name>you_regex)

之后,你可以:

    add_field => [ "tag_text_optional%{you_new_field_name}", "%{you_new_field_name}" ]

答案 2 :(得分:0)

所以在我的情况下,日志是:

2015-10-20 14:45:42,156 [pool-3-thread-1] INFO审核终止abc123df来自LLDS2Cassandra [LOCAL]组与NetworkCorruption

grok {
    match => { "message" => "%{TIME:timestamp} %{LOGLEVEL} %{VICTIM:victim} " }
}

在grok模式中,我将以下行: VICTIM [a-z][a-z][a-z][0-9][0-9][0-9]

获得以下结果:

FIELD:TIMESTAMP 价值:2015-10-20 14:45:42,156

FIELD:VICTIM 价值:abc123df

领域:LOGLEVEL
VALUEE:INFO