1. 概述
當使用 Spring Data MongoDB 時,我們可能需要將日誌級別設置為比默認級別更高的級別。通常,我們需要查看例如語句執行或查詢參數等額外信息。
在本簡短教程中,我們將學習如何修改 MongoDB 查詢的日誌級別。
2. 配置 MongoDB 查詢日誌
MongoDB Support 提供 MongoOperations 接口或其主要 MongoTemplate 實現來訪問數據,因此我們只需要為 MongoTemplate 類配置調試級別即可。
類似於任何 Spring 或 Java 應用程序,我們可以使用日誌庫併為 MongoTemplate 定義日誌級別。
通常,我們可以將以下內容寫入我們的配置文件中:
<logger name="org.springframework.data.mongodb.core.MongoTemplate" level="DEBUG" />但是,如果我們在運行 Spring Boot 應用程序時,我們可以通過在我們的 application.properties文件中進行配置:
logging.level.org.springframework.data.mongodb.core.MongoTemplate=DEBUG同樣,我們也可以使用 YAML 語法:
logging:
level:
org:
springframework:
data:
mongodb:
core:
MongoTemplate: DEBUG
3. 測試類:日誌記錄
首先,讓我們創建一個 Book 類:
@Document(collection = "book")
public class Book {
@MongoId
private ObjectId id;
private String bookName;
private String authorName;
// getters and setters
}我們想要創建一個簡單的測試類並查看日誌。
為了演示這一點,我們使用嵌入式 MongoDB。為了確保,我們首先檢查我們的依賴項:
<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>最後,讓我們使用 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. 日誌樣本
本節將定義一些簡單的測試用例,並展示用於測試常見場景的相應日誌,例如查找、插入、更新或聚合 文檔。
4.1. 插入
首先,我們來演示如何插入一個單獨的 文檔:
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
mongoTemplate.insert(book);
日誌顯示我們正在插入到哪個集合中。當找到一個 文檔 時,ID 也被記錄下來:
[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. 更新
同樣,更新一個 文檔 時:
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);
我們可以在日誌中看到實際更新的 Document 字段:
[2022-03-20 17:48:31,759]-[main] DEBUG MongoTemplate - Calling update using query: { "bookName" : "Book"} and update: { "$set" : { "authorName" : "AuthorNameUpdate"}} in collection: book4.3. 批量插入
下面我們添加一個批量插入的示例:
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);我們可以在日誌中看到插入的 Document 數量:
[2022-03-20 17:52:00,564]-[main] DEBUG MongoTemplate - Inserting list of Documents containing 2 items4.4. 刪除
以下我們添加一個刪除的示例:
Book book = new Book();
book.setBookName("Book");
book.setAuthorName("Author");
mongoTemplate.insert(book);
mongoTemplate.remove(book);
我們可以在日誌中看到,在此例中,已刪除 Document 的 ID:
[2022-03-20 17:56:42,151]-[main] DEBUG MongoTemplate - Remove using query: { "_id" : { "$oid" : "62375cca2a2cba4db774d8c1"}} in collection: book.4.5. 聚合 (Aggregation)
讓我們通過一個例子來了解聚合 (Aggregation)。在這種情況下,我們需要定義一個結果類。例如,我們可以按作者姓名進行聚合:
// 示例代碼註釋
public class AuthorAggregationResult {
// 結果類註釋
private String authorName;
// 結果類註釋
public AuthorAggregationResult(String authorName) {
this.authorName = authorName;
}
// 結果類註釋
public String getAuthorName() {
return authorName;
}
}
public class GroupByAuthor {
@Id
private String authorName;
private int authCount;
// getters and setters
}接下來,我們定義一個分組測試用例:
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);我們可以在日誌中看到我們聚合了哪個字段以及使用了哪種聚合流水線。
[2022-03-20 17:58:51,237]-[main] DEBUG MongoTemplate - Executing aggregation: [{ "$group" : { "_id" : "$authorName", "authCount" : { "$sum" : 1}}}] in collection book5. 結論
本文介紹瞭如何啓用 Spring Data MongoDB 的調試日誌級別。
我們定義了一些常見的查詢場景,並在實際測試中查看了相應的日誌。