Json
使用 syslog-ng 解析 Mongodb 日誌
我的 Syslog-ng 收到了很多 Mongodb 日誌。下面是這樣解析和儲存的日誌範例:
2016-10-18 19:01:08 f:local1.p:info h:10.133.126.81 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:02.439+0330 I COMMAND [conn71796] command CLM.TroubleTicket command: find { find: "TroubleTicket", filter: { $and: [ { troubleTicket.serviceCode: "8118415922" } ] }, projection: { troubleTicket.referenceNumber: 1, troubleTicket.ticketGenerationDate: 1, troubleTicket.ticketCreatedDate: 1, troubleTicket.currentStatus: 1, troubleTicket.currentStatusReason: 1, troubleTicket.thirdPartyIncidentNumber: 1, troubleTicket.troubleTicketCatId: 1, troubleTicket.troubleTicketSubCatId: 1, troubleTicket.troubleTicketSubSubCatId: 1, troubleTicket.serviceCode: 1, troubleTicket.lastUpdateDate: 1, $sortKey: { $meta: "sortKey" } }, sort: { troubleTicket.ticketCreatedDate: -1 }, ntoreturn: 5, shardVersion: [ Timestamp 232000|1, ObjectId('578fb3a6e0f9dacf6705e34c') ] } planSummary: IXSCAN { troubleTicket.serviceCode: 1.0 }, IXSCAN { troubleTicket.serviceCode: 1.0 } cursorid:85032809863 keysExamined:97798 docsExamined:97798 hasSortStage:1 keyUpdates:0 writeConflicts:0 numYields:764 nreturned:5 reslen:2354 locks:{ Global: { acquireCount: { r: 1530 } }, Database: { acquireCount: { r: 765 } }, Collection: { acquireCount: { r: 765 } } } protocol:op_command 572ms 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.226+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.229+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.229+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "DOCSUPLOAD" } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.234+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.237+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.237+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "DOCSUPLOAD" } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.350+0330 I SHARDING [conn6447] request split points lookup for chunk CLM.ActionLevelDetails { : MinKey } -->> { : MaxKey } 2016-10-18 19:01:17 f:local1.p:info h:10.133.126.80 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:10.353+0330 W SHARDING [conn6447] possible low cardinality key detected in CLM.ActionLevelDetails - key is { actionLevelDetails.activityType: "CNFRMREG" } 2016-10-18 19:01:18 f:local1.p:info h:10.133.126.81 prog:sharmongo-log m:sharmongo-log 2016-10-18T19:01:16.762+0330 I ACCESS [conn6012] Successfully authenticated as principal dba_admin on admin
請注意,您可以在日誌中看到 Mongodb 日誌消息包含 JSON 格式。這些日誌的 syslog-ng 配置如下:
source s_all { udp(ip("0.0.0.0") port(514)); tcp(ip("0.0.0.0") port(514) keep-alive(no) max-connections(1000)); }; destination d_clm_mongodb { file("/storage/sensage/incoming/mtn/syslog-ng/clm_mongodb/clm_mongodb.log" template("$YEAR-$MONTH-$DAY $HOUR:$MIN:$SEC f:$FACILITY.p:$PRIORITY h:$HOST_FROM prog:$PROGRAM m:$MSG\n") template_escape(no) ); }; filter f_clm_mongodb { program("sharmongo-log"); }; log { source(s_all); filter(f_clm_mongodb); destination(d_clm_mongodb); flags(final); };
我需要將這些日誌解析為
CSV
格式(逗號分隔),這意味著事件 JSON 部分應該用逗號分隔。我搜尋了很多關於這個問題。我現在需要在 syslog-ng 中解析 JSON 日誌(Smaples)並以CSV
格式儲存的功能嗎?注意:mongodb 日誌格式如下連結: https ://github.com/rueckstiess/mongodb-log-spec
這是一個棘手的問題。恕我直言,問題是 JSON 對象與純文字欄位混合在一起。我認為您有以下選擇(請注意,您需要最新的 syslog-ng 版本才能使用 json 和 kv 解析器,我會選擇 3.8 版):
如果可以,將 mongodb 配置為登錄純 json,並使用 syslog-ng 的 json-parser 對其進行解析。(不知道mongodb能不能做到這一點。)
您可以建構一個模式數據庫來涵蓋各個消息,但這可能需要很多時間
但最可能的選擇是使用 syslog-ng 解析器的組合。即,嘗試以下操作:
- 使用csv-parser在第一個 { 字元處將消息拆分為兩列
- 使用鍵值解析器解析第一列(冒號是這部分消息的分隔符)
- 使用 json-parser 解析消息的第二部分(由於某些消息有多個 json 部分,您可能需要在此處添加另一個 csv+json 組合)這些解析器將創建解析值的名稱-值對,您可以使用模板或模板函式根據需要輸出它們(例如,使用 format-welf 模板函式)。
或者現在我想起來了,如果您不需要 JSON 結構(只有平面名稱+值),那麼您可以嘗試簡單地使用重寫規則從消息中刪除 {} 字元,並使用 key-值解析器。
如果上述選項不起作用,您可以在 python 中編寫自定義解析器並在那里處理消息。
HTH。
如果你成功了,請告訴我。