Json

使用 syslog-ng 解析 Mongodb 日誌

  • October 21, 2016

我的 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。

如果你成功了,請告訴我。

引用自:https://unix.stackexchange.com/questions/317399