如何在 MongoDB C# 驱动程序中添加 Activity 以进行序列化器/反序列化器操作?

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

我想在 MongoDB 中添加活动(用于日志记录)来跟踪 MongoDB 操作,特别是序列化/反序列化操作。

我使用官方 MongoDB 驱动程序:https://www.nuget.org/packages/mongodb.driver/

理想情况下,我搜索一种在所有序列化/反序列化操作上添加活动的方法,而无需更改 Mongodb.driver 的源代码,但这似乎......复杂......

对于某些类,我使用带有

RegisterClassMap
的自定义 ClassMap,如下所示:

BsonClassMap.RegisterClassMap<MyClasse>(cm =>
{
   cm.AutoMap();
   cm.SetIgnoreExtraElements(true);
});

如果我可以在这个班级中添加活动,那就足够了。

我发现了这个 nuggets 包,它提供了 MongoDB 操作的活动,但它没有封装序列化/反序列化时间。

如果有人有任何想法,我很乐意听取您的意见。 预先感谢

c# mongodb-.net-driver system.diagnostics
1个回答
0
投票

虽然 MongoDB C# 驱动程序本身不提供对如此细粒度级别的跟踪的内置支持,但您应该能够通过使用 .NET DiagnosticSource 框架检测代码来实现此目的。

这是实现这一目标的一种方法:

使用 DiagnosticSource 活动包装您的自定义类映射。您已经展示了如何使用自定义类映射、在这些方法中添加跟踪活动的示例:

BsonClassMap.RegisterClassMap<MyClasse>(cm =>
{
    cm.AutoMap();
    cm.SetIgnoreExtraElements(true);

    // Wrap serialize and deserialize methods with DiagnosticSource activities
    cm.MapMember(c => c.MyProperty)
        .SetSerializer(SerializerBuilder.Build(typeof(MyPropertySerializer)));
});

这里,

SerializerBuilder.Build
应该是一个自定义序列化器,它将序列化和反序列化操作与DiagnosticSource活动包装起来。

然后为 MongoDB 操作创建您自己的 DiagnosticSource 事件并订阅这些事件以记录它们或执行其他操作。

using System.Diagnostics;

private static readonly DiagnosticSource mongoDbDiagnosticSource = new DiagnosticListener("MongoDBDiagnosticSource");

// Somewhere in your code, when you want to trace an operation:
var activity = new Activity("MongoDBSerialize");
activity.Start();

// Capture additional information if needed
activity.AddTag("CollectionName", "MyCollection");

mongoDbDiagnosticSource.Write(
    "MongoDBSerialize.Start",
    new { Activity = activity });

// ... Perform your MongoDB operation ...

activity.Stop();
mongoDbDiagnosticSource.Write("MongoDBSerialize.Stop", new { Activity = activity });

您需要为反序列化操作创建类似的工具。

您需要订阅您在代码中创建的

DiagnosticSource
事件来记录或分析跟踪信息。

var listener = new MyDiagnosticListener();
mongoDbDiagnosticSource.Subscribe(listener);

这里,

MyDiagnosticListener
是您将创建的自定义类,用于处理事件并执行日志记录等操作。

实施

MyDiagnosticListener

创建一个类来处理事件,您可以在其中记录跟踪信息或采取任何其他所需的操作。

public class MyDiagnosticListener
{
    public void OnMongoDBSerializeStart(Activity activity)
    {
        // Log or process the start of MongoDB serialization
    }

    public void OnMongoDBSerializeStop(Activity activity)
    {
        // Log or process the end of MongoDB serialization
    }
}

希望这可以帮助您了解如何捕获有关序列化/反序列化操作的详细信息并根据需要记录它们。

或者,您可以使用 .NET Core

ILogger
框架,例如
NLog
Serilog
来实现 MongoDB 操作的日志记录和跟踪。这样,您就可以提供一种将 MongoDB 操作日志记录与应用程序中现有日志记录基础设施集成的方法。

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.