Visão geral
Neste guia, você aprenderá como:
Configure um logger usando o Simple Logging Facade For Java (SLF4J)
Configurar o nível de registro do seu logger
Este guia mostra como gravar eventos no driver. Para saber como usar informações sobre a atividade do driver no código, consulte o guia Monitoramento.
Importante
Biblioteca do Reator do Projeto
Este guia usa a biblioteca Project Reactor para consumir instâncias do Publisher retornadas pelos métodos de driver Java Reactive Streams. Para saber mais sobre a biblioteca do Projeto Reactor e como usá-la, consulte Introdução na documentação do Reactor.
Configurar um registrador
Esta seção fornece informações básicas sobre as dependências necessárias para definir um criador de logs e fornece um exemplo de definição do criador de logs.
Plano de fundo
O driver Java Reactive Streams usa o Simple Logging Facade For Java (SLF4J). O SLF4J permite que você especifique sua estrutura de registro preferida no momento da implementação. Para obter mais informações sobre o SLF4J, consulte a documentação do SLF J.4
Configurar um registrador é opcional. Quando você inicia seu aplicação, o driver Java Reactive Streams procura o artefato slf4j-api em seu caminho de classe. Se o driver não conseguir localizar o artefato slf4j-api, ele usará java.util.logging para registrar o seguinte aviso e desabilitará todos os registros adicionais:
WARNING: SLF4J not found on the classpath. Logging is disabled for the 'org.mongodb.driver' component
Para definir um logger, você deve incluir o seguinte em seu projeto:
O artefato
slf4j-apiUma estrutura de registro
Uma vinculação
Observação
Para as estruturas de registro mais populares, há frequentemente um único artefato de ligação que lista o slf4j-api e a estrutura de registro como dependências. Isso significa que você pode configurar um registrador adicionando um artefato à lista de dependência do seu projeto. Você verá isso no exemplo abaixo.
Um vínculo é um pedaço de código que conecta o artefato do slf4j-api a uma estrutura de registro. Selecione uma guia para saber como definir e configurar seu registrador:
Exemplo - Configuração
Este exemplo mostra como configurar seu registrador Logback.
Dica
Versões de dependência
As seguintes versões são ilustrativas em vez de uma fonte da verdade. Verifique a documentação oficial do SLF4J e sua estrutura de registro de escolha para obter informações de versão atualizadas garantidas.
Selecione as instruções Maven ou Gradle com base em sua ferramenta de construção:
Maven
Adicione a seguinte dependência ao seu arquivo pom.xml :
<dependencies> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.11</version> </dependency> </dependencies>
Gradle
Adicione a seguinte dependência ao seu arquivo build.gradle :
dependencies { implementation 'ch.qos.logback:logback-classic:1.2.11' }
Depois de incluir a dependência anterior, conecte-se à sua instância do MongoDB e use o código a seguir para recuperar um documento:
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
Você deverá ver uma saída semelhante à seguinte:
... 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}}}
Observação
Nível de registro padrão
O nível de log padrão do Logback é DEBUG. Para saber como alterar o nível de log do registrador do Logback, veja o exemplo nesta página na seção Como configurar seu registrador.
Para obter mais informações sobre Logback, consulte o manual de Logback.
Configure seu registrador
Para configurar seu registrador, você deve usar o sistema de configuração da estrutura de registro vinculada ao SLF4J.
O exemplo a seguir mostra como você pode usar o sistema de configuração da estrutura de registro para definir o nível de registro do registrador.
O nível de log de um logger especifica um limite inferior para determinar a urgência necessária para que o logger emita essa mensagem.
Exemplo - Configurar
Este exemplo mostra como configurar o nível de log do seu logger para INFO.
Especifique as configurações do Logback em um arquivo chamado logback.xml. Você não precisa criar seu arquivo logback.xml em um local específico, mas você deve conseguir acessá-lo a partir do seu classpath.
A estrutura Logback define os seguintes níveis de registro, ordenados do mais urgente para o menos urgente:
ERROR
WARN
INFO
DEBUG
TRACE
Insira o seguinte código no seu arquivo 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 testar se a configuração do seu registrador está correta, execute o seguinte código:
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
Você deverá ver uma saída semelhante à seguinte:
... 1317 [cluster-ClusterId{value='<your cluster id>', description='null'}-<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 obter mais informações sobre como configurar o Logback, consulte o Manual do Logback.
Nomes de registradores
Seu logger usa nomes de loggers para ajudar a organizar diferentes eventos de logger. Os nomes de logger são strings que formam uma hierarquia. Um logger é um ancestral de outro logger se seu nome seguido por um "." for um prefixo do nome do outro logger. Por exemplo, "grandparent" é um ancestral de "grandparent.parent", que é um ancestral de "grandparent.parent.child".
Como exemplo prático, veja como uma hierarquia de loggers se apresenta no código:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger_parent = LoggerFactory.getLogger("parent"); Logger logger_child = LoggerFactory.getLogger("parent.child");
Um logger herda as propriedades de seu logger ancestral e pode definir as suas próprias. É possível pensar nisso como algo semelhante à herança de classes em Java.
O driver Java Reactive Streams define os seguintes nomes de registradores para organizar diferentes eventos de registro no driver:
org.mongodb.driver.authenticator: Autenticaçãoorg.mongodb.driver.client: Eventos relacionados a instâncias deMongoClientorg.mongodb.driver.cluster: Monitoramento das implementações do MongoDBorg.mongodb.driver.connection: Conexões e pools de conexõesorg.mongodb.driver.connection.tls: TLS/SSLorg.mongodb.driver.operation: Operações, incluindo registro relacionado a novas tentativas automáticasorg.mongodb.driver.protocol.command: Comandos enviados e respostas recebidas de sistemas MongoDBorg.mongodb.driver.uri: Análise de connection stringorg.mongodb.driver.management: Extensões de gerenciamento Java (JMX)
Exemplo - Nomes
Este exemplo mostra como alterar o nível de registro de um registrador de driver específico. O exemplo define o registrador raiz como OFF e o registrador org.mongodb.driver.connection como INFO. Isso faz com que o aplicação registre somente mensagens relacionadas à conexão com uma instância MongoDB .
Insira o seguinte código no seu arquivo 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 testar se a configuração do seu registrador está correta, execute o seguinte código:
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
Você deverá ver uma saída semelhante à seguinte:
... 829 [cluster-rtt-ClusterId{value='<some value>', description='null'}-<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 mais informações sobre como configurar o Logback, consulte o guia oficial de configuração do Logback.
Exemplo - Configuração
Este exemplo mostra como configurar seu registrador Log4j.
Dica
Versões de dependência
As seguintes versões são ilustrativas em vez de uma fonte da verdade. Verifique a documentação oficial do SLF4J e sua estrutura de registro de escolha para obter informações de versão atualizadas garantidas.
Selecione as instruções Maven ou Gradle com base em sua ferramenta de construção:
Maven
Adicione a seguinte dependência ao seu arquivo pom.xml :
<dependencies> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.17.1</version> </dependency> </dependencies>
Gradle
Adicione a seguinte dependência ao seu arquivo build.gradle :
dependencies { implementation 'org.apache.logging.log4j:log4j-slf4j-impl:2.17.1' }
Depois de incluir a dependência anterior, use o seguinte código para registrar um erro:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger = LoggerFactory.getLogger("MyApp"); logger.error("Logging an Error");
Você deverá ver uma saída semelhante à seguinte:
12:35:00.438 [main] ERROR <my package path> - Logging an Error
Observação
Nível de registro padrão
O nível de registro padrão do Log4j2 é ERRO. A execução de operações padrão no driver Java Reactive Streams não produzirá saída do Log4j2 sem configuração. Para saber como alterar seu42 nível de registro do registrador j, consulte o exemplo na seção Configurar seu registrador desta página.
Para obter mais informações sobre o Log4j2, consulte o manual do Log4j2.
Configure seu registrador
Para configurar seu registrador, você deve usar o sistema de configuração da estrutura de registro vinculada ao SLF4J.
O exemplo a seguir mostra como você pode usar o sistema de configuração da estrutura de registro para definir o nível de registro do registrador.
O nível de log de um logger especifica um limite inferior para determinar a urgência necessária para que o logger emita essa mensagem.
Nomes de registradores
Seu logger usa nomes de loggers para ajudar a organizar diferentes eventos de logger. Os nomes de logger são strings que formam uma hierarquia. Um logger é um ancestral de outro logger se seu nome seguido por um "." for um prefixo do nome do outro logger. Por exemplo, "grandparent" é um ancestral de "grandparent.parent", que é um ancestral de "grandparent.parent.child".
Como exemplo prático, veja como uma hierarquia de loggers se apresenta no código:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; ... Logger logger_parent = LoggerFactory.getLogger("parent"); Logger logger_child = LoggerFactory.getLogger("parent.child");
Um logger herda as propriedades de seu logger ancestral e pode definir as suas próprias. É possível pensar nisso como algo semelhante à herança de classes em Java.
O driver Java Reactive Streams define os seguintes nomes de registradores para organizar diferentes eventos de registro no driver:
org.mongodb.driver.authenticator: Autenticaçãoorg.mongodb.driver.client: Eventos relacionados a instâncias deMongoClientorg.mongodb.driver.cluster: Monitoramento das implementações do MongoDBorg.mongodb.driver.connection: Conexões e pools de conexõesorg.mongodb.driver.connection.tls: TLS/SSLorg.mongodb.driver.operation: Operações, incluindo registro relacionado a novas tentativas automáticasorg.mongodb.driver.protocol.command: Comandos enviados e respostas recebidas de sistemas MongoDBorg.mongodb.driver.uri: Análise de connection stringorg.mongodb.driver.management: Extensões de gerenciamento Java (JMX)
Exemplo - Nomes
Este exemplo mostra como alterar o nível de registro de um registrador de driver específico. O exemplo define o registrador raiz como OFF e o registrador org.mongodb.driver.connection como INFO. Isso faz com que o aplicação registre somente mensagens relacionadas à conexão com uma instância MongoDB .
Insira o seguinte código no seu arquivo 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 testar se a configuração do seu registrador está correta, execute o seguinte código:
MongoClient mongoClient = MongoClients.create("<connection URI>"); MongoDatabase database = mongoClient.getDatabase("<database>"); MongoCollection<Document> collection = database.getCollection("<collection>"); Flux.from(collection.find()).blockFirst();
Você deverá ver uma saída semelhante à seguinte:
... 15:40:23.005 [cluster-ClusterId{value='<some value>', description='null'}-<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>
Informações adicionais
Para obter mais informações sobre como configurar o Log4j2, consulte o guia de configuração oficial do Log4J2.
Configurações de conexão
Você pode aplicar configurações de registro à sua instância do MongoClient utilizando os métodos applyToLoggerSettings() e applicationName().
A tabela a seguir descreve os métodos que você pode conectar às configurações do registrador para modificar o comportamento do registro:
Método | Descrição |
|---|---|
| Define o tamanho máximo do documento , em caracteres, de uma única mensagem de registro Padrão: |
Exemplo
Este exemplo nomeia o aplicação que envia solicitações e especifica que o número máximo de caracteres para uma única mensagem de registro é 5000 caracteres.
MongoClient mongoClient = MongoClients.create( MongoClientSettings.builder() .applyConnectionString( new ConnectionString("<connection URI>")) .applicationName("<application name>") .applyToLoggerSettings(builder -> builder.maxDocumentLength(5000)) .build()); Flux.from(mongoClient.listDatabaseNames()) .doOnNext(System.out::println) .blockLast();
Você deverá ver uma saída semelhante à seguinte:
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 ...
Informações adicionais
Para obter mais informações sobre as configurações de conexão descritas nesta seção, consulte a documentação da API MongoClientSettings.Builder.