我使用 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
答案1
这是一个棘手的问题。问题是,JSON 对象与纯文本字段混合在一起。我认为您有以下选项(请注意,您需要最新的 syslog-ng 版本才能使用 json 和 kv 解析器,我会选择 3.8 版本):
如果可以的话,配置 mongodb 登录纯 json,并使用 syslog-ng 的 json-parser 进行解析。 (不知道mongodb是否可以做到这一点。)
你可以建立模式数据库覆盖各个消息,但这可能需要很多时间
但最有可能的选择是使用 syslog-ng 解析器的组合。即,尝试以下操作:
- 用一个csv解析器将消息在第一个 { 字符处分成两列
- 使用键值解析器解析第一列(冒号是消息这部分中的分隔符)
- 使用 json 解析器解析消息的第二部分(由于某些消息有多个 json 部分,您可能需要在此处添加另一个 csv+json 组合)这些解析器将创建解析值的名称-值对,您可以根据需要使用模板或模板函数来输出它们(例如,使用 format-welf 模板函数)。
或者现在我想到了,如果您不需要 JSON 结构(仅需要平面名称+值),那么您可以尝试简单地使用重写规则从消息中删除 {} 字符,并使用键 -值解析器。
如果上述选项不起作用,您可以用 python 编写自定义解析器并在那里处理消息。
HTH。
如果你成功了,请告诉我。