【发布时间】:2018-05-11 16:14:26
【问题描述】:
从字符串
""message" => "27.03.2018 07:53:39 [ERROR] at MyApp.Controllers.Controller.OnException: \nMessage: Controller exception!\nUser: TestUser \nHost: MyLaptop\n\nSystem.Exception: Testing\n at MyApp.Controllers.DoController.Do() in C:\\Users\\User\\Source\\Controllers\\DoController.cs:line 20\n at lambda_method(Closure , ControllerBase , Object[] )\n at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)\n""
我正在尝试匹配“\n 用户\n”并将其放入名为“用户”的新字段中。使用 gsub,我可以使用以下 conf 对其进行很好的变异:
mutate {
gsub => [
"message", "[\n]^User.*\n", "changed"
]
}
但是将其放入 grok 会导致 grokparsefailure。我如何在 grok 中使用它?
【问题讨论】:
-
我遇到了
^的问题。既然用户不在字符串的开头,你怎么能匹配任何东西? -
嗯,我不知道为什么会这样。我只知道它在 gsub 中有效,因为字符串已正确更改。它只是不适用于 grok match。您有什么建议应该改成什么样的正则表达式?
-
要从您的示例中获取
TestUser,我会使用\\nUser: %{USER:user}。您可以使用grokconstructor.appspot.com/do/match 来测试您的 grok 模式。 -
在这种情况下,用户可以由两个或三个单词组成。这种模式是否也适用于这些情况?我也在 grok 过滤器中尝试过,但仍然解析失败: grok { match => { "user" => "\\nUser: %{USER:user}" } }
-
如果要抓取多字用户,可以使用
\\nUser: %{DATA:user} \\n。您的 grok 过滤器的配置无效:您应该使用:grok { match => { "message" => "\\nUser: %{DATA:user} \\n" } }