2016-02-09 208 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}