【问题标题】:Logstash new field from other field with regex使用正则表达式从其他字段 Logstash 新字段
【发布时间】: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" } }

标签: logstash logstash-grok


【解决方案1】:

你来了,

User:%{SPACE}%{WORD:user}

这将使用用户名创建一个新字段user,

{
  "SPACE": [
    [
      " "
    ]
  ],
  "user": [
    [
      "TestUser"
    ]
  ]
}

【讨论】:

    【解决方案2】:

    我最终得到:

    grok { 
         match => { 
            "message" => "User:%{GREEDYDATA:user}\n" 
         } 
    }
    

    这似乎匹配 "User:" 和 "\n" 之间的所有内容

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-29
      相关资源
      最近更新 更多