2015-09-03 59 views
3

我在同一个日志文件这三种日志行:logstash grok - 如何进行条件模式匹配?

INFO [2015-08-27 18:46:14,279] ({qtp243745864-44} NotebookServer.java[onMessage]:101) - RECEIVE << RUN_PARAGRAPH 
INFO [2015-08-27 18:46:14,322] ({qtp243745864-44} NotebookServer.java[broadcast]:253) - SEND >> NOTE 
INFO [2015-08-27 18:46:16,809] ({pool-1-thread-2} RemoteInterpreter.java[init]:144) - Create remote interpreter org.apache.zeppelin.markdown.Markdown 

我想他们PARS使用神交,但未能得到正确的字段: 1)如何收杆括号内的数据? 2)日志行的最后部分是任一(CMD方向cmd_data)或在实施例(CMD信息) :

cmd=Receive or SEND 
cmd_direction=<<or>> 
cmd_data=RUN_PARAGRAPH or NOTE 

但最后一行是CMD信息不对应于相同的格式。

我想找到匹配第一个和第二个但不是第三个的正确规则。 最终结果应该是(cmd + cmd_data)或(cmd_info)字段 有什么帮助吗?

回答

9

Logstash在配置文件中有条件,所以你可以有条件地匹配东西。

例如:

if ([mesage] =~ /(RECEIVE|SEND)/) { 
    grok { 
     // do your grok here 
    } 
} else if ([message] =~ /RemoteInterpreter/) { 
    grok { 
     // do some other grok here 
    } 
} 

如果您需要与grok S的关系是什么样的帮助,请尝试使用grok debugger

+0

Can这是在正则表达式上完成的?例如如果([mesage] =〜/(^ \ S + <<^\ S + |^\ S + >>^\ S +) –

+0

您可以使用带if的正则表达式,但是'^'放置错误 - 它的(\ S +(<<|>>)\ S +)' – Alcanzar

+0

谢谢!请稍后测试一下 –

0

我有一个类似的问题...

它帮助我:

if ("SEND" in [message]) { 
    grok { 
     // do your grok here 
    } 
}