1. Visão geral
Ao usar o Spring Data MongoDB, podemos precisar registrar em um nível mais alto que o padrão. Normalmente, podemos precisar ver, por exemplo, algumas informações adicionais, como execuções de instruções ou parâmetros de consulta.
Neste breve tutorial, veremos como modificar o nível de log do MongoDB para consultas.
2. Configurar o log de consultas do MongoDB
O suporte do MongoDB oferece as MongoOperations interface ou seu principal MongoTemplate implementação para acessar dados, então tudo o que precisamos é configurar um nível de depuração para o MongoTemplate classe.
Como qualquer aplicativo Spring ou Java, podemos usar uma biblioteca de logger e definir um nível de log para MongoTemplate .
Normalmente, podemos escrever em nosso arquivo de configuração algo como:
<logger name="org.springframework.data.mongodb.core.MongoTemplate" level="DEBUG" />
No entanto, se estivermos executando um aplicativo Spring Boot , podemos configurar isso em nosso application.properties Arquivo:
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG
Da mesma forma, podemos usar o YAML sintaxe:
logging:
level:
org:
springframework:
data:
mongodb:
core:
MongoTemplate: DEBUG
3. Classe de teste para registro
Primeiro, vamos criar um Livro aula:
@Document(collection = "book")
public class Book {
@MongoId
private ObjectId id;
private String bookName;
private String authorName;
// getters and setters
}
Queremos criar uma classe de teste simples e verificar os logs.
Para demonstrar isso, usamos o Embedded MongoDB. Para ter certeza, vamos verificar nossas dependências primeiro :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>de.flapdoodle.embed</groupId>
<artifactId>de.flapdoodle.embed.mongo</artifactId>
<version>${embed.mongo.version}</version>
<scope>test</scope>
</dependency>
Por fim, vamos definir nossa classe de teste usando o Spring Boot Test:
@SpringBootTest
@TestPropertySource(properties = { "logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG" })
public class LoggingUnitTest {
private static final String CONNECTION_STRING = "mongodb://%s:%d";
private MongodExecutable mongodExecutable;
private MongoTemplate mongoTemplate;
@AfterEach
void clean() {
mongodExecutable.stop();
}
@BeforeEach
void setup() throws Exception {
String ip = "localhost";
int port = 27017;
ImmutableMongodConfig mongodbConfig = MongodConfig.builder()
.version(Version.Main.PRODUCTION)
.net(new Net(ip, port, Network.localhostIsIPv6()))
.build();
MongodStarter starter = MongodStarter.getDefaultInstance();
mongodExecutable = starter.prepare(mongodbConfig);
mongodExecutable.start();
mongoTemplate = new MongoTemplate(MongoClients.create(String.format(CONNECTION_STRING, ip, port)), "test");
}
// tests
}
4. Amostras de registro
Nesta seção, definiremos alguns casos de teste simples e mostraremos os logs relativos para testar os cenários mais comuns, como localizar, inserir, atualizar ou agregar Documento s.
4.1. Inserir
Primeiro, vamos começar inserindo um único Documento :
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
mongoTemplate.insert(book);
Os logs mostram em qual coleção estamos inserindo. Ao encontrar um Documento , o id também é registrado:
[2022-03-20 17:42:47,093]-[main] DEBUG MongoTemplate - Inserting Document containing fields: [bookName, authorName, _class] in collection: book
...
[2022-03-20 17:42:47,144]-[main] DEBUG MongoTemplate - findOne using query: { "id" : { "$oid" : "623759871ff6275fe96a5ecb"}} fields: Document{{}} for class: class com.baeldung.mongodb.models.Book in collection: book
[2022-03-20 17:42:47,149]-[main] DEBUG MongoTemplate - findOne using query: { "_id" : { "$oid" : "623759871ff6275fe96a5ecb"}} fields: {} in db.collection: test.book
4.2. Atualizar
Da mesma forma, ao atualizar um Documento :
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
mongoTemplate.insert(book);
String authorNameUpdate = "AuthorNameUpdate";
book.setAuthorName(authorNameUpdate);
mongoTemplate.updateFirst(query(where("bookName").is("Book")), update("authorName", authorNameUpdate), Book.class);
Podemos ver o Documento atualizado real campo nos logs:
[2022-03-20 17:48:31,759]-[main] DEBUG MongoTemplate - Calling update using query: { "bookName" : "Book"} and update: { "$set" : { "authorName" : "AuthorNameUpdate"}} in collection: book
4.3. Inserção em lote
Vamos adicionar um exemplo para uma inserção em lote:
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
Book book1 = new Book();
book1.setBookName("Book1");
book1.setAuthorName("Author1");
mongoTemplate.insert(Arrays.asList(book, book1), Book.class);
Podemos ver o número de Documentos inseridos s nos logs:
[2022-03-20 17:52:00,564]-[main] DEBUG MongoTemplate - Inserting list of Documents containing 2 items
4.4. Remover
Além disso, vamos adicionar um exemplo para remover:
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
mongoTemplate.insert(book);
mongoTemplate.remove(book);
Podemos ver nos logs, neste caso, o id do Documento excluído :
[2022-03-20 17:56:42,151]-[main] DEBUG MongoTemplate - Remove using query: { "_id" : { "$oid" : "62375cca2a2cba4db774d8c1"}} in collection: book.
4.5. Agregação
Vejamos um exemplo de Agregação . Nesse caso, precisamos definir uma classe de resultado. Por exemplo, agregaremos pelo nome do autor:
public class GroupByAuthor {
@Id
private String authorName;
private int authCount;
// getters and setters
}
Em seguida, vamos definir um caso de teste para agrupamento:
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
Book book1 = new Book();
book1.setBookName("Book1");
book1.setAuthorName("Author");
Book book2 = new Book();
book2.setBookName("Book2");
book2.setAuthorName("Author");
mongoTemplate.insert(Arrays.asList(book, book1, book2), Book.class);
GroupOperation groupByAuthor = group("authorName")
.count()
.as("authCount");
Aggregation aggregation = newAggregation(groupByAuthor);
AggregationResults<GroupByAuthor> aggregationResults = mongoTemplate.aggregate(aggregation, "book", GroupByAuthor.class);
Podemos ver nos logs por qual campo agregamos e que tipo de pipeline de agregação:
[2022-03-20 17:58:51,237]-[main] DEBUG MongoTemplate - Executing aggregation: [{ "$group" : { "_id" : "$authorName", "authCount" : { "$sum" : 1}}}] in collection book