Настроить ведение журнала для драйвера 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 или новее:
Убедитесь, что вы используете 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
.
Например (с 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);