簡體   English   中英

為 MongoDB Java 驅動程序配置日志記錄

[英]Configure logging for the MongoDB Java driver

我可以將 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.

要使用 3.6 MongoDB Java 驅動程序或更高版本記錄所有查詢:

  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並在我們創建MongoClientMongoClient

例如(使用 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM