logstash配置文件 - 分离出用户和消息

时间:2014-11-18 01:00:11

标签: logstash

logstash的新功能。我正在尝试解析应用程序日志行,例如:

2014-11-05 16:59:36,779 ERROR DOMAINNAME \ bob [这是一个错误。 ]

我的配置文件如下所示:

input { 
  file {
    path => "C:/tmp/*.log"
  }
}

filter {
  grok {
    match => [
        "message", "%{TIMESTAMP_ISO8601:timestamp}\s*%{LOGLEVEL:level}\s*%{DATA:userAlias}\s*%{GREEDYDATA:message}"
    ]
    overwrite => [ "message" ]
  }

  if [level] =~ "INFO" {
    drop {
    }
  }
}

output {
  elasticsearch {
    host => "localhost"
    protocol => "http"
  }
}

时间戳和级别被解析得很好,但消息显示在Kibana中:

消息: DOMAINNAME \ bob [这是一个错误。 ]

DATA的grok模式是。*? 所以我认为它应该处理反斜杠\并正确设置 userAlias到DOMAINNAME \ bob和 消息到[这是一个错误。 ] 但事实并非如此。我在这做错了什么?感谢。

1 个答案:

答案 0 :(得分:0)

你的grok模式的问题是.*?是非贪婪的(即可选)而.*是贪婪的,所以后者&#34;接管&#34; 可能已被<{1}}模式匹配的字符串。

我建议你避免使用DATA和GREEDYDATA模式,除了匹配字符串的其余部分(比如你在这里使用GREEDYDATA)。在这种情况下你可以例如使用NOTSPACE模式匹配用户名。您可以使用更具体的模式,例如排除用户名中无效的字符,但我不明白这一点。这有效:

.*?

(我也冒昧用\ s +替换\ s *,因为字段之间的空格不是可选的。)