我是否可以配置MongoDB Java驱动程序以输出有用的(用于调试)消息,理想情况下使用标准日志框架之一?我主要感兴趣的是看到每个查询结果,收到了多少数据以及花了多长时间,以及任何错误代码。
答案 0 :(得分:22)
在加载任何MongoDB Java驱动程序类之前,您需要设置几个系统属性:
// Enable MongoDB logging in general
System.setProperty("DEBUG.MONGO", "true");
// Enable DB operation tracing
System.setProperty("DB.TRACE", "true");
执行此操作后,驱动程序将使用the standard Java logging framework来记录消息。
不幸的是,据我所知,从Java驱动程序代码来看,日志记录粒度并不是那么好 - 例如,您无法有选择地记录特定集合上的操作。
答案 1 :(得分:19)
任何人仍然面临新版mongodb驱动程序3.x的问题?
在 log4j.properties
中为mongo驱动程序包定义记录器log4j.logger.org.mongodb.driver=INFO
com.mongodb 已更改为 org.mongodb 。
答案 2 :(得分:16)
另一种设置MongoDB日志级别的方法:
import java.util.logging.Logger;
Logger mongoLogger = Logger.getLogger( "com.mongodb" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.
在使用任何驱动程序类之前不必执行此操作,您可以随时设置/更改日志级别。
答案 3 :(得分:7)
以下系列适用于我,
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.
答案 4 :(得分:0)
从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);
答案 5 :(得分:0)
要使用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级别对我不起作用。根据{{3}},如果slf4j不存在,则
驱动程序将退回到JUL(java.util.logging)
这是大多数其他答案使用的,因此也许使用了不同的日志级别(尽管我无法想象是这种情况)
答案 6 :(得分:0)
Mongodb团队提供了一种解决方案(https://mongodb.github.io/mongo-java-driver/3.11/driver/reference/monitoring/)。
我们可以实现ConnectionPoolListener
并在创建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);