Audit.Net:保存在不同数据提供者中的过程

时间:2019-06-14 11:23:54

标签: audit.net

是否可以建立某种机制,以防万一在默认数据提供程序(例如oracle)中插入审计失败的情况,例如在文件中使用另一个数据提供程序? 感谢您的帮助

1 个答案:

答案 0 :(得分:1)

没有提供自动回退功能的数据提供者,但是您可以implement a custom data provider

假设您希望默认情况下使用Sql数据提供程序,并使用另一个数据提供程序作为后备。从SQL数据提供程序(SqlDataProvider)继承,并在引发DataProvider时回退到另一个SqlException

public class FallbackSqlDataProvider : SqlDataProvider
{
    public AuditDataProvider FallbackProvider { get; set; }

    public override object InsertEvent(AuditEvent auditEvent)
    {
        try
        {
            return base.InsertEvent(auditEvent);
        }
        catch (SqlException)
        {
            return FallbackProvider?.InsertEvent(auditEvent);
        }
    }
    public override async Task<object> InsertEventAsync(AuditEvent auditEvent)
    {
        try
        {
            return await base.InsertEventAsync(auditEvent);
        }
        catch (SqlException)
        {
            return await FallbackProvider?.InsertEventAsync(auditEvent);
        }
    }
    public override void ReplaceEvent(object eventId, AuditEvent auditEvent)
    {
        try
        {
            base.ReplaceEvent(eventId, auditEvent);
        }
        catch (SqlException)
        {
            FallbackProvider?.ReplaceEvent(eventId, auditEvent);
        }
    }
    public override async Task ReplaceEventAsync(object eventId, AuditEvent auditEvent)
    {
        try
        {
            await base.ReplaceEventAsync(eventId, auditEvent);
        }
        catch (SqlException)
        {
            await FallbackProvider?.ReplaceEventAsync(eventId, auditEvent);
        }
    }
}

然后,您可以在FallbackProvider属性上设置后备数据提供程序,例如:

var dp = new FallbackSqlDataProvider()
{
    ConnectionString = "cnnstring",
    TableName = "table",
    IdColumnName = "id",
    JsonColumnName = "data",

    FallbackProvider = new Log4netDataProvider()
    {
        Logger = LogManager.GetLogger(typeof(Log4netDataProvider)),
        LogMessageBuilder = (ev, id) => ev.ToJson()
    }
};

Audit.Core.Configuration.Setup()
    .UseCustomProvider(dp);

也请选中此related issue