Logstash 如何解析grok中的文本

Logstash 如何解析grok中的文本,logstash,logstash-grok,Logstash,Logstash Grok,我需要使用grok从该路径捕获两个变量: /opt/data/app_log/server101.log server=needs to be anything after the last forward slash before the dot (in this case server101) index=needs to be the text between the last two forward slashes (in this case app_log) 你知道怎么在格罗克做到

我需要使用grok从该路径捕获两个变量:

/opt/data/app_log/server101.log

server=needs to be anything after the last forward slash before the dot (in this case server101)
index=needs to be the text between the last two forward slashes (in this case app_log)
你知道怎么在格罗克做到这一点吗

 grok {
                patterns_dir => ["/pattern"]
                match =>{path =>"%{WORD:dir1}\/%{WORD:dir2}\/%{WORD:index_name}\/%{WORD:server}\.%{WORD:file_type}"}
                match => {"message" => "%{TIMESTAMP_ISO8601:timestamp},%{NUMBER:Num_field} %{WORD:error_level} %{GREEDYDATA:origin}, %{WORD:logger} - %{GREEDYDATA:message}"}
        }
最简单的解决办法是

/%{DATA:col1}/%{DATA:col2}/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end}
您可以删除名称
col1
col2
end
,以删除这些捕获

此模式依赖于URI中始终存在相同数量的部分。如果有一个可变的数字,你可以使用这样的东西

(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end}
我用电脑制作并测试了这些


使用此模式:

filter {
  grok {
    match => { 
      "message" => <message-pattern>
    }
  }
  grok {
    match => { 
      "log_path" => "(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA}"
    }
  }
}
过滤器{
格罗克{
匹配=>{
“消息”=>
}
}
格罗克{
匹配=>{
“日志路径”=>“(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{greedydydata}”
}
}
}

其中
“log\u path”
是在您执行正常邮件解析后包含日志路径的字段的名称。

我需要将日志文件解析为,我是否能够在一个grok下包含两个匹配项,就像我在原始帖子中修改的一样?如果我这样做,我将无法在我的ES实例中看到从消息解析的字段。您可以在包含路径字符串的字段上使用解析日志的grok筛选器,或者在一个grok中使用此模式的grok筛选器,如上所示?如果我像上面那样做,我看不到我试图从日志文件中提取的自定义字段。