Настроить ведение журнала для драйвера MongoDB Java

Могу ли я настроить драйвер Java MongoDB для вывода полезных (для отладки) сообщений, в идеале с использованием одной из стандартных платформ журналирования? В основном мне было бы интересно посмотреть на каждый отправляемый запрос, сколько данных было получено и сколько времени это заняло, а также коды ошибок.

4 ответа

Решение

Вам необходимо установить пару системных свойств перед загрузкой любого из классов драйвера 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?

определить регистратор для пакета драйвера mongo в log4j.properties

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.

Чтобы регистрировать все запросы с помощью драйвера Java MongoDB версии 3.6 или новее:

  1. Убедитесь, что вы используете 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>
    
  2. Установите уровень ведения журнала для 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.

Например (с 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);
Другие вопросы по тегам