我的日志是这样的:
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获取键值对并删除其他不必要的字段(例如:loggingid,epoch等),然后将其置于弹性搜索中。
现在我几乎没有问题:
1) How to parse the "-" ?
2) Is my logic correct?
一个解决方法,我想到的是我可以检查我是否得到了grokparsefailure,我不会把它放在弹性搜索中,所以我可以把它放在它们之间。这有意义吗?
答案 0 :(得分:0)
正如你应该知道的那样,你的模式在第三行不起作用,因为你期待4次大肆宣传,而这不是你输入中的内容。
如果这六个值:
INFO INFO - - - -
与这些值的字段相同:
HB LOG - TH COUNTS -
然后将它们全部放入自己的字段中,无论字段是否包含“ - ”或类似“COUNTS”的内容。正如您所发现的,%{WORD}与连字符不匹配,因此您需要使用%{NOTSPACE}之类的内容。
如果第3行实际上是一个不同的格式,那么考虑在一个grok节中将所有常见的东西从前面(可能是“msgsubtype”)拉出来,然后再使用另一个具有两种模式的grok节来处理更具体的格式东西。
我不喜欢使用grokparsefailure作为输入与我的模式不匹配的触发器。如果您使用其他功能重载它,则会丢失基本功能。
另请注意,%{SPACE}将处理“\ s *”并且通常更容易阅读。
答案 1 :(得分:0)
添加@Alain答案。
您可以根据需要使用此grok,并使用kv
上的actuallog
过滤器:
%{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}