我可以配置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.
Make sure you are using slf4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.29</version>
</dependency>
or if you are using log4j2
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>2.13.0</version>
</dependency>
Set the logging level for org.mongodb.driver
to DEBUG
So for log4j2 you would need to add something like this to the xml configuration file
<logger name="org.mongodb.driver" level="DEBUG"></logger>
根据MongoDB规范,将日志级别设置为建议的INFO或SEVERE级别对我没有起作用。如果找不到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);
ConnectionPoolListener
并在创建MongoClient
时放入其中。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);