2016-02-09 118 views
0

我有我的日志形式如下:解析日志与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.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过滤器从actual_log中获取键值对,并删除其他不必要的字段(例如:日志记录,历元等),然后将其放入弹性搜索中。

现在我有几个问题:

1) How to parse the "-" ? 
2) Is my logic correct? 

一个解决办法,我想的是,我可以检查,如果我得到grokparsefailure,我不会把它放在弹性搜索这样我就可以在自身之间拖放。这有意义吗?

回答

0

正如你应该知道的那样,你的模式不适用于第三行,因为你期待4个超链接,这不是你的输入中发现的。

如果这六个值:

INFO INFO - - - - 

是相同的领域,因为这些值:

HB LOG - TH COUNTS - 

然后把他们都变成自己的领域,不管字段是否包含“ - ”或像“COUNTS”一样。正如您发现的,%{WORD}不匹配连字符,因此您需要使用类似%{NOTSPACE}的内容。

如果第3行的格式真的不同,那么可以考虑将所有常见的东西放在一个grok节中(也许最多包含“msgsubtype”),然后让另一个grok节有两个模式来处理更多具体的东西。

我不喜欢使用grokparsefailure作为任何东西,但输入与我的模式不匹配的触发器。如果用其他功能重载它,则会失去基本功能。

另请注意,%{空格}将处理“\ s *”,通常更易于阅读。

+0

感谢阿兰。但是,我可以只把kv过滤器放在真实环境中吗?如果是,如何? –

+0

kv {}采用“源”值,您可以在其中指定数据字段。 –

+0

在第四种日志中,是否有我可以将transid作为关键字?我包括 \t千伏{ \t \t源=> “actuallog” \t \t field_split => “=” \t} 在我的过滤器,这给正确的结果为2型的日志,但日志4不起作用 –

0

添加到@Alain答案。

您可以使用此神交您的需求和使用上actuallogkv过滤器:

%{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}