在 mongodb 中记录所有查询-ag捕鱼王app官网

在 mongodb 中记录所有查询

作者:迹忆客 最近更新:2023/05/07 浏览次数:

在本文中,您将了解如何在 mongodb 中记录查询。 此外,还详细解释了用于在 mongodb 中记录查询的运算符。


mongodb 中的 getlog 命令

管理员命令 getlog 检索最近记录的 1024 个 mongod 事件。 getlog 命令不会从 mongod 日志文件中检索日志数据; 相反,它从记录的 mongod 事件的 ram 缓存中获取信息。

使用 db.admincommand() 函数执行 getlog。 从 mongodb 4.4 开始,getlog 以转义的 relaxed extended json v2.0 格式提供日志数据。 日志数据以前以纯文本形式提供。

getlog 命令的语法如下:

db.admincommand( { getlog:  } )

getlog 的可能值为:

值 | 描述 -- | --

  • | 返回 getlog 命令的可用值列表。 global | 返回所有日志条目的组合输出。 startupwarnings | 从 mongodb 的日志中返回日志条目,其中可能包含当前进程启动时的错误或警告。 如果 mongod 在没有迹象的情况下启动,则此过滤器可能会返回一个空数组。

如果提供 * ,该命令将返回包含其他有效值名称的文档。 否则,该命令会生成包含以下字段的文档:

  1. 包含日志事件数量的 totallineswritten 字段;
  2. 包含日志事件数组的日志字段;
  3. 提供来自 db.admincommand() 的状态和时间戳信息的响应文档。

mongodb 中 getlog 命令的行截断行为

从 mongodb 4.2 开始,getlog 会截断任何超过 1024 个字符的事件。 在以前的版本中,它会在 512 个字符后截断。

mongodb 中 getlog 命令的字符规避行为

从 mongodb 4.4 开始,getlog 以转义的 relaxed extended json v2.0 格式提供日志数据,利用下面列出的转义序列将日志输出转换为有效的 json:

字符表示 转义序列
反斜杠 () \
引号 (") "
换页 (0x0c) \f
退格键 (0x08) \b
回车 (0x0d) \r
水平制表符 (0x09) \t
换行符 (0x0a) \n

上面未提及的控制字符使用 uxxxx 进行转义,其中 xxxx 是 unicode 代码点的十六进制代码点。 utf-8 编码不正确的字节将替换为 ufffd unicode 替换字符。


mongodb 中记录查询的详细级别

您可以更改日志记录的详细级别以增加或减少 mongodb 生成的日志消息的数量。 可以为所有组件一起修改详细程度,也可以为单独标识的组件修改详细程度。

只有信息和调试严重性类别中的日志条目受详细程度影响。 在这些级别之上,将始终显示严重性类别。

将详细程度设置设置为高值以在调试或开发期间进行大量日志记录,或将详细程度设置为低值以限制已验证的生产部署上的日志写入。

检查 mongodb 中的当前日志详细级别

使用 db.getlogcomponents() 函数查看当前的详细级别:

db.getlogcomponents()

您的输出可能类似于以下内容:

第一个条目 verbosity 是所有组件的全局详细级别。 随后命名的组件(例如 accesscontrol)指示该组件的特定详细级别,如果已设置则覆盖全局详细级别。

值 -1 表示如果组件不具有全局详细级别之一(与命令一样),则该组件将继承父级的详细级别。

在 mongodb 中配置日志详细级别

systemlog.verbosity 和 systemlog.component.name>.verbosity 设置 logcomponentverbosity 参数,并且 db.setloglevel() 函数都可用于更改详细程度。

使用 systemlog verbosity 设置来控制级别

使用 systemlog.verbosity 参数指定所有组件的默认日志级别。 使用 systemlog.component.name>.verbosity 设置来控制某些组件的级别。

例如,以下配置将 systemlog.verbosity 设置为 1,将 systemlog.component.query.verbosity 设置为 2,将 systemlog.component.storage.verbosity 设置为 2,并将 systemlog.component.storage.journal.verbosity 设置为 1:

systemlog:
   verbosity: 1
   component:
      query:
         verbosity: 2
      storage:
         verbosity: 2
         journal:
            verbosity: 1

对于您的 mongod 或 mongos 实例,请在配置文件或命令行中指定这些设置。

配置中未明确给出的所有组件的详细级别为 -1。 这表明如果他们具有全局详细级别之一,则他们将采用其父级的详细级别。

更改 logcomponentverbosity 参数

传递包含详细设置的文档以更改 logcomponentverbosity 选项。

例如,以下命令将默认详细级别更改为 2,将查询更改为 3,将存储更改为 4,并将 storage.journal 更改为 1。

db.admincommand( {
   setparameter: 1,
   logcomponentverbosity: {
      verbosity: 2,
      query: {
         verbosity: 3
      },
      storage: {
         verbosity: 4,
         journal: {
            verbosity: 1
         }
      }
   }
} )

您可以从 mongosh 设置这些值。

使用 db.setloglevel() 更改 mongodb 中的日志级别

要更改单个组件的日志级别,请使用 db.setloglevel() 函数。 您可以为组件定义 0 到 5 的详细级别,或指定 -1 以继承父组件的详细级别。

例如,将 systemlog.component.query.verbosity 设置为其父详细程度(即默认详细程度)如下:

db.setloglevel(-1, "query")

您可以从 mongosh 设置此值。


在 mongodb 中记录缓慢的操作

如果客户端操作(例如查询)花费的时间超过慢速操作阈值,或者日志详细级别设置为 1 或更高,则会记录这些操作。

对于读/写操作,从 mongodb 4.2 开始,分析器条目和诊断日志消息(即 mongod/mongos 日志消息)包括:

  1. queryhash,一个可以检测具有相同查询形式的缓慢搜索的函数;
  2. plancachekey 提供有关慢速查询的查询计划缓存的额外信息。

从 mongodb 5.0 开始,慢速操作日志消息现在包含一个指定客户端 ip 地址的远程列。

给定的示例输出包括有关缓慢聚合操作的信息:

{"t":{"$date":"2020-05-20t20:10:08.731 00:00"},"s":"i",  "c":"command",  "id":51803,   "ctx":"conn281","msg":"slow query","attr":{"type":"command","ns":"stocks.trades","appname":"mongodb shell","command":{"aggregate":"trades","pipeline":[{"$project":{"ticker":1.0,"price":2.0,"pricegte110":{"$gte":["$price",111.0]},"_id":0.0}},{"$sort":{"price":-1.0}}],"allowdiskuse":true,"cursor":{},"lsid":{"id":{"$uuid":"fa658f9e-9cd6-42d4-b1c8-c9160fabf2a2"}},"$clustertime":{"clustertime":{"$timestamp":{"t":1590005405,"i":1}},"signature":{"hash":{"$binary":{"base64":"aaaaaaaaaaaaaaaaaaaaaaaaaaa=","subtype":"0"}},"keyid":0}},"$db":"test"},"plansummary":"collscan","cursorid":1912190691485054730,"keysexamined":0,"docsexamined":1000001,"hassortstage":true,"useddisk":true,"numyields":1002,"nreturned":101,"reslen":17738,"locks":{"replicationstatetransition":{"acquirecount":{"w":1119}},"global":{"acquirecount":{"r":1119}},"database":{"acquirecount":{"r":1119}},"collection":{"acquirecount":{"r":1119}},"mutex":{"acquirecount":{"r":117}}},"storage":{"data":{"bytesread":232899899,"timereadingmicros":186017},"timewaitingmicros":{"cache":849}},"remote": "192.168.14.15:37666","protocol":"op_msg","durationmillis":22427}}

在 remoteopwaitmillis 字段中获取分片的等待时间

从 mongodb 5.0 开始,您可以使用 remoteopwaitmillis 日志字段获取分片结果的等待时间(以毫秒为单位)。

仅为 remoteopwaitmillis 报告以下值:

  1. 如果操作缓慢,则启用日志记录。
  2. 在合并结果的分片或 mongos 上

比较日志中的durationmillis和remoteopwaitmillis时间列,看看是合并操作还是分片问题导致查询慢。 durationmillis 是查询完成所花费的全部时间。

具体来说,

  1. 如果 durationmillis 超过 remoteopwaitmillis,则大部分时间都花在等待分片响应上。 例如,18 的 durationmillis 和 15 的 remoteopwaitmillis 是可接受的值。
  2. 如果 durationmillis 明显大于 remoteopwaitmillis,则大部分时间都花在了合并上。 例如,durationmillis 为 150,remoteopwaitmillis 为 15。

在 mongosh 中过滤日志查询的结果

可以过滤 getlog 的输出以使结果更易于阅读或匹配特定条件。

以下命令仅打印日志字段(其中包含所有当前日志事件的数组),同时从每个日志消息中删除转义字符:

db.admincommand( { getlog:'global'} ).log.foreach(x => {print(x)})

在此操作中,getlog 的输出以与 mongodb 日志文件相同的格式呈现。

注意:getlog 仅显示最后 1024 个记录的 mongod 事件,并不打算替换 mongodb 日志文件。


使用 jq 过滤 mongosh 外部日志查询的结果

第三方 jq 命令行程序在处理 mongodb 结构化日志记录时得心应手。 它支持快速漂亮地打印日志条目和健壮的基于键的匹配和过滤。

jq 是适用于 linux、windows 和 macos 的免费开源 json 解析器。

您必须使用 mongosh 的 -eval 选项才能将 jq 与 getlog 输出一起使用。 以下操作使用 jq 来过滤 repl 组件,以便仅显示与复制相关的日志消息:

mongosh --quiet --eval "db.admincommand( { getlog:'global'} ).log.foreach(x => {print(x)})" | jq -c '. | select(.c=="repl")'

小心地为 mongosh 提供它需要的任何特定于连接的参数,例如 -host 或 -port。

mongosh --quiet --eval "db.admincommand( { getlog:'global'} ).log.foreach(x => {print(x)})" | jq -r ".msg" | sort | uniq -c | sort -rn | head -10

检索可用的日志过滤器

以下操作从 mongosh 运行,返回可用的日志过滤器以传递给 getlog:

db.admincommand( { getlog: "" } )

该操作返回以下文档:

{ "names" : [ "global", "startupwarnings" ], "ok" : 1 }

从日志中检索最近的事件

以下命令从 mongosh 运行,获取 mongod 的最新全局事件:

db.admincommand( { getlog : "global" } )

该操作生成如下所示的文档:

mongodb log queries - result 1

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 mongodb shell 中列出所有数据库

发布时间:2023/05/11 浏览次数:180 分类:mongodb

交互式 mongo shell 提供了多个用于获取数据的选项。 本文介绍了在 mongo shell 中列出数据库的几种不同方法。

mongodb 中检查字段包含的字符串

发布时间:2023/05/11 浏览次数:1024 分类:mongodb

这篇文章解决了如何在 mongodb 中使用正则表达式来确定字段是否包含字符串。在 mongodb 中使用正则表达式 正则表达式 (regex) 是定义搜索模式的文本字符串。

在 mongodb 中 upsert 更新插入

发布时间:2023/05/11 浏览次数:214 分类:mongodb

在 mongodb 中,upsert 结合了更新和插入命令。 它可以在 update() 和 findandmodify() 操作中使用。mongodb 中的 upsert 查询 upsert 采用单个布尔参数。

如何卸载 mongodb

发布时间:2023/05/11 浏览次数:745 分类:mongodb

要从您的计算机中卸载 mongodb,您必须先删除 mongodb 服务、数据库和日志文件。使用这篇 mongodb 文章,您将能够从 ubuntu linux、mac 和 windows 卸载 mongodb。 请务必保留数据备份,因为一旦卸载,便

在 mongodb 中存储日期和时间

发布时间:2023/05/11 浏览次数:762 分类:mongodb

本 mongodb 教程解释了 date() 对象是什么以及如何使用 date() 方法对集合进行排序。 这也将帮助您找到在 mongodb 中显示和存储日期/时间的最佳方法。

mongodb 按 id 查找

发布时间:2023/05/11 浏览次数:1856 分类:mongodb

mongodb 中的 find by id() 函数用于获取与用户提供的 id 相匹配的文档。 如果找不到与指定 id 匹配的文档,则返回空值。

检查 mongodb 服务器是否正在运行

发布时间:2023/05/11 浏览次数:247 分类:mongodb

这篇 mongodb 教程将告诉您如何检查是否安装了 mongodb 以及安装的 mongodb 服务器的版本。 它在 windows、ubuntu 和 mac 等不同的操作系统中实现。

mongodb 中的分页

发布时间:2023/05/11 浏览次数:174 分类:mongodb

这篇文章将介绍什么是 mongodb 中的分页。 为什么在 mongodb 中需要分页以及在 mongodb 中完成分页的不同方法或方式是什么。

mongodb 从查询开始

发布时间:2023/05/11 浏览次数:186 分类:mongodb

在这篇 mongodb 文章中,用户将学习如何使用 $regex 进行开始查询。 它为查询中的模式匹配字符串提供正则表达式功能。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便
网站地图