你如何在grok中解析文本

时间:2016-06-01 15:12:24

标签: 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中做到这一点?

 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}"}
        }

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是

/%{DATA:col1}/%{DATA:col2}/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end}

您可以移除名称col1col2end以删除这些捕获。

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

(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA:end}

我使用the grok constructor

制作并测试了这些内容

使用此模式:

filter {
  grok {
    match => { 
      "message" => <message-pattern>
    }
  }
  grok {
    match => { 
      "log_path" => "(?:/%{USER})*/%{DATA:index}/%{DATA:server}\.%{GREEDYDATA}"
    }
  }
}

其中"log_path"是包含正常消息解析后的日志路径的字段的名称。