Audit.Net: процесс сохранения в разных провайдерах - PullRequest
1 голос
/ 14 июня 2019

Можно ли установить какой-либо механизм, чтобы в случае сбоя вставки аудита в поставщике данных по умолчанию, например, в Oracle, был использован другой поставщик данных, например, в файле? Спасибо за помощь

1 Ответ

1 голос
/ 15 июня 2019

Не существует провайдера данных с возможностью автоматического восстановления, но вы можете реализовать пользовательский провайдер данных .

Скажем, вам нужен поставщик данных 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);

Также проверьте эту связанную проблему .

...