【问题标题】:Logging Mongo driver queries performance in a text file在文本文件中记录 Mongo 驱动程序查询性能
【发布时间】:2020-06-20 16:30:49
【问题描述】:

我正在从事一个大学项目,我的导师要求我们记录所有内容,包括查询和执行时间。所以我努力寻找是否有任何可用的解决方案,但我没有找到。

编辑:我的项目是一个带有 Asp.net 核心和 mongo db(最新的 mongo 驱动程序)的 web api

【问题讨论】:

  • 查看文档中的审计和分析。

标签: c# mongodb .net-core


【解决方案1】:

在服务器执行查询时记录查询:

https://www.mysoftkey.com/mongodb/profiling-for-slow-query-log-in-mongodb/

MongoDB logging all queries

要在查询由特定客户端发出时记录查询,请使用命令监控。 .net 驱动文档:http://mongodb.github.io/mongo-csharp-driver/2.10/reference/driver_core/events/#command-events

似乎没有示例说明您从 .net 驱动程序中的这些事件中获得了什么。以下是在 Ruby 中使用等效功能的示例:https://docs.mongodb.com/ruby-driver/current/tutorials/ruby-driver-monitoring/#command-monitoring

【讨论】:

  • 请重新检查我的问题
【解决方案2】:

您可以订阅驱动程序的事件并记录它们。

public class Startup
{
    ...

    public void ConfigureServices(IServiceCollection services)
    {
        ...

        services.AddSingleton<IMongoClient>(s =>
        {
            string connectionString = Configuration.GetConnectionString("MongoDb");
            var settings = MongoClientSettings.FromUrl(new MongoUrl(connectionString));
            settings.ClusterConfigurator = builder =>
            {
                var logger = s.GetRequiredService<ILogger<FileLogEvents>>();
                builder.Subscribe(new FileLogEvents(logger));
            };

            return new MongoClient(settings);
        });
    }
}

public class FileLogEvents : IEventSubscriber
{
    private readonly ILogger _logger;

    private ReflectionEventSubscriber _subscriber;

    public FileLogEvents(ILogger logger)
    {
        _logger = logger;
        _subscriber = new ReflectionEventSubscriber(this);
    }
    public bool TryGetEventHandler<TEvent>(out Action<TEvent> handler)
    {
        return _subscriber.TryGetEventHandler(out handler);
    }

    public void Handle(CommandStartedEvent e)
    {
        _logger.LogInformation("Command Started: {Event}, Json: {Json}", e.CommandName, e.ToJson());
    }

    public void Handle(CommandSucceededEvent e)
    {
        _logger.LogInformation("Command Succeeded: {Event}", e.CommandName);
    }
}

及Serilog配置示例

public class Program
{
    public static void Main(string[] args)
    {
        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .WriteTo.Console()
            .WriteTo.File("log.txt")
            .CreateLogger();

        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseSerilog()
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
            });
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-13
    • 2018-06-27
    • 2021-04-20
    • 1970-01-01
    • 2021-09-03
    • 2017-12-01
    • 1970-01-01
    • 2012-11-17
    相关资源
    最近更新 更多