过滤数据时出现logstash grok问题
Posted
技术标签:
【中文标题】过滤数据时出现logstash grok问题【英文标题】:logstash grok issue while filtering data 【发布时间】:2019-05-21 05:26:44 【问题描述】:我有一个数据,基本上是通过 rm 命令删除数据,如下所示。
ttmv516,19/05/21,03:59,00-mins,dvcm,dvcm 166820 4.1 0.0 4212 736 ? DN 03:59 0:01 rm -rf /dv/project/agile/mce_dev_folic/test/install.asan/install,/dv/svgwwt/commander/workspace4/dvfcronrun_IL-SFV-RHEL6.5-K4_kinite_agile_invoke_dvfcronrun_at_given_site_50322
我在下面使用 logstash grok,它工作正常,但直到最近我才看到两个奇怪的问题 1)_grokparsefailure
另一个 2)Hostname Field
没有正确显示,即它的初始字符不像ttmv516
看起来像mv516
。
%HOSTNAME:Hostname,%DATE:Date,%HOUR:dt_h:%MINUTE:dt_m,%NUMBER:duration-%WORD:hm,%USER:User,%USER:User_1 %NUMBER:Pid %NUMBER:float %NUMBER:float %NUMBER:Num_1 %NUMBER:Num_2 %DATA (?:%HOUR:dt_h1:|)(?:%MINUTE:dt_m1|) (?:%HOUR:dt_h2:|)(?:%MINUTE:dt_m2|)%GREEDYDATA:CMD,%GREEDYDATA:PWD_PATH
但是,在 Kibana 数据中使用 grok Debugger 进行相同的测试显示正确。
我的logstash文件如下。
cat /etc/logstash/conf.d/rmlog.conf
input
file
path => [ "/data/rm_logs/*.txt" ]
start_position => beginning
sincedb_path => "/data/registry-1"
max_open_files => 64000
type => "rmlog"
filter
if [type] == "rmlog"
grok
match => "message" => "%HOSTNAME:Hostname,%DATE:Date,%HOUR:dt_h:%MINUTE:dt_m,%NUMBER:duration-%WORD:hm,%USER:User,%USER:User_1 %NUMBER:Pid %NUMBER:float %NUMBER:float %NUMBER:Num_1 %NUMBER:Num_2 %DATA (?:%HOUR:dt_h1:|)(?:%MINUTE:dt_m1|) (?:%HOUR:dt_h2:|)(?:%MINUTE:dt_m2|)%GREEDYDATA:CMD,%GREEDYDATA:PWD_PATH"
add_field => [ "received_at", "%@timestamp" ]
remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
output
if [type] == "rmlog"
elasticsearch
hosts => ["myhost.xyz.com:9200"]
manage_template => false
index => "pt-rmlog-%+YYYY.MM.dd"
任何帮助建议将不胜感激。
编辑:
根据我的观察失败的消息..
ttmv540,19/05/21,03:59,00-hrs,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv540.373
ttmv541,19/05/21,03:43,-mins,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv541.373
但是,我尝试使用以下条件编辑 grok,但它仍然删除了少数字段..
input
file
path => [ "/data/rm_logs/*.txt" ]
start_position => beginning
max_open_files => 64000
sincedb_path => "/data/registry-1"
type => "rmlog"
filter
if [type] == "rmlog"
grok
match => "message" => "%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,%NUMBER:duration-%WORD:hm,%USER:user,%USER:group %NUMBER:pid %NUMBER:float %NUMBER:float %NUMBER:num_1 %NUMBER:num_2 %DATA (?:%HOUR:time_h1:|)(?:%MINUTE:time_m1|) (?:%HOUR:time_h2:|)(?:%MINUTE:time_m2|)%GREEDYDATA:cmd,%GREEDYDATA:pwd"
add_field => [ "received_at", "%@timestamp" ]
remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
if "_grokparsefailure" in [tags]
grok
match => "message" => "%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,-%WORD:duration,%USER:user,%USER:group%GREEDYDATA:cmd"
add_field => [ "received_at", "%@timestamp" ]
remove_field => [ "@version", "host", "message", "_type", "_index", "_score" ]
output
if [type] == "rmlog"
elasticsearch
hosts => ["myhost.xyz.com:9200"]
manage_template => false
index => "pt-rmlog-%+YYYY.MM.dd"
注意:看起来_grokparsefailure
标记适用于以下消息,但在其他消息上仍然失败..
1) 这行得通..
ttmv541,19/05/21,03:43,-mins,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv541.373
ttmv540,19/05/21,03:59,00-hrs,USER,USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND,/local/ntr/ttmv540.373
2) 第二行文本日志失败,因为它有 00-hrs
与之关联的数字,现在无法满足以下两个条件 grok ..
%HOSTNAME:hostname,%DATE:date,%HOUR:time_h:%MINUTE:time_m,-%WORD:duration,%USER:user,%USER:group%GREEDYDATA:cmd
【问题讨论】:
Logstash grok 过滤器是否总是在每个条目上失败?或者它对某些人有效而对其他人无效?如果它仅适用于某些条目,您能否提供更多示例?尝试修改脚本,以免删除“消息”字段,并在 grok 无法解析的条目上查看它的外观。 它在某些情况下大部分都失败了,我遇到了一些失败的情况,让我更新一下。 @mihomir,我只是用我应用的新东西更新帖子 【参考方案1】:我将处理分成两部分,一部分处理主机名和时间戳问题,另一部分处理行的其余部分。我发现这使维护更容易。
所以你只剩下这两个输入:
ttmv541,19/05/21,03:43,-mins
ttmv540,19/05/21,03:59,00-hrs
你的两个模式将很好地匹配前几部分,所以问题是你想如何在时间之后解析出这些东西。在您的原始模式中,您使用 duration
作为数字部分,使用 hm
作为单位。在您的第二种模式中,您似乎将单位放入duration
,这可能是不正确的。
如果没有更多信息,持续时间似乎是可选的,但您将始终拥有单位。这可以反映在您的模式中,例如:
(%NUMBER:duration)?-%WORD:hm
还要注意,如果您最终需要多个模式,则不必依赖 grokparsefailure 来使用它们 - match->message 可以采用数组。示例见the doc。
【讨论】:
@Alan,非常感谢这个很棒的建议 +1,我正在测试这个 艾伦,如果你不介意,你能解释一下Also note that if you ever end up needing multiple patterns, you don't have to depend on the grokparsefailure to use them - match->message can take an array.
我添加了文档的链接。你可以给匹配多个模式来使用。以上是关于过滤数据时出现logstash grok问题的主要内容,如果未能解决你的问题,请参考以下文章
Logstash收集nginx日志之使用grok过滤插件解析日志