c# - 在 Audit.Net 中有没有办法使用多个输出提供程序?

标签 c# asp.net-core .net-core asp.net-core-2.1 audit.net

我尝试设置下面的配置,但我认为只有其中一个正在使用。

有没有办法将两者链接起来,或者有没有其他方法可以使用多个输出提供程序?

            Audit.Core.Configuration.Setup()
                .UseElasticsearch(config => config
                    .ConnectionSettings(new Uri(elasticUri))
                    .Index("sample-index")
                    .Id(ev => Guid.NewGuid()));

            Audit.Core.Configuration.Setup()
                .UseUdp(config => config
                    .RemoteAddress("127.0.0.1")
                    .RemotePort(6060));

最佳答案

DataProvider 在整个应用程序中全局共享,因此您不能分配多个。

但是您可以轻松地实现自定义数据提供程序,它包装一些其他数据提供程序并依次调用它们的 InsertEvent/ReplaceEvent 方法。例如:

public class MultiDataProvider : AuditDataProvider
{
    private AuditDataProvider[] _providers;
    public MultiDataProvider(AuditDataProvider[] providers)
    {
        _providers = providers;
    }
    public override object InsertEvent(AuditEvent auditEvent)
    {
        object eventId = null;
        foreach (var dp in _providers)
        {
            eventId = dp.InsertEvent(auditEvent);
        }
        return eventId;
    }
    public async override Task<object> InsertEventAsync(AuditEvent auditEvent)
    {
        object eventId = null;
        foreach (var dp in _providers)
        {
            eventId = await dp.InsertEventAsync(auditEvent);
        }
        return eventId;
    }
    public override void ReplaceEvent(object eventId, AuditEvent auditEvent)
    {
        foreach (var dp in _providers)
        {
            dp.ReplaceEvent(eventId, auditEvent);
        }
    }
    public async override Task ReplaceEventAsync(object eventId, AuditEvent auditEvent)
    {
        foreach (var dp in _providers)
        {
            await dp.ReplaceEventAsync(eventId, auditEvent);
        }
    }

}

然后在您的启动代码中,您只需将 MultiDataProvider 配置为数据提供者,例如:

Audit.Core.Configuration.DataProvider = new MultiDataProvider(
    new AuditDataProvider[]
    {
        new ElasticsearchDataProvider(_ => _
             .ConnectionSettings(new Uri(elasticUri))
                .Index("sample-index")
                .Id(ev => Guid.NewGuid())),
        new UdpDataProvider()
        {
            RemoteAddress = IPAddress.Parse("127.0.0.1"),
            RemotePort = 6060
        }
    }
);

关于c# - 在 Audit.Net 中有没有办法使用多个输出提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58203562/

相关文章:

c# - 确保ThreadPool中的任务执行顺序

ASP.Net Core 嵌套区域

mysql - 从带有代理的 CORE 连接到 Google Cloud SQL 实例 : A network-related or instance-specific error occurred. 我可以通过 mysql cmd 连接

asp.net-mvc - asp.net core 身份 + api

c# - 使用 .Net Core 的 T4 参数指令

c# - 具有洋葱架构的 Asp.Net Core 中的 NLog

c# - 重写派生类中的 NotMapped 属性

苹果或水果的 C# 类?

c# - OData 是否允许用户使用 IQueryable 查询 SQL EF 数据库?

asp.net-core - Microsoft Distributed Redis Cache - 根据模式获取键