概述
作为正常操作的一部分,MongoDB维护事件的运行日志,包括传入连接、命令运行和遇到的问题等条目。通常,日志消息对于诊断问题、监视部署和调优性能非常有用。
日志格式
从MongoDB 4.4开始,mongod / mongos实例以SON格式输出所有日志消息。日志条目被写成一系列键值对,其中每个键表示一个日志消息字段类型,比如“severity”,每个对应的值记录该字段类型的相关日志信息,比如“informational”。以前,日志条目以明文形式输出。
下面是MongoDB日志文件中JSON格式的日志信息示例:
{"t":{"$date":"2020-05-01T15:16:17.180+00:00"},"s":"I", "c":"NETWORK", "id":12345, "ctx":"listener", "msg":"Listening on","attr":{"address":"127.0.0.1"}}
为了可读性,JSON日志条目可以被漂亮地打印出来。下面是精心打印的相同日志条目:
{
"t": {
"$date": "2020-05-01T15:16:17.180+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 12345,
"ctx": "listener",
"msg": "Listening on",
"attr": {
"address": "127.0.0.1"
}
}
注释:
- s表示severity键对应的值为I,表示“Informational”;
- c表示component键对应的值为NETWORK,表示“NETWORK”组件负责此特定的消息。
具有键值对的结构化日志记录允许自动化工具或日志摄取服务进行高效的解析,并使程序化的日志消息搜索和分析更容易执行。在解析结构化日志消息一节中可以找到分析结构化日志消息的示例。
JSON日志格式输出
在MongoDB 4.4中,所有的日志输出现在都是JSON格式。这包括发送到文件、syslog和标准输出(标准输出)日志目的地的日志输出,以及getLog
命令的输出。
每个日志条目都输出为一个自包含的JSON对象,遵循Relaxed Extended JSON v2.0
规范,并具有以下布局和字段顺序:
{
"t": <Datetime>, // timestamp
"s": <String>, // severity
"c": <String>, // component
"ctx": <String>, // context
"id": <Integer>, // unique identifier
"msg": <String>, // message body
"attr": <Object> // additional attributes (optional)
"tags": <Array of strings> // tags (optional)
"truncated": <Object> // truncation info (if truncated)
"size": <Integer> // original size of entry (if truncated)
}
注释:
- Timestamp:日志信息的时间戳,ISO-8601格式。
- Severity:表示日志消息的严重性代码的字符串。
- Component:表示日志消息的完整组件字符串。
- Context:表示发出日志语句的线程名的字符串。
- id:表示日志语句的唯一标识符的整数。
- Message:表示从服务器或驱动程序传递的原始日志输出消息的字符串。根据JSON规范,该消息将根据需要进行转义。
- Attributes:(可选)包含一个或多个键值对的对象,用于提供的任何附加属性。如果日志消息不包含任何其他属性,则忽略该对象。属性值可以通过它们的键名在消息体中引用,这取决于消息。与消息一样,根据JSON规范,属性也会在需要时被转义。
- Tags:(可选)表示适用于日志语句的任何标签的字符串数组,例如:["startupWarnings"]。
- Truncated:(如果被截断)包含有关日志消息截断的信息(如果适用)的对象。只有当日志条目包含至少一个被截断的属性时,该对象才会出现。
- Size:(如果被截断)表示日志项被截断时的原始大小的整数。只有当日志条目包含至少一个被截断的属性时,该字段才会出现。
Escaping
根据Relaxed Extended JSON v2.0规范,必要时消息和属性字段将转义控制字符:
需要转义的字符 | 转义字符 |
双引号(") | \" |
反斜杠(\) | \\ |
退格键(0x08) | \b |
换页(0x0C) | \f |
换行符(0x0A) | \n |
回车符(0x0D) | \r |
制表符(0x09) | \t |
上面没有列出的控制字符被转义为\uXXXX,其中“XXXX”是十六进制的unicode码位。使用无效UTF-8编码的字节将被\ufffd表示的unicode替换字符替换。
Truncation
任何超过maxLogSizeKB(默认值:10kb)定义的最大大小的属性都会被截断。被截断的属性会忽略超出配置限制的日志数据,但保留条目的JSON格式,以确保条目保持可解析性。
下面是一个带有截断属性的日志条目的例子:
{"t":{"$date":"2020-05-19T18:12:05.702+00:00"},"s":"I", "c":"SHARDING", "id":22104, "ctx":"conn33",
"msg":"Received splitChunk request","attr":{"request":{"splitChunk":"config.system.sessions",
"from":"production-shard1","keyPattern":{"_id":1},"epoch":{"$oid":"5ec42172996456771753a59e"},
"shardVersion":[{"$timestamp":{"t":1,"i":0}},{"$oid":"5ec42172996456771753a59e"}],"min":{"_id":{"$minKey":1}},
"max":{"_id":{"$maxKey":1}},"splitKeys":[{"_id":{"id":{"$uuid":"00400000-0000-0000-0000-000000000000"}}},
{"_id":{"id":{"$uuid":"00800000-0000-0000-0000-000000000000"}}},
...
{"_id":{"id":{"$uuid":"26c00000-0000-0000-0000-000000000000"}}},{"_id":{}}]}},
"truncated":{"request":{"splitKeys":{"155":{"_id":{"id":{"type":"binData","size":21}}}}}},
"size":{"request":46328}}
在这种情况下,请求属性已经被截断,它的子字段_id的特定实例触发了截断(即导致属性溢出maxLogSizeKB)被打印出来,没有数据作为{"_id":{}}。然后省略请求属性的其余部分。
包含一个或多个截断属性的日志项包含一个截断的对象,该对象为日志项中的每个截断属性提供以下信息:
- 被截断的属性。
- 触发截断的属性的特定子对象(如果适用的话)。
- 被截断字段的数据类型。
- 截断字段的大小。
带有截断属性的日志条目还可能在条目末尾包含一个额外的size字段,该字段表示截断之前属性的原始大小,在本例中为46328或约46KB。这个最终的size字段只有在它与被截断的对象的size字段不同时才会显示出来,也就是说,如果属性的对象总大小与被截断的子对象的大小不同,就像上面的例子一样。
Padding
当输出到文件或syslog日志目的地时,在严重性、上下文和id字段之后添加填充,以增加使用固定宽度字体查看时的可读性。
下面的MongoDB日志文件摘录演示了这个填充:
{"t":{"$date":"2020-05-18T20:18:12.724+00:00"},"s":"I", "c":"CONTROL", "id":23285, "ctx":"main","msg":"Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'"}
{"t":{"$date":"2020-05-18T20:18:12.734+00:00"},"s":"W", "c":"ASIO", "id":22601, "ctx":"main","msg":"No TransportLayer configured during NetworkInterface startup"}
{"t":{"$date":"2020-05-18T20:18:12.734+00:00"},"s":"I", "c":"NETWORK", "id":4648601, "ctx":"main","msg":"Implicit TCP FastOpen unavailable. If TCP FastOpen is required, set tcpFastOpenServer, tcpFastOpenClient, and tcpFastOpenQueueSize."}
{"t":{"$date":"2020-05-18T20:18:12.814+00:00"},"s":"I", "c":"STORAGE", "id":4615611, "ctx":"initandlisten","msg":"MongoDB starting","attr":{"pid":10111,"port":27001,"dbPath":"/var/lib/mongo","architecture":"64-bit","host":"centos8"}}
{"t":{"$date":"2020-05-18T20:18:12.814+00:00"},"s":"I", "c":"CONTROL", "id":23403, "ctx":"initandlisten","msg":"Build Info","attr":{"buildInfo":{"version":"4.4.0","gitVersion":"328c35e4b883540675fb4b626c53a08f74e43cf0","openSSLVersion":"OpenSSL 1.1.1c FIPS 28 May 2019","modules":[],"allocator":"tcmalloc","environment":{"distmod":"rhel80","distarch":"x86_64","target_arch":"x86_64"}}}}
{"t":{"$date":"2020-05-18T20:18:12.814+00:00"},"s":"I", "c":"CONTROL", "id":51765, "ctx":"initandlisten","msg":"Operating System","attr":{"os":{"name":"CentOS Linux release 8.0.1905 (Core) ","version":"Kernel 4.18.0-80.11.2.el8_0.x86_64"}}}
Pretty Printing
在使用MongoDB结构化日志记录时,jq command-line utility是一个非常有用的第三方工具,它允许轻松地打印日志条目,并支持强大的基于密钥的匹配和过滤。
jq是一个开源的JSON解析器,可用于Linux、Windows和macOS。
您可以使用jq对日志项进行如下的格式美化打印:
- 格式美化打印整个日志文件:
cat mongod.log | jq
- 格式美化打印最近的日志条目:
cat mongod.log | tail -1 | jq
Configuring Log Message Destinations
MongoDB的日志信息可以输出为file、syslog或stdout(标准输出)。
要配置日志输出目的地,可以在配置文件或命令行中使用以下设置之一:
- 配置文件:
- systemLog.destination参数配置为file或syslog。
- 命令行:
- mongod使用--logpath参数配置为file。
- mongod使用--syslog参数配置为syslog
- mongos使用--logpath参数配置为file。
- mongos使用--syslog参数配置为syslog。
如果不指定文件或syslog会将所有日志输出发送到stdout。
有关日志设置和选项的完整列表,请参见:
- Configuration file:
- Command-line:
- Log options list for mongod
- Log options list for mongos
日志字段类型
Timestamp
Timestamp字段类型指示所记录事件发生的准确日期和时间。
{
"t": {
"$date": "2020-05-01T15:16:17.180+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 12345,
"ctx": "listener",
"msg": "Listening on",
"attr": {
"address": "127.0.0.1"
}
}
当记录到file或syslog时,时间戳的默认格式是iso8601-local。要修改时间戳格式,运行时请使用--timeStampFormat选项或通过配置文件修改systemLog.timeStampFormat设置。
注意:
- 从MongoDB 4.4开始,不再支持ctime时间戳格式。
如果将日志记录为syslog,则syslog守护进程在记录消息时生成时间戳,而不是在MongoDB发出消息时生成时间戳。这可能会导致日志条目的时间戳具有误导性,特别是在系统负载较重的情况下。
Severity
severity字段类型表示与日志事件关联的严重性级别。
{
"t": {
"$date": "2020-05-01T15:16:17.180+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 12345,
"ctx": "listener",
"msg": "Listening on",
"attr": {
"address": "127.0.0.1"
}
}
Severity由“Fatal”(最严重)至“Debug”(最不严重):
等级 | 描述 |
F | Fatal |
E | Error |
W | Warning |
I | Informational,详细级别为0 |
D1-D5 |
调试模式,级别>0 从4.2版开始,MongoDB指示了特定的调试详细级别。例如,详细级别为2时,MongoDB表示D2。 在以前的版本中,MongoDB日志消息为所有调试详细级别指定D。 |
您可以指定各种组件的详细级别,以确定MongoDB输出的信息和调试消息的数量。高于这些级别的严重性类别总是显示出来详细级别。
Components
组件字段类型表示日志事件所属的类别,例如NETWORK或COMMAND。
{
"t": {
"$date": "2020-05-01T15:16:17.180+00:00"
},
"s": "I",
"c": "NETWORK",
"id": 12345,
"ctx": "listener",
"msg": "Listening on",
"attr": {
"address": "127.0.0.1"
}
}
每个组件都可以通过过滤器进行单独配置。可选组件如下:
- ACCESS
与访问控制(如身份验证)相关的消息。要指定ACCESS组件的日志级别,请使用systemlog.component.accesscontrol.verbose设置。 - COMMAND
与数据库命令相关的消息,如count。要指定COMMAND组件的日志级别,请使用systemlog.component.COMMAND.verbose设置。 - CONTROL
与控制活动相关的消息,如初始化。要指定CONTROL组件的日志级别,请使用systemlog.component.CONTROL.verbose设置。 - ELECTION
与副本集选举相关的消息,要指定ELECTION组件的日志级别,请设置systemlog.component.replication.ELECTION.verbose参数。
REPL是ELECTION的父组件。如果systemlog .component.replication. ELECTION . verbose未设置,MongoDB为ELECTION组件使用REPL verbose级别。 - FTDC
MongoDB 3.2新增的功能。
与诊断数据收集机制相关的消息,如服务器统计信息和状态消息。要指定FTDC组件的日志级别,请使用systemlog.component.FTDC.verbose设置。 - GEO
与地理空间形状解析相关的消息,例如验证GeoJSON形状。要指定GEO组件的日志级别,请设置systemlog.component.GEO.verbose参数。 - INDEX
与索引操作(如创建索引)相关的消息。要指定INDEX组件的日志级别,请设置systemlog.component.INDEX.verbose参数。 - INITSYNC
与初始同步操作相关的消息。要指定INITSYNC组件的日志级别,需要设置systemlog.component.replication.initialsync.verbose参数。
REPL是INITSYNC的父组件。如果systemLog.component.replication.initialSync.verbosity是未设置的,MongoDB为INITSYNC组件使用REPL详细级别。 - JOURNAL
与存储日志活动相关的消息。要为JOURNAL组件指定日志级别,请使用systemlog.component.storage.JOURNAL.verbose设置。
STORAGE是JOURNAL的父组件。如果systemlog.component.STORAGE.JOURNAL.verbose未设置,MongoDB为JOURNAL组件使用STORAGE详细级别。 - NETWORK
与网络活动(如接受连接)相关的消息。要指定NETWORK组件的日志级别,请设置systemlog.component.NETWORK.verbose参数。 - QUERY
与查询相关的消息,包括查询计划器活动。要指定QUERY组件的日志级别,请设置systemlog.component.QUERY.verbose参数。 - RECOVERY
与存储恢复活动相关的消息。要为RECOVERY组件指定日志级别,请使用systemlog.component.storage.RECOVERY.verbose设置。
STORAGE是RECOVERY的父组件。如果systemLog.component.storage.recovery.verbosity未设置,MongoDB为RECOVERY组件使用STORAGE详细级别。 - REPL
与复制集相关的消息,例如初始同步、心跳、稳定状态复制和回滚。设置systemlog.component.replication.verbose参数,指定REPL组件的日志级别。
REPL是ELECTION、INITSYNC、REPL_HB和ROLLBACK组件的父组件。 - REPL_HB
与复制集心跳相关的消息。要指定REPL_HB组件的日志级别,请设置systemLog.component.replication.heartbeats.verbosity参数。
REPL是REPL_HB的父组件。如果systemLog.component.replication.heartbeats.verbosity未设置,MongoDB为REPL_HB组件使用REPL详细级别。 - ROLLBACK
与回滚操作相关的消息。要指定ROLLBACK组件的日志级别,请设置systemlog.component.replication.ROLLBACK.erbose参数。
REPL是ROLLBACK的父组件。如果systemlog.component.replication.ROLLBACK.verbose未设置,MongoDB为ROLLBACK组件使用REPL详细级别。 - SHARDING
与分片活动相关的消息,比如mongos的启动。要指定SHARDING组件的日志级别,请使用systemlog.component.SHARDING.verbose设置。 - STORAGE
与存储活动相关的消息,例如fsync命令中涉及的进程。要指定STORAGE组件的日志级别,请使用systemlog.component.STORAGE.verbose设置。
STORAGE是JOURNAL和RECOVERY的父组件。 - TXN
MongoDB 4.0.2新版功能。
与多文档事务相关的消息。要指定TXN组件的日志级别,请使用systemlog.component.transaction.verbose设置。 - WRITE
与写操作相关的消息,如更新命令。要指定WRITE组件的日志级别,请使用systemlog.component.WRITE.verbose设置。 - -
与命名组件不关联的消息。systemLog.verbosity是未命名组件中默认指定的日志级别。systemLog.verbosity设置是命名组件和未命名组件的默认设置。 - Client Data
MongoDB驱动程序和客户端应用程序(包括mongosh)有能力在连接到服务器时发送识别信息。连接建立后,客户端不再发送标识信息,除非连接被删除并重新建立。
该标识信息包含在日志条目的属性字段中,所包含的确切信息因客户而异。
下面是一个示例日志消息,其中包含从mongosh连接传输的客户机数据文档。客户端数据包含在文档对象的属性字段中:{"t":{"$date":"2020-05-20T16:21:31.561+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn202","msg":"client metadata","attr":{"remote":"127.0.0.1:37106","client":"conn202","doc":{"application":{"name":"MongoDB Shell"},"driver":{"name":"MongoDB Internal Client","version":"4.4.0"},"os":{"type":"Linux","name":"CentOS Linux release 8.0.1905 (Core) ","architecture":"x86_64","version":"Kernel 4.18.0-80.11.2.el8_0.x86_64"}}}}
当复制集的次要成员初始化到主节点的连接时,它们会发送类似的数据。包含此发起连接的示例日志消息可能如下所示。客户端数据包含在文档对象的属性字段中:
{"t":{"$date":"2020-05-20T16:33:40.595+00:00"},"s":"I", "c":"NETWORK", "id":51800, "ctx":"conn214","msg":"client metadata","attr":{"remote":"127.0.0.1:37176","client":"conn214","doc":{"driver":{"name":"NetworkInterfaceTL","version":"4.4.0"},"os":{"type":"Linux","name":"CentOS Linux release 8.0.1905 (Core) ","architecture":"x86_64","version":"Kernel 4.18.0-80.11.2.el8_0.x86_64"}}}}
日志详细级别
未完成,待更新!!!😀
参考官网文档:Log Messages