Overview
En esta guía, aprenderá cómo configurar un registrador de eventos en el controlador Scala de MongoDB.
Esta guía muestra cómo registrar eventos en el controlador. Si desea aprender a utilizar la información sobre la actividad del controlador en el código, consulte la guía de monitorización.
Configura un registrador
Esta sección explica las dependencias necesarias para configurar un registrador de eventos y proporciona un ejemplo de configuración del mismo.
Segundo plano
El controlador de MongoDB para Scala utiliza la interfaz Simple Logging Facade For Java (SLF4J). Al usar SLF4J, puede especificar un marco de registro durante el despliegue. Configurar un registrador es opcional en el controlador de Scala.
Cuando inicias tu aplicación, el controlador Scala de MongoDB busca el artefacto slf4j-api en tu classpath. Si el controlador no puede encontrar el artefacto slf4j-api, registra la siguiente advertencia y desactiva todos los registros posteriores:
WARNING: SLF4J not found on the classpath. Logging is disabled for the 'org.mongodb.driver' component
Para configurar un registrador de eventos, debe incluir los siguientes componentes en su proyecto:
El artefacto
slf4j-apiUn framework de registro
Un enlace que conecta el
slf4j-apiartefacto a un marco de registro.
El siguiente ejemplo muestra cómo vincular el artefacto slf4j-api al marco de registro elegido.
Ejemplo de registrador
Seleccione la pestaña Logback o Log4j2 para configurar el marco de registro elegido y ver los ejemplos de código correspondientes:
Para usar Logback, agregue las siguientes líneas al archivo build.sbt de su proyecto. Estas líneas incluyen el artefacto slf4j-api, el marco de registro y el enlace.
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.13" libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.5.6"
Para probar la configuración de Logback, añade el siguiente código al archivo Main.scala de tu proyecto. Este código se conecta a tu implementación de MongoDB y recupera un documento. Después de añadir el código, usa sbt run para ejecutar la aplicación en la terminal en lugar del IDE.
val mongoClient = MongoClient("<connection string>") val database: MongoDatabase = mongoClient.getDatabase("<database>") val collection: MongoCollection[Document] = database.getCollection("<collection>") collection.find().first().printHeadResult()
... 12:14:55.853 [main] DEBUG org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:3}] to <MongoDB hostname> 12:14:55.861 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" started on database <database> using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname>. The request ID is 5. Command: {"find": "<collection>", "filter": {}, "limit": 1, "singleBatch": true, "$db": "<database>", "lsid": {"id": {"$binary": {"base64": "<_id>", "subType": "04"}}}, "$readPreference": {"mode": "primaryPreferred"}} 12:14:55.864 [main] DEBUG org.mongodb.driver.protocol.command - Command "find" succeeded in 4.34 ms using a connection with driver-generated ID 3 and server-generated ID 3 to <MongoDB hostname>. The request ID is 5. Command reply: {"cursor": {"id": 0, "ns": "<database>.<collection>", "firstBatch": []}, "ok": 1.0, "$clusterTime": {"clusterTime": {"$timestamp": {"t": 1673778535, "i": 1}}, "signature": {"hash": {"$binary": {"base64": "<_id>", "subType": "00"}}, "keyId": 0}}, "operationTime": {"$timestamp": {"t": 1673778535, "i": 1}}}
Nota
Nivel de registro por defecto
El nivel de registro predeterminado de Logback es DEBUG. Este nivel registra mensajes de diagnóstico detallados para la resolución de problemas, como las conexiones abiertas y los comandos que el controlador envía y recibe de MongoDB. Para saber cómo cambiar el nivel de registro de Logback, consulte el ejemplo en la sección «Configurar el registrador» de esta página.
Para obtener más información sobre Logback, consulta el manual de Logback.
Para usar Log4j2, agregue las siguientes líneas al archivo build.sbt de su proyecto. Estas líneas incluyen el artefacto slf4j-api, el marco de registro y el enlace.
libraryDependencies += "org.slf4j" % "slf4j-api" % "2.0.13" libraryDependencies += "org.apache.logging.log4j" % "log4j-slf4j2-impl" % "2.24.3" libraryDependencies += "org.apache.logging.log4j" % "log4j-core" % "2.24.3"
Para probar la configuración de Log4j2, agregue el siguiente código al archivo Main.scala de su proyecto. El código registra un mensaje de error. Después de agregar el código, use sbt run para ejecutar su aplicación en la terminal en lugar del IDE.
import org.slf4j.Logger import org.slf4j.LoggerFactory val logger: Logger = LoggerFactory.getLogger("MyApp") logger.error("Logging an Error")
12:35:00.438 [main] ERROR <my package path> - Logging an Error
Nota
Nivel de registro por defecto
El nivel de registro predeterminado de Log4j2 es ERROR. Esto significa que al ejecutar operaciones estándar en el controlador Scala de MongoDB no se generará ninguna salida en Log4j sin configurar el nivel de2 registro. Para saber cómo cambiar el42 nivel de registro de Log j, consulte el ejemplo en la sección «Configurar el registrador» de esta página.
Para obtener más información sobre Log4j2, consulta el Manual Log4j2.
Para obtener más información sobre SLF4J, consulte la documentación de SLF J.4
Configure su registrador
Para configurar su registrador, debe utilizar el sistema de configuración del marco de registro que vinculó a SLF4J.
Ejemplo de configuración
Un nivel de registro especifica la urgencia que debe tener un mensaje para que el registrador lo muestre. El siguiente ejemplo muestra cómo usar el sistema de configuración de cada marco de registro para establecer el nivel de registro en INFO. Seleccione la Logback Log4j2 pestaña o para ver el código correspondiente a cada método:
Logback lee su configuración de un archivo llamado logback.xml en tu classpath. Este archivo no existe por defecto, así que debes crearlo. Puedes colocar logback.xml en cualquier lugar de tu proyecto Scala, siempre que sea accesible desde tu classpath.
El marco de trabajo Logback define los siguientes niveles de registro, ordenados de mayor a menor urgencia:
Error
ADVERTENCIA
información
DEBUG
TRACE
Para obtener más información sobre el significado de cada nivel de registro, consulte Nivel efectivo en la documentación de Logback.
Inserta el siguiente código en tu archivo logback.xml:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <root level="INFO"> <appender-ref ref="CONSOLE" /> </root> </configuration>
Para comprobar que la configuración del registrador se realizó correctamente, ejecute el siguiente código utilizando el comando sbt run en lugar de su IDE:
val mongoClient = MongoClient("<connection string>") val database: MongoDatabase = mongoClient.getDatabase("<database>") val collection: MongoCollection[Document] = database.getCollection("<collection>") collection.find().first().printHeadResult()
... 1317 [cluster-<your cluster id>-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri> 1568 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<server value>}] to <your connection uri>
Para obtener más información sobre la configuración de Logback, consulte el Manual de Logback.
Log4j2 lee su configuración de un archivo llamado log4j2.xml en tu classpath. Este archivo no existe por defecto, así que debes crearlo. Puedes colocar log4j2.xml en cualquier lugar de tu proyecto Scala, siempre que sea accesible desde tu classpath.
El marco Log4j2 define los siguientes niveles de registro, enumerados del más urgente al menos urgente:
Fatal
Error
ADVERTENCIA
información
DEBUG
TRACE
Todo
Para obtener más información sobre el significado de cada nivel de registro, consulte Niveles de registro personalizados en la42 documentación de Log j.
Establece tu archivo log4j2.xml como el siguiente:
<Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Root level="INFO"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
Para comprobar que la configuración del registrador se realizó correctamente, ejecute el siguiente código utilizando el comando sbt run en lugar de su IDE:
val mongoClient = MongoClient("<connection string>") val database: MongoDatabase = mongoClient.getDatabase("<database>") val collection: MongoCollection[Document] = database.getCollection("<collection>") collection.find().first().printHeadResult()
... 10:14:57.633 [cluster-ClusterId{value=<your cluster id>, description='null'}-<your connection uri>] INFO org.mongodb.driver.cluster - Discovered replica set primary <your connection uri> 10:14:57.790 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
Para obtener más información sobre la configuración de Log4j,2 consulte la 42 guía de configuración de Log j en la42 documentación de Log j.
Nombres de registradores
Los sistemas de registro utilizan nombres de registradores jerárquicos para organizar los eventos de registro. Un registrador es antecesor de otro si su nombre, seguido de,"." es un prefijo del nombre del otro registrador. Por ejemplo, el grandparent registrador es antecesor del grandparent.parent registrador, que a su vez es antecesor del grandparent.parent.child registrador.
El siguiente código crea un registrador parent y un registrador parent.child, en el que el registrador parent es un antecesor del registrador parent.child:
import org.slf4j.Logger import org.slf4j.LoggerFactory val loggerParent: Logger = LoggerFactory.getLogger("parent") val loggerChild: Logger = LoggerFactory.getLogger("parent.child")
La jerarquía de registradores es similar a la jerarquía de clases en Scala: un registrador hereda las propiedades de su registrador antepasado y también puede definir las suyas propias.
El controlador Scala incluye los siguientes nombres de registradores predeterminados:
org.mongodb.driver.authenticator: autenticaciónorg.mongodb.driver.client:MongoClientinstanciasorg.mongodb.driver.clusterMonitoreo de la implementación de MongoDBorg.mongodb.driver.connectionconexiones y agrupaciones de conexionesorg.mongodb.driver.connection.tls: TLS/SSLorg.mongodb.driver.operation: Operaciones, incluidos los reintentos automáticosorg.mongodb.driver.protocolComandos y respuestas intercambiados con implementaciones de MongoDBorg.mongodb.driver.urianálisis de cadena de conexiónorg.mongodb.driver.management: JMX (Java Management Extensions)
Ejemplo de nombre de Logger
El siguiente ejemplo muestra cómo configurar el registrador raíz en OFF y el registrador org.mongodb.driver.connection en INFO, de modo que la aplicación registre solo los mensajes relacionados con la conexión a una implementación de MongoDB.
Seleccione la pestaña Logback o Log4j2 para ver ejemplos de configuración y resultados para el marco correspondiente:
Inserta el siguiente código en tu archivo logback.xml:
<configuration> <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> <encoder> <pattern> %-4relative [%thread] %-5level %logger{30} - %msg%n </pattern> </encoder> </appender> <logger name="org.mongodb.driver.connection" level="INFO" additivity="true"/> <root level="OFF"> <appender-ref ref="CONSOLE" /> </root> </configuration>
Para comprobar que la configuración del registrador se realizó correctamente, ejecute el siguiente código utilizando el comando sbt run en lugar de su IDE:
val mongoClient = MongoClient("<connection string>") val database: MongoDatabase = mongoClient.getDatabase("<database>") val collection: MongoCollection[Document] = database.getCollection("<collection>") collection.find().first().printHeadResult()
... 829 [cluster-<your cluster id>-<your connection uri>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:2, serverValue:<your server value>}] to <your connection uri> 977 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
Para más información sobre cómo configurar Logback, consulte la guía oficial de configuración de Logback.
Inserta el siguiente código en tu archivo log4j2.xml:
<Configuration status="INFO"> <Appenders> <Console name="Console" target="SYSTEM_OUT"> <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> </Console> </Appenders> <Loggers> <Logger name="org.mongodb.driver.connection" level="INFO"/> <Root level="OFF"> <AppenderRef ref="Console"/> </Root> </Loggers> </Configuration>
Para comprobar que la configuración del registrador se realizó correctamente, ejecute el siguiente código utilizando el comando sbt run en lugar de su IDE:
val mongoClient = MongoClient("<connection string>") val database: MongoDatabase = mongoClient.getDatabase("<database>") val collection: MongoCollection[Document] = database.getCollection("<collection>") collection.find().first().printHeadResult()
... 15:40:23.005 [cluster-<your cluster id>-<your connection uri>] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:3, serverValue:<your server value>}] to <your connection uri> 15:40:23.159 [main] INFO org.mongodb.driver.connection - Opened connection [connectionId{localValue:7, serverValue:<your server value>}] to <your connection uri>
Para obtener más información sobre cómo configurar Log4j2, consulta la guía de configuración de Log4j2.oficial
Configuración de registro del cliente
Puedes aplicar la configuración de registro a tu instancia MongoClient utilizando los métodos applyToLoggerSettings() y applicationName().
La siguiente tabla describe los métodos que puedes encadenar a tus configuraciones del registrador para modificar el comportamiento del registro:
Método | Descripción |
|---|---|
| Establece la longitud máxima del documento, en caracteres, de un solo mensaje de registro Por defecto: |
Ejemplo de configuración de registro del cliente
El siguiente ejemplo nombra la aplicación que envía las solicitudes y especifica 5000 caracteres como la longitud máxima del mensaje de registro. Ejecute el ejemplo usando el comando sbt run en lugar de su IDE.
val mongoClient = MongoClient( MongoClientSettings.builder() .applyConnectionString(ConnectionString("<your connection string>")) .applicationName("<application name>") .applyToLoggerSettings(builder => builder.maxDocumentLength(5000)) .build())
01:20:38.782 [main] INFO org.mongodb.driver.client -- MongoClient with metadata {"application": {"name": "<application name>"}, ..., loggerSettings=LoggerSettings{maxDocumentLength=5000}, ... timeoutMS=null} ... 01:20:41.022 [main] DEBUG org.mongodb.driver.protocol.command -- Command "listDatabases" succeeded ... Command reply: {"databases": [...], ...} 01:20:41.024 [main] DEBUG org.mongodb.driver.connection -- Connection checked in: address=<address>, driver-generated ID=6 myDb sample_airbnb sample_analytics ...
Para obtener más información, consulta la MongoClientSettings.Builder documentación de la API.