使用logstash解析日志
我的日志如下表所示:使用logstash解析日志,logstash,Logstash,我的日志如下表所示: TFMLOG252252 1454964680185 2016-02-09 02:21:20.185 204 - - - - DEV gcfo dev dev 0.0.1-SNAPSHOT a70d72f-1a-152c2a725f9000 INFO INFO - - - - applog.cls=com.walmart.ecommerce.getcustomerfulfillmentorder.cache.
TFMLOG252252 1454964680185 2016-02-09 02:21:20.185 204 - - - - DEV gcfo dev dev 0.0.1-SNAPSHOT a70d72f-1a-152c2a725f9000 INFO INFO - - - - applog.cls=com.walmart.ecommerce.getcustomerfulfillmentorder.cache.impl.GetCustomerFulfillOrderCacheManager,applog.mthd=getFulfillmentSystem,applog.line=40,applog.msg=Entered getfulfillmentSystem
TFMLOG252252 1454964690141 2016-02-09 02:21:30.141 204 - - - - DEV gcfo dev dev 0.0.1-SNAPSHOT a70d72f-1a-152c2a74cdd000 INFO INFO - - - - applog.cls=com.walmart.ecommerce.getcustomerfulfillmentorder.camel.AuditEventNotifier,applog.mthd=notify,applog.line=26,applog.msg=Audit String: Endpoint//=Endpoint[http://dummyhost]//,TransId//=null//,Order Number//=201601290102//,NodeId//=5509//,CountryCode//=US//,FirstName//=null//,LastName//=PUTTESTING//,OrderType//=PUT//,MaxOrderCount//=32//,ResponseTime//=2131
TFMLOG252252 1454964900004 2016-02-09 02:25:00.004 204 - - - - DEV gcfo dev dev 0.0.1-SNAPSHOT a70d72f-e-152c2aa80a4005 HB LOG - TH COUNTS - sampling.rate=1024,quota.limit=10485760,quota.msg.dropped=0,sampling.msg.dropped=0,sampling.msg.received=7
TFMLOG252252 1454964688008 2016-02-09 02:21:28.008 204 - - - - DEV gcfo dev dev 0.0.1-SNAPSHOT a70d72f-1a-152c2a74488000 INFO INFO - - - - applog.msg=TransID//=213564 ENTERED IN FUNC FUL
现在我只想解析类型2和类型4的日志。我该怎么做
截至目前,我已编写了此过滤器:
filter{
grok{
match => { "message" => "%{WORD:loggingid}\s*%{NUMBER:epoch}\s*%{TIMESTAMP_ISO8601:timestamp}\s*%{NUMBER:system}\s*-\s*-\s*-\s*-\s*%{WORD:env}\s*%{WORD:appid}\s*%{WORD:dc}\s*%{WORD:envid}\s*%{NOTSPACE:appversion}\s*%{NOTSPACE:msgid}\s*%{WORD:msgtype}\s*%{WORD:msgsubtype}\s*-\s*-\s*-\s*-\s*%{GREEDYDATA:actuallog}"}
}
}
此筛选器能够解析类型1、2和4,但解析类型3失败。我尝试使用%{WORD}表示-但失败了
我的逻辑是:我想我会将实际日志写入字段actual_log,然后查看actual_log是否包含“TransId”或“TransId”,否则使用drop filter删除该日志。如果没有删除事件,我将使用kv filter从实际的_日志中获取键值对,并删除其他不必要的字段(例如:loggingid、epoch等),然后将其放入弹性搜索
现在我有几个问题:
1) How to parse the "-" ?
2) Is my logic correct?
我想到的一个解决方法是,我可以检查我是否得到grokparsefailure,我不会将它放在弹性搜索中,这样我就可以将它放在两者之间。这有意义吗?正如您应该知道的,您的模式在第三行不起作用,因为您需要4个催眠,而这不是您输入的内容 如果这六个值:
INFO INFO - - - -
与这些值相同的字段:
HB LOG - TH COUNTS -
然后将它们全部放入各自的字段中,不管该字段是否包含“-”或类似“计数”的内容。正如您所发现的,%{WORD}与连字符不匹配,因此您需要使用类似%{NOTSPACE}的内容
如果第3行实际上是一种不同的格式,那么考虑在一个GROK StAZA中把所有常见的东西拉到前面(也许是“MSGSype”),然后再使用另外两种模式来处理更具体的东西。 我不喜欢将grokparsefailure用作输入与我的模式不匹配的触发器。如果使用其他功能使其过载,则会丢失基本功能
还要注意,%{SPACE}将处理“\s*”并且通常更易于阅读。添加到@Alain答案中 您可以根据需要使用此grok,并在
actuallog
上使用kv
过滤器:
%{WORD:loggingid}\s*%{NUMBER:epoch}\s*%{TIMESTAMP_ISO8601:timestamp}\s*%{NUMBER:system}\s*-\s*-\s*-\s*-\s*%{WORD:env}\s*%{WORD:appid}\s*%{WORD:dc}\s*%{WORD:envid}\s*%{NOTSPACE:appversion}\s*%{NOTSPACE:msgid}\s*%{WORD:msgtype}\s*%{WORD:msgsubtype}\s*%{NOTSPACE}\s*%{NOTSPACE}\s*%{NOTSPACE}\s*%{NOTSPACE}\s*%{GREEDYDATA:actuallog}
谢谢阿兰。但我能把千伏滤波器只放在实际场中吗?如果是,如何?kv{}获取一个“source”值,您可以在其中指定包含数据的字段。在第四种类型的日志中,是否有任何方法可以将transid作为键?我在过滤器中包括了kv{source=>“actuallog”field_split=>“,=”},这为类型2的日志提供了正确的结果,但对日志4不起作用