Logstash基于现有字段

时间:2018-05-17 14:42:06

标签: elasticsearch logstash elastic-stack logstash-grok

我使用jdbc输入插件来自数据库查询的数据和来自查询的结果包含url字段,我想从中提取一些属性。

网址示例:

  
      
  • /incident.do?sys_id=0dc18b246faa17007a64cbe64f3ee4e1&sysparm_view
  •   
  • /navpage_form_default.do
  •   
  • /u_pm_prov_project_list.do?sysparm_userpref_module=fa547ce26f661
  •   
  • JOB:电子邮件阅读活动流程
  •   
  • JOB:系统 - 减少资源
  •   

我在grok模式文件中添加了正则表达式模式:

webpage_category .*
job_type .*

我有两种类型的网址,所以我在过滤块中使用它来区分它们

Config我到目前为止尝试过:

filter {
       if [url] =~ /JOB: .*/ {
               grok {
                    patterns_dir => ["/etc/logstash/patterns"]
                    match => {
                             "url" => "JOB: %{job_type:job_type}"
                    }
               }
        } else
        if [url] =~ /\/.*\.do\?.*/ {
                grok {
                     patterns_dir => ["/etc/logstash/patterns"]
                     match => {
                              "url" => "/{webpage_category:webpage_category}\.do\?.*"
                     }
                 }
         }
}

为以JOB:开头的网址创建新字段的工作正常,但webpage_category根本不起作用。是因为正则表达式不能在匹配中使用吗?

1 个答案:

答案 0 :(得分:0)

问题是您尝试在grok过滤器中使用mutate模式,这样做不会起作用。 mutategrok是两个独立的过滤插件。

如果要使用grok模式创建字段,则需要在grok过滤器内使用add_field。请记住add_field is supported by all filter plugins.

请看下面的例子,

filter {
  grok {
    add_field => { "foo_%{somefield}" => "Hello world, from %{host}" }
  }
}

在你的情况下,它将是,

filter{
   grok {
      add_field => {
         "webpage_category" => "%{webpage_category:url}"
          "job_type" => "%{job_type:url}"
       }
   }
}

请确保导入patterns_dir

patterns_dir => ["./patterns"] => ["./patterns"]

请结帐grok filter documentation