使用logstash

时间:2016-02-09 07:32:57

标签: 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获取键值对并删除其他不必要的字段(例如:loggingid,epoch等),然后将其置于弹性搜索中。

现在我几乎没有问题:

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

一个解决方法,我想到的是我可以检查我是否得到了grokparsefailure,我不会把它放在弹性搜索中,所以我可以把它放在它们之间。这有意义吗?

2 个答案:

答案 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}