Registrar todas las consultas en MongoDB
-
el comando
getLog
en MongoDB - Niveles de verbosidad para el registro de consultas en MongoDB
- Registrar operaciones lentas en MongoDB
-
Filtrar los resultados de las consultas de registro dentro de
mongosh
-
Filtrar los resultados de las consultas de registro fuera de
mongosh
conjq
En este artículo, aprenderá a registrar consultas en MongoDB. Además, se explican en detalle los operadores utilizados para registrar consultas en MongoDB.
el comando getLog
en MongoDB
El comando de administrador getLog
recupera las 1024 ocurrencias mongod
registradas más recientes. El comando getLog
no recupera datos de registro del archivo de registro mongod
; en cambio, obtiene información de un caché de RAM de los eventos mongod
registrados.
Utilice la función db.adminCommand()
para ejecutar getLog
. getLog
entrega datos de registro en formato JSON extendido relajado v2.0 con escape a partir de MongoDB 4.4. Los datos de registro se entregaban anteriormente en texto sin formato.
La sintaxis del comando getLog
es la siguiente:
db.adminCommand( { getLog: <value> } )
Los valores posibles para getLog
son:
Valor | Descripción |
---|---|
* |
Devuelve una lista de los valores disponibles para el comando getLog . |
global |
Devuelve la salida combinada de todas las entradas de registro. |
startupwarnings |
Devuelve las entradas de registro del registro de MongoDB que pueden incluir errores o advertencias cuando se inició el proceso actual. Este filtro podría devolver una matriz vacía si mongod se inició sin signos. |
Si se proporciona *
, el comando devuelve un documento que contiene los nombres de los otros valores válidos. De lo contrario, el comando produce un documento con los siguientes campos:
- un campo
totalLinesWritten
que contiene el número de eventos de registro; - campo
log
que contiene una matriz de eventos de registro; - un documento de respuesta que proporciona información sobre el estado y la marca de tiempo de
db.adminCommand()
.
Comportamiento de truncamiento de línea del comando getLog
en MongoDB
A partir de MongoDB 4.2, getLog
trunca cualquier evento con más de 1024 caracteres. En versiones anteriores, se trunca después de 512 caracteres.
Comportamiento de evasión de caracteres del comando getLog
en MongoDB
A partir de MongoDB 4.4, getLog
entrega datos de registro en formato JSON extendido relajado v2.0 con escape, utilizando las secuencias de escape que se enumeran a continuación para transformar la salida del registro como JSON válido:
Personaje representado | Secuencia de escape |
---|---|
Barra invertida (\ ) |
\\ |
Comillas (" ) |
\" |
Avance de formulario (0x0C ) |
\f |
Retroceso (0x08 ) |
\b |
Retorno de carro (0x0D ) |
\r |
Pestaña horizontal (0x09 ) |
\t |
Nueva línea (0x0A ) |
\n |
Los caracteres de control no mencionados anteriormente se escapan con uXXXX,
, donde XXXX
es el punto de código hexadecimal para el punto de código Unicode. Los bytes con codificación UTF-8 incorrecta se sustituyen con el carácter de reemplazo Unicode ufffd
.
Niveles de verbosidad para el registro de consultas en MongoDB
Puede cambiar el nivel de detalle del registro para aumentar o disminuir la cantidad de mensajes de registro producidos por MongoDB. La verbosidad se puede modificar para todos los componentes colectivamente o identificar componentes por separado.
Solo las entradas de registro en las categorías de gravedad Informativo y Depuración se ven afectadas por la verbosidad. Por encima de estos niveles, siempre se muestran las categorías de gravedad.
Establezca la configuración de verbosidad en un valor alto para un registro extenso durante la depuración o el desarrollo o en un número bajo para limitar las escrituras de registro en una implementación de producción validada.
Examinar el nivel de verbosidad del registro actual en MongoDB
Utilice la función db.getLogComponents()
para ver los niveles de verbosidad actuales:
db.getLogComponents()
Su salida podría parecerse a la siguiente:
La primera entrada, verbosidad
, es el nivel de verbosidad global para todos los componentes. Los componentes nombrados posteriormente, como accessControl,
, indican el nivel de detalle específico para ese componente, anulando el nivel de detalle global si se establece.
Un valor de -1
muestra que el componente heredará el nivel de verbosidad del padre si tiene uno de los niveles de verbosidad globales si no lo tiene (como con comando
).
Configurar los niveles de verbosidad del registro en MongoDB
systemLog.verbosity
y systemLog.component.name>.verbosity
establecen el argumento logComponentVerbosity
, y la función db.setLogLevel()
se puede usar para cambiar la cantidad de verbosidad.
Use la configuración de verbosidad systemLog
para controlar el nivel
Utilice el parámetro systemLog.verbosity
para especificar el nivel de registro predeterminado para todos los componentes. Use la configuración systemLog.component.name>.verbosity
para controlar el nivel de ciertos componentes.
La siguiente configuración, por ejemplo, establece systemLog.verbosity
en 1
, systemLog.component.query.verbosity
en 2
, systemLog.component.storage.verbosity
en 2
y systemLog. componente.almacenamiento.diario.verbosidad
a 1
:
systemLog:
verbosity: 1
component:
query:
verbosity: 2
storage:
verbosity: 2
journal:
verbosity: 1
Para su instancia mongod
o mongos
, especifique estos ajustes en el archivo de configuración o en la línea de comando.
El nivel de verbosidad de todos los componentes no especificados explícitamente en la configuración es -1
. Indica que toman el nivel de verbosidad de su padre si tienen uno de los niveles de verbosidad globales.
Modificar el parámetro logComponentVerbosity
Pase un documento que contenga la configuración de verbosidad para modificar la opción logComponentVerbosity
.
El siguiente comando, por ejemplo, cambia el nivel de verbosidad predeterminado a 2
, la consulta
a 3
, el almacenamiento
a 4
y el almacenamiento.diario
a 1
.
db.adminCommand( {
setParameter: 1,
logComponentVerbosity: {
verbosity: 2,
query: {
verbosity: 3
},
storage: {
verbosity: 4,
journal: {
verbosity: 1
}
}
}
} )
Puede establecer estos valores desde mongosh.
.
Utilice db.setLogLevel()
para cambiar el nivel de registro en MongoDB
Para cambiar el nivel de registro de un solo componente, utilice la función db.setLogLevel()
. Puede definir un nivel de verbosidad de 0
a 5
para un componente o especificar -1
para heredar la verbosidad del padre.
Por ejemplo, establecer systemLog.component.query.verbosity
en su nivel de detalle principal (es decir, nivel de detalle predeterminado) es el siguiente:
db.setLogLevel(-1, "query")
Puede establecer este valor desde mongosh.
.
Registrar operaciones lentas en MongoDB
Las operaciones del cliente (como las consultas) se registran si tardan más que el umbral de operación lenta o si el nivel de detalle del registro se establece en 1
o superior.
Para las operaciones de lectura/escritura, a partir de MongoDB 4.2, las entradas del perfilador y los mensajes de registro de diagnóstico (es decir, los mensajes de registro mongod/mongos
) incluyen:
queryHash
, una función que puede detectar búsquedas lentas con el mismo formulario de consulta;planCacheKey
brinda información adicional sobre el caché del plan de consulta para consultas lentas.
Los mensajes de registro de operación lenta ahora incluyen una columna “remota” que especifica la dirección IP del cliente a partir de MongoDB 5.0.
El resultado de ejemplo proporcionado incluye información sobre una operación de agregación lenta:
{"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}}
Obtener tiempo de espera para fragmentos en el campo remoteOpWaitMillis
Puede obtener el tiempo de espera (en milisegundos) para los resultados de fragmentos utilizando el campo de registro remoteOpWaitMillis
a partir de MongoDB 5.0.
Solo se informan los siguientes valores para remoteOpWaitMillis
:
- Si las operaciones son lentas, el registro está habilitado.
- Sobre el fragmento, o
mongos,
, que combina los resultados
Compare las columnas de tiempo durationMillis
y remoteOpWaitMillis
en el registro para ver si una operación de fusión o un problema de fragmento está causando la consulta lenta. durationMillis
es la cantidad total de tiempo que tardó en finalizar la consulta.
Específicamente,
- Si
durationMillis
supera aremoteOpWaitMillis
, la mayor parte del tiempo se pasó esperando una respuesta del fragmento. Por ejemplo,durationMillis
de18
yremoteOpWaitMillis
de15
son valores aceptables. - Si
durationMillis
es significativamente mayor queremoteOpWaitMillis
, la mayor parte del tiempo se dedicó a la fusión. Por ejemplo,durationMillis
de150
yremoteOpWaitMillis
de15
.
Filtrar los resultados de las consultas de registro dentro de mongosh
La salida de getLog
se puede filtrar para que los resultados sean más fáciles de leer o para que coincidan con criterios específicos.
El siguiente comando imprime solo el campo log
(que contiene una matriz de todos los eventos de registro actuales) mientras elimina el carácter que se escapa de cada mensaje de registro:
db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})
En esta operación, la salida de getLog
se presenta en el mismo formato que el archivo de registro
de MongoDB.
PRECAUCIÓN: getLog
solo muestra los últimos 1024 eventos mongod
registrados y no pretende reemplazar el archivo de registro de MongoDB.
Filtrar los resultados de las consultas de registro fuera de mongosh
con jq
El programa de línea de comandos jq
de terceros es útil cuando se trata del registro estructurado de MongoDB. Permite una impresión rápida y bonita de las entradas de registro y una coincidencia y un filtrado robustos basados en claves.
jq
es un analizador JSON gratuito y de código abierto para Linux, Windows y macOS.
Debe usar la opción -eval
para mongosh
para utilizar jq
con la salida getLog
. La siguiente acción emplea jq
para filtrar el componente REPL para que solo se muestren los mensajes de registro relacionados con la replicación:
mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -c '. | select(.c=="REPL")'
Tenga cuidado de darle a mongosh
cualquier argumento específico de conexión que requiera, como -host
o -port.
.
mongosh --quiet --eval "db.adminCommand( { getLog:'global'} ).log.forEach(x => {print(x)})" | jq -r ".msg" | sort | uniq -c | sort -rn | head -10
Recuperar filtros de registro disponibles
La siguiente operación, ejecutada desde mongosh
, devuelve los filtros de registro disponibles para pasar a getLog
:
db.adminCommand( { getLog: "" } )
La operación devuelve el siguiente documento:
{ "names" : [ "global", "startupWarnings" ], "ok" : 1 }
Recuperar eventos recientes del registro
El siguiente comando, ejecutado desde mongosh
, obtiene los eventos globales
más recientes de mongod
:
db.adminCommand( { getLog : "global" } )
La operación produce un documento que se ve así:
Artículo relacionado - MongoDB Query
- Consulta con longitud de cadena en MongoDB
- Consulta con múltiples condiciones en MongoDB
- Consulta de documentos con tamaño de matriz mayor que 1 en MongoDB
- Consulta de fecha con ISODate en MongoDB
- Consultas que no distinguen entre mayúsculas y minúsculas en MongoDB
- Devolver valores únicos en MongoDB