我认为这个问题将一些相关主题混为一谈,原因可以理解,我们将在下面看到。
第一对概念是分析器和慢查询日志记录。 database profiler 是一个有上限的集合,它收集有关 CRUD 操作(除其他外)的运行时信息。可以直接在日志文件中单独捕获有关 CRUD 操作的详细信息。您可以使用单个 db.setProfilingLevel() method 来调整这两者。
现在,上述日志文件与mongod 进程用于其他操作需求的diagnostic log file 相同。因此,单个文件具有双重职责,因为它还将捕获有关许多其他组件的详细信息,例如网络、复制和访问控制。为了使问题更加复杂,可以配置和记录的components 之一确实是the QUERY one。为components 调整verbosity 是通过db.setLogLevel() method 完成的。系统默认为verbosity level of 0 for all components, which includes "Informational" (I) details。
现在“慢查询”日志行是由“信息”级别的QUERY 组件生成的消息类型之一。这一事实的结果是,您可以增加通过以下任一方式记录的慢查询条目的数量:
- 通过
db.setProfilingLevel() 方法降低slowms 阈值
- 通过
db.setLogLevel() 方法为QUERY 组件增加verbosity。
最后回到开头,慢查询记录和分析也与slowms(和其他相关设置)的使用重叠。具体来说,如果您将(分析)level 设置为1,那么slowms 现在将用于控制进入日志文件的条目以及分析器捕获的条目。 0 或2 的设置使分析忽略slowms(分别在分析器中不捕获任何内容或捕获所有内容)。
因此,您引用的文档部分,包括前面的句子,是试图将所有这些联系在一起的部分(当涉及到PRIMARY 上的行为时):
当logLevel 设置为0 时,MongoDB 以slowOpSampleRate 确定的速率将慢操作记录到诊断日志中。在较高的logLevel 设置下,所有操作都会出现在诊断日志中,无论其延迟如何
注意到:
- 这里的“慢操作”定义为超过
slowms设置的操作
-
这里的
logLevel 指的是db.setLogLevel() 的verbosity 设置,而不是db.setProfilingLevel() 的level 参数。
我找不到关于为什么 db.setLogLevel() 方法的组件字符串是 shown in lowercase 但在记录时它们是 appear to be uppercase 的详细信息。
回到带有这个附加上下文的原始问题,如果我们稍微收紧措辞,所描述的行为与记录的行为是一致的。我假设关于“分析慢查询" 只是关于在日志文件中捕获慢查询。如果是这样,那么:
使用分析级别 1 和详细级别 0 时不会记录任何内容
如果执行的所有查询也低于slowms 阈值(默认为100ms),这是正确的。
使用分析级别 1 和详细级别 1,所有查询都会被记录为慢,即使 durationMillis 低于 slowms
不清楚详细级别 1 和更高级别是否会自动将所有查询记录为慢。
根据前面引用的文档或Logging Slow Operations section here,这也是正确的,它简洁地指出“如果客户端操作(例如查询)的持续时间超过慢速操作阈值或日志详细级别为1 或更高,则会出现在日志中。"