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