diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/HttpContextClientInfoProvider.cs b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs similarity index 81% rename from framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/HttpContextClientInfoProvider.cs rename to framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs index 0b1d661330..07fb8a3a23 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/Auditing/HttpContextClientInfoProvider.cs +++ b/framework/src/Volo.Abp.AspNetCore/Microsoft/AspNetCore/Auditing/HttpContextClientInfoProvider.cs @@ -1,9 +1,10 @@ using System; -using Castle.Core.Logging; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Auditing; -namespace Volo.Abp.AspNetCore.Mvc.Auditing +namespace Microsoft.AspNetCore.Auditing { public class HttpContextClientInfoProvider : IClientInfoProvider { @@ -13,7 +14,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing public string ComputerName => GetComputerName(); - public ILogger Logger { get; set; } + public ILogger Logger { get; set; } private readonly IHttpContextAccessor _httpContextAccessor; @@ -27,7 +28,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing _httpContextAccessor = httpContextAccessor; _httpContext = httpContextAccessor.HttpContext; - Logger = NullLogger.Instance; + Logger = NullLogger.Instance; } protected virtual string GetBrowserInfo() @@ -45,7 +46,7 @@ namespace Volo.Abp.AspNetCore.Mvc.Auditing } catch (Exception ex) { - Logger.Warn(ex.ToString()); + Logger.LogException(ex, LogLevel.Warning); } return null; diff --git a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj index 4094e08685..da63af44b6 100644 --- a/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj +++ b/framework/src/Volo.Abp.AspNetCore/Volo.Abp.AspNetCore.csproj @@ -14,6 +14,7 @@ + diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs new file mode 100644 index 0000000000..344e717cee --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditInfoContributionContext.cs @@ -0,0 +1,17 @@ +using System; + +namespace Volo.Abp.Auditing +{ + public class AuditInfoContributionContext : IAuditInfoContributionContext + { + public IServiceProvider ServiceProvider { get; } + + public AuditInfo AuditInfo { get; set; } + + public AuditInfoContributionContext(IServiceProvider serviceProvider, AuditInfo auditInfo) + { + ServiceProvider = serviceProvider; + AuditInfo = auditInfo; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs index 3f20cc5e7d..775c84bdb9 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingHelper.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; @@ -19,21 +20,20 @@ namespace Volo.Abp.Auditing protected ICurrentUser CurrentUser { get; } protected ICurrentTenant CurrentTenant { get; } protected IClock Clock { get; } - protected IAuditInfoProvider AuditInfoProvider; protected AuditingOptions Options; protected IAuditSerializer AuditSerializer; + protected IServiceProvider ServiceProvider; public AuditingHelper( - IAuditInfoProvider auditInfoProvider, IAuditSerializer auditSerializer, IOptions options, ICurrentUser currentUser, ICurrentTenant currentTenant, IClock clock, IAuditingStore auditingStore, - ILogger logger) + ILogger logger, + IServiceProvider serviceProvider) { - AuditInfoProvider = auditInfoProvider; Options = options.Value; AuditSerializer = auditSerializer; CurrentUser = currentUser; @@ -42,6 +42,7 @@ namespace Volo.Abp.Auditing AuditingStore = auditingStore; Logger = logger; + ServiceProvider = serviceProvider; } public virtual bool ShouldSaveAudit(MethodInfo methodInfo, bool defaultValue = false) @@ -109,18 +110,31 @@ namespace Volo.Abp.Auditing ExecutionTime = Clock.Now }; - try - { - AuditInfoProvider.Fill(auditInfo); - } - catch (Exception ex) - { - Logger.LogException(ex, LogLevel.Warning); - } + ExecuteContributors(auditInfo); return auditInfo; } + protected virtual void ExecuteContributors(AuditInfo auditInfo) + { + using (var scope = ServiceProvider.CreateScope()) + { + var context = new AuditInfoContributionContext(scope.ServiceProvider, auditInfo); + + foreach (var contributor in Options.Contributors) + { + try + { + contributor.Contribute(context); + } + catch (Exception ex) + { + Logger.LogException(ex, LogLevel.Warning); + } + } + } + } + public virtual void Save(AuditInfo auditInfo) { AuditingStore.Save(auditInfo); diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs index d778f2f597..e9e1aeb9d8 100644 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/AuditingOptions.cs @@ -11,6 +11,8 @@ namespace Volo.Abp.Auditing public bool IsEnabledForAnonymousUsers { get; set; } + public List Contributors { get; } + public List IgnoredTypes { get; } public AuditingOptions() @@ -18,6 +20,11 @@ namespace Volo.Abp.Auditing IsEnabled = true; IsEnabledForAnonymousUsers = true; + Contributors = new List + { + new ClientInfoAuditInfoContributor() + }; + IgnoredTypes = new List { typeof(Stream), diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs new file mode 100644 index 0000000000..158b04618f --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/ClientInfoAuditInfoContributor.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.Auditing +{ + public class ClientInfoAuditInfoContributor : IAuditInfoContributor + { + public Task Contribute(IAuditInfoContributionContext context) + { + var clientInfoProvider = context.ServiceProvider.GetRequiredService(); + + if (context.AuditInfo.ClientIpAddress.IsNullOrEmpty()) + { + context.AuditInfo.ClientIpAddress = clientInfoProvider.ClientIpAddress; + } + + if (context.AuditInfo.BrowserInfo.IsNullOrEmpty()) + { + context.AuditInfo.BrowserInfo = clientInfoProvider.BrowserInfo; + } + + if (context.AuditInfo.ClientName.IsNullOrEmpty()) + { + context.AuditInfo.ClientName = clientInfoProvider.ComputerName; + } + + return Task.CompletedTask; + } + } +} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs deleted file mode 100644 index ece89c98a5..0000000000 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/DefaultAuditInfoProvider.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.Auditing -{ - //TODO: Implement as multiple providers can contribute! - - /// - /// Default implementation of . - /// - public class DefaultAuditInfoProvider : IAuditInfoProvider, ITransientDependency - { - protected IClientInfoProvider ClientInfoProvider { get; } - - public DefaultAuditInfoProvider(IClientInfoProvider clientInfoProvider) - { - ClientInfoProvider = clientInfoProvider; - } - - public virtual void Fill(AuditInfo auditInfo) - { - if (auditInfo.ClientIpAddress.IsNullOrEmpty()) - { - auditInfo.ClientIpAddress = ClientInfoProvider.ClientIpAddress; - } - - if (auditInfo.BrowserInfo.IsNullOrEmpty()) - { - auditInfo.BrowserInfo = ClientInfoProvider.BrowserInfo; - } - - if (auditInfo.ClientName.IsNullOrEmpty()) - { - auditInfo.ClientName = ClientInfoProvider.ComputerName; - } - } - } -} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs new file mode 100644 index 0000000000..d562e57417 --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributionContext.cs @@ -0,0 +1,9 @@ +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.Auditing +{ + public interface IAuditInfoContributionContext : IServiceProviderAccessor + { + AuditInfo AuditInfo { get; set; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs new file mode 100644 index 0000000000..19299522ea --- /dev/null +++ b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoContributor.cs @@ -0,0 +1,9 @@ +using System.Threading.Tasks; + +namespace Volo.Abp.Auditing +{ + public interface IAuditInfoContributor + { + Task Contribute(IAuditInfoContributionContext context); + } +} diff --git a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs b/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs deleted file mode 100644 index d3dcb2bf90..0000000000 --- a/framework/src/Volo.Abp.Auditing/Volo/Abp/Auditing/IAuditInfoProvider.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace Volo.Abp.Auditing -{ - /// - /// Provides an interface to provide audit informations in the upper layers. - /// - public interface IAuditInfoProvider - { - /// - /// Called to fill needed properties. - /// - /// Audit info that is partially filled - void Fill(AuditInfo auditInfo); - } -} \ No newline at end of file