[英]Configure logging for the MongoDB Java driver
我可以將 MongoDB Java 驅動程序配置為輸出有用的(用於調試)消息,最好使用標准日志記錄框架之一嗎? 我主要對查看發出的每個查詢、收到的數據量和花費的時間以及任何錯誤代碼感興趣。
在加載任何 MongoDB Java 驅動程序類之前,您需要設置幾個系統屬性:
// Enable MongoDB logging in general
System.setProperty("DEBUG.MONGO", "true");
// Enable DB operation tracing
System.setProperty("DB.TRACE", "true");
之后,驅動程序將使用 標准的 Java 日志框架來記錄消息。
不幸的是,據我從 Java 驅動程序代碼中可以看出,日志記錄的粒度並不是那么好——例如,您不能有選擇地記錄特定集合上的操作。
使用新版本 mongodb 驅動程序 3.x 的人仍然面臨這個問題嗎?
在log4j.properties 中為 mongo 驅動程序包定義一個記錄器
log4j.logger.org.mongodb.driver=INFO
com.mongodb已更改為org.mongodb 。
另一種設置 MongoDB 日志級別的方法:
import java.util.logging.Logger;
Logger mongoLogger = Logger.getLogger( "com.mongodb" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.
在使用任何驅動程序類之前,您不必這樣做,您可以隨時設置/更改日志級別。
以下線路對我有用,
import java.util.logging.Logger;
import java.util.logging.Level;
Logger mongoLogger = Logger.getLogger( "org.mongodb.driver" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.
要使用 3.6 MongoDB Java 驅動程序或更高版本記錄所有查詢:
確保您使用的是 slf4j
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.29</version> </dependency>
或者如果您使用的是 log4j2
<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.13.0</version> </dependency>
將org.mongodb.driver
的日志級別設置為DEBUG
因此,對於 log4j2,您需要在 xml 配置文件中添加類似的內容
<logger name="org.mongodb.driver" level="DEBUG"></logger>
按照其他答案中的建議將日志級別設置為 INFO 或 SEVERE 級別對我不起作用。 根據MongoDB 規范,如果 slf4j 不存在,則
驅動程序將回退到 JUL (java.util.logging)
這是大多數其他答案使用的,所以也許使用不同的日志級別(盡管我無法想象是這種情況)
從 3.11 beta2 開始,這對我有用
import com.mongodb.diagnostics.logging.Loggers;
import java.util.logging.Level;
import java.util.logging.Logger;
Logger.getLogger(Loggers.PREFIX).setLevel(Level.SEVERE);
Mongodb 團隊提供了一種解決方案( https://mongodb.github.io/mongo-java-driver/3.11/driver/reference/monitoring/ )。
我們可以實現ConnectionPoolListener
並在我們創建MongoClient
時MongoClient
。
例如(使用 log4j):
public class ConnectionPoolListenerMongoDb implements ConnectionPoolListener {
private static final Logger logger = Logger.getLogger(StatisticsDaoImpl.class);
@Override
public void connectionPoolOpened(ConnectionPoolOpenedEvent connectionPoolOpenedEvent) {
logger.info(connectionPoolOpenedEvent.toString());
}
@Override
public void connectionPoolClosed(ConnectionPoolClosedEvent connectionPoolClosedEvent) {
logger.info(connectionPoolClosedEvent.toString());
}
@Override
public void connectionCheckedOut(ConnectionCheckedOutEvent connectionCheckedOutEvent) {
logger.info(connectionCheckedOutEvent.toString());
}
@Override
public void connectionCheckedIn(ConnectionCheckedInEvent connectionCheckedInEvent) {
logger.info(connectionCheckedInEvent.toString());
}
@Override
public void waitQueueEntered(ConnectionPoolWaitQueueEnteredEvent connectionPoolWaitQueueEnteredEvent) {
logger.info(connectionPoolWaitQueueEnteredEvent.toString());
}
@Override
public void waitQueueExited(ConnectionPoolWaitQueueExitedEvent connectionPoolWaitQueueExitedEvent) {
logger.info(connectionPoolWaitQueueExitedEvent.toString());
}
@Override
public void connectionAdded(ConnectionAddedEvent connectionAddedEvent) {
logger.info(connectionAddedEvent.toString());
}
@Override
public void connectionRemoved(ConnectionRemovedEvent connectionRemovedEvent) {
logger.info(connectionRemovedEvent.toString());
}
}
設置:
private MongoClientSettings getMongoClientSettings() throws IOException {
return MongoClientSettings.builder()
.applyToConnectionPoolSettings(new Block<ConnectionPoolSettings.Builder>() {
@Override
public void apply(ConnectionPoolSettings.Builder builder) {
builder.addConnectionPoolListener(new ConnectionPoolListenerMongoDb());
}
})
.applyConnectionString(new ConnectionString(Settings.getMongoSettings()))
.build();
}
創作:
MongoClientSettings settings = getMongoClientSettings();
mongoClient = MongoClients.create(settings);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.