如何在 MongoDB C# Driver 2.0 中记录我的查询?

问题描述 投票:0回答:4

刚刚将我的应用程序升级到最新稳定的 MongoDB C# 驱动程序 2.0。

在迁移过程中,基本功能已被破坏,即使是最简单的查询,例如:

this.collection.Find(e => e.Id == id).SingleOrDefaultAsync()
也不会返回正确的数据。

检查了类映射和约定,但我想查看输出查询以便正确识别问题。

那么,

MongoClient
这边应该怎么做呢?

在数据库级别设置分析是可能的,但这不是一个好的解决方案,因为我们有多个应用程序和开发人员使用该数据库。

我的应用程序当前在 UI、业务和 EF 数据访问中使用

Ninject.Extensions.Logging
log4net

c# mongodb logging mongodb-.net-driver mongodb-csharp-2.0
4个回答
46
投票

对于较新的 C# MongoDB 驱动程序,API 已更改。您必须使用接受

MongoClientSettings
对象的更复杂的构造函数,而不是连接字符串。

使用以下代码继续使用连接字符串,但启用每个命令的日志记录:

var mongoConnectionUrl = new MongoUrl(connectionString);
var mongoClientSettings = MongoClientSettings.FromUrl(mongoConnectionUrl);
mongoClientSettings.ClusterConfigurator = cb => {
    cb.Subscribe<CommandStartedEvent>(e => {
        logger.Log($"{e.CommandName} - {e.Command.ToJson()}");
    });
};
var mongoCfgClient = new MongoClient(mongoClientSettings);

6
投票

使用 2.7.3 驱动程序记录到 VS 输出。

using MongoDB.Bson;
using MongoDB.Driver;
using System;
#if TRACE
using System.Diagnostics;
using MongoDB.Driver.Core.Configuration;
#endif

...

public static ClusterBuilder ConfigureCluster(ClusterBuilder builder)
{
#if TRACE
    var traceSource = new TraceSource(nameof(Geotagging), SourceLevels.Verbose);
    builder.TraceWith(traceSource);
    builder.TraceCommandsWith(traceSource);
#endif
    return builder;
}

public MongoClient BuildMongoClient(string connection_string)
{
    var mongoUrlBuilder = new MongoUrlBuilder(connection_string);
    var settings = MongoClientSettings.FromUrl(mongoUrlBuilder.ToMongoUrl());
    settings.ClusterConfigurator = cb => ConfigureCluster(cb);
    return new MongoClient(settings);
}

4
投票

您可以通过 mongo 驱动程序本身启用日志记录

var settings = new MongoClientSettings
{
    ClusterConfigurator = cb =>
    {
        var textWriter = TextWriter.Synchronized(new StreamWriter("mylogfile.txt"));
        cb.AddListener(new LogListener(textWriter));
    }
};

如果您愿意,您可以将其连接到 log4net。


0
投票

您还可以使用 MongoDB C# 客户端日志记录 系统,而不是挂钩事件并手动记录日志。

从版本 2.18 开始,.NET/C# 驱动程序使用标准 .NET 日志记录 API。

C# MongoDB 客户端页面上的文档创建了自己的记录器工厂,这显然是有效的,但您也可以挂钩默认的 .NET 记录器(或者更确切地说,

ILoggerFactory
)。

var settings MongoClientSettings.FromConnectionString("...");
settings.LoggingSettings = new 
// Get your ILoggerFactory from DI somewhere.
LoggingSettings(services.GetService<ILoggerFactory>());
var client = new MongoClient(settings);

命令使用

MongoDB.Command
级别记录到
debug
类别。所有可用的日志类别在手册中都有描述

例如,通过

appsettings.json
配置时,您可以使用:

{
  "Logging": {
    "LogLevel": {
      "MongoDB.Command": "Debug"
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.