在字段中存储 Logstash Grok 分解
Store Logstash Grok decomposition in a field
我正在尝试解析日志,其中我有 2 个我想使用 logstash 解析的 URI。
使用此输入(2 个 URI 由 space 分隔):
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
我想获取以下文件:
{
"source": {
"URI" : "https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto",
"URIPROTO" : "https",
"URIHOST": "www.elastic.co",
"URIPATHPARAM": "/guide/en/logstash/current/plugins-filters-grok.html?toto",
...
},
"destination" : {
"URI" : "https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",
"URIPROTO" : "https",
"URIHOST": "github.com",
"URIPATHPARAM": "/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",
...
}
}
我一直在尝试使用这个 grok 过滤器 :
%{URI:source} %{URI:destination}
但我得到以下结果,其中源和目标信息(URIPROTO
、URIHOST
...)合并到文档根节点的数组中:
{
"source": [
"https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto"
],
"URIPROTO": [
"https",
"https"
],
...
"URIHOST": [
"www.elastic.co",
"github.com"
],
"IPORHOST": [
"www.elastic.co",
"github.com"
],
"HOSTNAME": [
"www.elastic.co",
"github.com"
],
"IP": [
null,
null
],
...
"destination": [
"https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns"
]
}
有没有人遇到过这种情况并找到了解决办法?
预先感谢您的帮助!
%{URI} 模式不会从 URI 的组件创建任何字段。如果您希望将它们分开(针对一个或两个 URI),您需要制作自己的模式。复制 URI 的定义并添加字段分配给您:
%{URIPROTO:[foo][proto]}://(?:%{USER:[foo][user]}(?::[^@]*)?@)?(?:%{URIHOST:[foo][host]})?(?:%{URIPATHPARAM:[foo][pathparam]})? %{URIPROTO:[bar][proto]}://(?:%{USER:[bar][user]}(?::[^@]*)?@)?(?:%{URIHOST:[bar][host]})?(?:%{URIPATHPARAM:[bar][pathparam]})?
请注意,URIHOST 将创建一个 'port' 字段,对于两个 URI,该字段不会是唯一的。要解决此问题,请将我的模式中的每个 URIHOST 替换为:
%{IPORHOST}(?::%{POSINT:[myField]})?
为每个 'myField' 使用所需的目的地。
我正在尝试解析日志,其中我有 2 个我想使用 logstash 解析的 URI。
使用此输入(2 个 URI 由 space 分隔):
https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
我想获取以下文件:
{
"source": {
"URI" : "https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto",
"URIPROTO" : "https",
"URIHOST": "www.elastic.co",
"URIPATHPARAM": "/guide/en/logstash/current/plugins-filters-grok.html?toto",
...
},
"destination" : {
"URI" : "https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",
"URIPROTO" : "https",
"URIHOST": "github.com",
"URIPATHPARAM": "/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns",
...
}
}
我一直在尝试使用这个 grok 过滤器 :
%{URI:source} %{URI:destination}
但我得到以下结果,其中源和目标信息(URIPROTO
、URIHOST
...)合并到文档根节点的数组中:
{
"source": [
"https://www.elastic.co/guide/en/logstash/current/plugins-filters-grok.html?toto"
],
"URIPROTO": [
"https",
"https"
],
...
"URIHOST": [
"www.elastic.co",
"github.com"
],
"IPORHOST": [
"www.elastic.co",
"github.com"
],
"HOSTNAME": [
"www.elastic.co",
"github.com"
],
"IP": [
null,
null
],
...
"destination": [
"https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns"
]
}
有没有人遇到过这种情况并找到了解决办法? 预先感谢您的帮助!
%{URI} 模式不会从 URI 的组件创建任何字段。如果您希望将它们分开(针对一个或两个 URI),您需要制作自己的模式。复制 URI 的定义并添加字段分配给您:
%{URIPROTO:[foo][proto]}://(?:%{USER:[foo][user]}(?::[^@]*)?@)?(?:%{URIHOST:[foo][host]})?(?:%{URIPATHPARAM:[foo][pathparam]})? %{URIPROTO:[bar][proto]}://(?:%{USER:[bar][user]}(?::[^@]*)?@)?(?:%{URIHOST:[bar][host]})?(?:%{URIPATHPARAM:[bar][pathparam]})?
请注意,URIHOST 将创建一个 'port' 字段,对于两个 URI,该字段不会是唯一的。要解决此问题,请将我的模式中的每个 URIHOST 替换为:
%{IPORHOST}(?::%{POSINT:[myField]})?
为每个 'myField' 使用所需的目的地。