使用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不起作用