日志记录
Overview
在本指南中,您可以学习;了解如何在 Node.js驾驶员中配置记录器。驾驶员允许您日志按以下严重性级别分类的信息:
emergency
alert
critical
error
warn
notice
info
debug
trace
off
前面的列表按严重性级别降序排列。指定严重性级别还会记录具有更高严重性级别的所有消息。示例,将日志级别设置为 critical
也会导致严重性级别为 emergency
和 alert
的日志消息。
指定的严重性级别越低,驾驶员记录的信息就越多,这可能会影响应用程序的性能。
配置
您可以通过指定环境变量在 Node.js驾驶员中配置日志记录,而无需更改代码。您还可以通过在 MongoClient
构造函数中指定客户端选项,以编程方式配置日志记录。
注意
由于连接字符串通常在可能具有不同日志记录支持的不同应用部署之间共享,因此我们不建议使用连接字符串来配置日志记录。
环境变量
您可以通过在以下一个或多个环境变量中指定严重性级别,为驾驶员的不同组件配置日志记录:
MONGODB_LOG_ALL
:为任何未设置的组件默认默认严重性MONGODB_LOG_COMMAND
:记录发送到服务器的所有命令MONGODB_LOG_TOPOLOGY
:记录对集群拓扑结构的任何更改MONGODB_LOG_SERVER_SELECTION
:记录服务器选择进程MONGODB_LOG_CONNECTION
:记录所有连接池事件MONGODB_LOG_CLIENT
:记录所有客户端事件
如果未指定上述任何环境变量,驾驶员将使用 MONGODB_LOG_ALL
的值;如果未指定该值,则会隐式设立为 off
。
提示
由于向服务器发送命令的频率很高,因此命令级别的日志记录是对性能影响最大的日志记录选项。仅在调试应用程序必要时才指定此选项。
以下示例将除 MONGODB_LOG_COMMAND
之外的所有组件的日志级别设置为 debug
:
export MONGODB_LOG_ALL="debug" export MONGODB_LOG_COMMAND="off"
日志位置
您可以通过将 MONGODB_LOG_PATH
环境变量设置为 "stderr"
或 "stdout"
来指定驾驶员是记录到 stderr
还是 stdout
,如以下示例所示:
export MONGODB_LOG_PATH="stderr"
默认下,驾驶员会记录到 stderr
。
文档长度
驾驶员使用EJSON对记录的文档进行字符串化,默认默认下将字符串限制为 1000 个字符。您可以通过指定 MONGODB_LOG_MAX_DOCUMENT
环境变量来指定记录器的最大文档长度。将此变量设置为 0
以不执行截断。
以下示例将最大文档长度设置为 500 个字符:
export MONGODB_LOG_MAX_DOCUMENT_LENGTH=500
客户端选项
您可以通过在 MongoClient
构造函数中指定客户端选项,以编程方式配置日志记录。由于客户端选项优先于环境变量,因此仅当您不再希望驾驶员响应环境变量时才在客户端中指定客户端选项。
提示
如果您的应用程序依赖于 stdout
或 stderr
的格式,我们建议您使用客户端选项配置日志记录,以避免与应用程序用户的环境变量发生冲突。
您可以通过指定以下一个或多个客户端选项来指定为哪个组件配置日志记录:
default
:为任何未设置的组件默认默认严重性command
:记录发送到服务器的所有命令topology
:记录对集群拓扑结构的任何更改serverSelection
:记录服务器选择进程connection
:记录所有连接池事件client
:记录所有客户端事件
要指定组件的日志级别,请将 mongodbLogComponentSeverities
选项设立为包含该组件和所需严重性级别的对象。以下示例将除 command
之外的所有组件的日志级别设置为 debug
:
const client = new MongoClient("<connection string>", { mongodbLogComponentSeverities: { default: "debug", command: "off" } });
日志位置
您可以通过将 mongodbLogPath
选项设置为 "stderr"
或 "stdout"
来指定驾驶员是记录到 stderr
还是 stdout
,如以下示例所示:
const mongodbLogComponentSeverities = { default: "debug" }; const mongodbLogPath = "stdout"; const client = new MongoClient("<connection string>", { mongodbLogComponentSeverities, mongodbLogPath } );
默认下,驾驶员会记录到 stderr
。
您还可以指定自定义日志目标。以下示例创建自定义日志目标:
import fs from 'node:fs/promises'; import util from 'node:util'; const mongodbLogPath = { file: await fs.open(`./server-${+new Date()}.logs`, 'w'), async write(log) { try { await this.file?.appendFile(util.inspect(log) + '\n'); } catch (fileError) { console.log('cannot log anymore', fileError); this.file = null; } } } const client = new MongoClient("<connection string>", { mongodbLogPath });
如果函数在写入操作中抛出错误,则抛出的错误会结束记录器。因此,我们建议您通过将写入函数设置为无操作处理错误,而不是抛出错误,如前面的示例所示。
注意
如果没有适当的日志轮换系统,日志记录可能会耗尽磁盘空间。我们建议您将自定义写入函数连接到常用的日志记录库。
文档长度
驾驶员使用EJSON对记录的文档进行字符串化,默认默认下将字符串限制为 1000 个字符。您可以通过指定 mongodbLogMaxDocumentLength
选项来指定记录器的最大文档长度。将此选项设置为 0
以不执行截断。
以下示例将最大文档长度设置为 500 个字符:
const mongodbLogComponentSeverities = { default: "debug" }; const mongodbLogLength = 500; const client = new MongoClient("<connection string>", { mongodbLogComponentSeverities, mongodbLogLength });
更多信息
有关使用 Node.js驾驶员监控的更多信息,请参阅以下监控指南:
API 文档
要学习;了解有关本指南中讨论的任何选项或类型的更多信息,请参阅以下API文档: