logstash-grok中的数据模式

logstash-grok中的数据模式,logstash,logstash-grok,Logstash,Logstash Grok,我试图理解logstash的grok插件中的数据模式。 根据文档数据匹配如下: 数据。*?-->我将其解释为长度为1到n的任何内容[请 如果我的理解有误,请纠正我] 在我的脚本中,它无法正确解析我的输入。 日志存储配置: input{ file { path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"] start_position => beginning sincedb_p

我试图理解logstash的grok插件中的
数据
模式。
根据文档
数据
匹配如下:

数据。*?
-->我将其解释为长度为1到n的任何内容[请 如果我的理解有误,请纠正我]

在我的脚本中,它无法正确解析我的输入。
日志存储配置:

input{
file {
        path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"]
        start_position => beginning
        sincedb_path => "/home/osboxes/logstash_conf/mydir/.sincedb"
   }
}
filter{
        grok {
                match => { "message" => "^%{TIMESTAMP_ISO8601:timeStamp},%{DATA:ID},%{DATA:somedata}" }
        }
}
output {
   stdout {
        codec => json_lines
   }
} 
2017-01-09 02:00:03.887,a,a 
{
    "message": "2017-01-09 02:00:03.887,a,a",
    "@version": "1",
    "@timestamp": "2017-01-09T12:28:20.958Z",
    "path": "/home/osboxes/logstash_conf/mydir/test_logs/data",
    "host": "osboxes",
    "timeStamp": "2017-01-09 02:00:03.887",
    "ID": "a"
}
输入:

input{
file {
        path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"]
        start_position => beginning
        sincedb_path => "/home/osboxes/logstash_conf/mydir/.sincedb"
   }
}
filter{
        grok {
                match => { "message" => "^%{TIMESTAMP_ISO8601:timeStamp},%{DATA:ID},%{DATA:somedata}" }
        }
}
output {
   stdout {
        codec => json_lines
   }
} 
2017-01-09 02:00:03.887,a,a 
{
    "message": "2017-01-09 02:00:03.887,a,a",
    "@version": "1",
    "@timestamp": "2017-01-09T12:28:20.958Z",
    "path": "/home/osboxes/logstash_conf/mydir/test_logs/data",
    "host": "osboxes",
    "timeStamp": "2017-01-09 02:00:03.887",
    "ID": "a"
}
输出:

input{
file {
        path => ["/home/osboxes/logstash_conf/mydir/test_logs/*"]
        start_position => beginning
        sincedb_path => "/home/osboxes/logstash_conf/mydir/.sincedb"
   }
}
filter{
        grok {
                match => { "message" => "^%{TIMESTAMP_ISO8601:timeStamp},%{DATA:ID},%{DATA:somedata}" }
        }
}
output {
   stdout {
        codec => json_lines
   }
} 
2017-01-09 02:00:03.887,a,a 
{
    "message": "2017-01-09 02:00:03.887,a,a",
    "@version": "1",
    "@timestamp": "2017-01-09T12:28:20.958Z",
    "path": "/home/osboxes/logstash_conf/mydir/test_logs/data",
    "host": "osboxes",
    "timeStamp": "2017-01-09 02:00:03.887",
    "ID": "a"
}

我希望标签
somedata
将填充值[就像标签
ID
]一样],但它从输出中被忽略。任何人请帮助我理解
数据
模式的行为

*?
在零次和无限次之间进行匹配,匹配次数尽可能少,并根据需要进行扩展。它可以匹配零次这一事实是您看不到结果的原因

写出后,问题部分如下所示:

,(.*),(.*)
(为了可读性而添加了捕获组)

这与:
,a,

1.取第一个
并匹配它

2.尽可能少地匹配
*?
(一个字符一个字符地匹配,直到模式有效),这与
a

3.尝试匹配下一个
。这成功了,第一个
*?
就完成了

4.尝试匹配
*?
。因为它可以匹配零次,所以它将这样做,并且匹配完成



解决问题的简单方法是在模式末尾添加一个
$
$
是一个字符串结束锚,因此您的第二个
*?
将被迫与另一个
a

匹配。谢谢您的回答。在这种情况下,是否有
数据
模式可靠,或者我需要寻找其他模式?正如您所提到的,它可能匹配零字符,在某些情况下,它可能会跳过我确实感兴趣的值…@G.S如果您使用
$
终止您的模式,您应该可以继续。这将确保您的第二个
数据必须匹配某些内容。请理解。我只是担心类似的行为发生在<代码>数据< /代码>中间。代码>$
只能用于最后一个字段。不确定中间字段的
数据是否会失败。只是为了确保它是正确的reliable@G.S如果你真的想确保你的模式工作,你可以使用Grokdebugger。非常感谢!这很有帮助。以防万一,如果有人遵循此线程并希望调试-这是grok在线调试器-