定义
- db.setProfilingLevel(level, options)
- 5.0 版本中的更改。 - 对于 - mongod实例,该方法可启用、禁用或配置数据库分析器 。分析器捕获并记录正在运行的- mongod实例上的写入操作、游标和数据库命令性能的数据。如果分析器被禁用,该方法将配置如何将慢操作记录到诊断日志中。- 注意- 使用 - db.setProfilingLevel()对分析级别所做的更改不会保留。当服务器重新启动时,它会恢复为- 0(默认值),或者由- operationProfiling.mode设置或- --profile命令行选项设置的值。- 如果 数据库分析器级别为 - 1或- 2(具体而言,数据库分析器已启用),则 slowms 和 sampleRate 会影响分析器和- diagnostic log的行为。- 如果数据库分析器级别为 - 0(具体来说,数据库分析器已禁用),则 Slowms 和 SampleRate 仅影响诊断日志。- 使用 - mongos实例,该方法设置- slowms、- sampleRate和- filter配置设置,从而配置如何将操作写入诊断日志。您无法在- mongos实例上启用数据库分析器,因为- mongos没有分析器可以写入的任何集合。对于- mongos实例,- profile等级必须为- 0。- 您可以在 - mongod和- mongos实例上指定过滤器,以控制分析器记录哪些操作。当您为分析器指定- filter时,slowms 和 sampleRate 选项不用于分析和慢查询日志行。- db.setProfilingLevel()提供- profile命令的封装器。- 从 MongoDB 5.0 开始,使用 - profile命令或- db.setProfilingLevel()封装方法对数据库分析器- level、- slowms、- sampleRate或- filter进行的更改记录在- log file中。
兼容性
此方法可用于以下环境中托管的部署:
- MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务 
重要
M0 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。
- MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本 
- MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本 
语法
db.setProfilingLevel() 方法采用以下形式:
db.setProfilingLevel(<level>, <options>) 
参数
| Parameter | 类型 | 说明 | ||||||
|---|---|---|---|---|---|---|---|---|
| 整型 | 配置数据库分析器级别。以下分析器级别可用: 
 由于分析在 | |||||||
| 文档或整数 | 可选。 接受整数或选项文档。 如果将整数值而不是文档作为 
 | 
返回:
该方法返回一个包含先前设置值的文档。
{    "was" : 2,    "slowms" : 100,    "sampleRate" : 1,    "filter" : {       "$and" : [          {             "op" : {                "$eq" : "query"             }          },          {             "millis" : {                "$gt" : 20000             }          }       ]    },    "note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",    "ok" : 1 } 
{    "was" : 0,    "slowms" : 100,    "sampleRate" : 1,    "filter" : {       "$and" : [          {             "op" : {                "$eq" : "query"             }          },          {             "millis" : {                "$gte" : 2000             }          }       ]    },    "note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",    "ok" : 1,    "$clusterTime" : {       "clusterTime" : Timestamp(1572991238, 1),       "signature" : {          "hash" : BinData(0,"hg6GnlrVhV9MAhwWdeHmHQ4T4qU="),          "keyId" : Long("6755945537557495811")       }    },    "operationTime" : Timestamp(1572991238, 1) } 
{    "was" : 0,    "slowms" : 100,    "sampleRate" : 1,    "filter" : {       "$and" : [          {             "op" : {                "$eq" : "query"             }          },          {             "millis" : {                "$gte" : 2000             }          }       ]    },    "note" : "When a filter expression is set, slowms and sampleRate are not used for profiling and slow-query log lines.",    "ok" : 1,    "operationTime" : Timestamp(1572991499, 2),    "$clusterTime" : {       "clusterTime" : Timestamp(1572991499, 2),       "signature" : {          "hash" : BinData(0,"nhCquIxUw7thlrBudXe3PnsnvP0="),          "keyId" : Long("6755946491040235540")       }    } } 
其中:
- was是上一个级别设置。
- slowms是之前的 slowms 设置。
- sampleRate是之前的 sampleRate 设置。
- filter是之前的过滤器设置。
- note是解释- filter行为的字符串。只有当- filter也存在时,此字段才会出现在输出中。
注意
filter 和 note 字段仅在先前的级别设置中存在时才会出现在输出中。
要查看当前分析级别,请参阅 db.getProfilingStatus()。
行为
警告
分析会降低性能,并在系统日志中暴露未经加密的查询数据。在生产部署中配置和启用分析器之前,请仔细考虑对性能和安全的影响。
有关潜在性能下降的更多信息,请参阅分析器开销。
示例
启用分析器并设置慢操作阈值和采样率
以下示例集用于 mongod 实例:
- 将分析级别设置为 - 1,
- 慢速运行阈值 slowms 为 - 20毫秒,并且
- sampleRate 为 - 0.42。
db.setProfilingLevel(1, { slowms: 20, sampleRate: 0.42 }) 
该操作返回一个包含先前设置值的文档。
要查看当前分析级别,请参阅 db.getProfilingStatus()。
禁用性能分析器并设置慢操作阈值和采样率
下面的示例为 mongod 或 mongos 实例进行了设置:
- 将分析级别设置为 - 0,
- 慢速运行阈值 slowms 为 - 20毫秒,并且
- sampleRate 为 - 0.42。
db.setProfilingLevel(0, { slowms: 20, sampleRate: 0.42 }) 
该操作返回一个包含先前设置值的文档。
要查看当前分析级别,请参阅 db.getProfilingStatus()。
设置过滤器以确定要进行分析的操作
以下示例集用于 mongod 实例:
db.setProfilingLevel( 1, { filter: { op: "query", millis: { $gt: 2000 } } } ) 
该操作返回一个包含先前设置值的文档。
要查看当前分析级别,请参阅 db.getProfilingStatus()。
取消设置筛选器
要清除分析筛选器,请运行带有 filter: "unset" 选项的 db.setProfilingLevel()。
db.setProfilingLevel( 1, { filter: "unset" } ) 
该操作返回一个包含先前设置值的文档。
要查看当前分析级别,请参阅 db.getProfilingStatus()。