为MongoDB Java驱动程序配置日志记录

37

我可以配置MongoDB Java驱动程序以输出有用的(用于调试)消息吗?最好使用标准日志框架之一。我主要希望看到每个查询的输出,接收到的数据量以及所需时间,以及任何错误代码。

7个回答

25

在加载任何MongoDB Java驱动程序类之前,您需要设置几个系统属性:

// Enable MongoDB logging in general
System.setProperty("DEBUG.MONGO", "true");

// Enable DB operation tracing
System.setProperty("DB.TRACE", "true");

在这样做之后,驱动程序将使用标准的Java日志记录框架来记录消息。

不幸的是,从Java驱动程序代码中我了解到,日志记录的粒度并不是很细-例如,您不能选择性地记录特定集合上的操作。


2
想知道是否有人尝试在Scala中使用casbah访问java驱动程序,并使用SLF4J日志记录API?当不使用JUL时,似乎无法将消息记录到我的日志框架中。 - Brett
2
我正在使用mongodb-spring data,但它不起作用,我没有得到任何日志记录... - user1955934
1
我怀疑这只适用于2.x的MongoDB Java驱动程序,而不适用于3.x(至少对我来说不起作用)。 - THelper

21

有人还在使用新版本的 mongodb 驱动程序 3.x 时遇到这个问题吗?

log4j.properties 中为 mongo 驱动程序包定义一个记录器。

log4j.logger.org.mongodb.driver=INFO

com.mongodb已更改为org.mongodb


2
我在log4j.properties中添加了这个,但是当我执行查询时什么也没有发生...除了我添加的自定义日志消息之外,我看不到任何日志记录。 - user1955934

16

设定 MongoDB 日志级别的另一种方法:

import java.util.logging.Logger;
Logger mongoLogger = Logger.getLogger( "com.mongodb" );
mongoLogger.setLevel(Level.SEVERE); // e.g. or Log.WARNING, etc.

您不必在使用任何驱动程序类之前这样做,您可以随时设置/更改日志级别。


2
这个日志记录器最好有一个包名。是JUL吗?SLF4j? - bmargulies
4
尝试过了,但对我没用。这个需要在Mongo初始化后才能调用吗? - Jan Zyka
我自己纠正,我能够设置级别,但无法设置过滤器。 - Jan Zyka
@JanZyka 我在这里没有尝试过过滤器,所以不确定。您可以尝试在应用过滤器之前调用Logger.getFilter() (http://docs.oracle.com/javase/6/docs/api/java/util/logging/Logger.html#getFilter()),并修改返回的过滤器,而不是从头开始创建一个新的过滤器。这只是一个猜测。 - ericsoco
需要说明的是,您需要在处理程序上定义过滤器。因此,我添加了带有过滤器的处理程序,并为记录器禁用了父处理程序,这解决了事件仍由根记录器默认附加器记录的问题。 - Jan Zyka
2
如果您在使用Mongodriver 3.x或更高版本时使用org.mongodb而不是com.mongodb,则本语句正确。 - panza

8

以下代码对我有效:

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.

5
要记录所有3.6 MongoDB Java驱动程序或更高版本的查询,请执行以下操作:
  1. 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>
    
  2. 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)

,这是大多数其他答案使用的方法,因此可能使用不同的日志级别(尽管我无法想象这种情况)。


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);

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接