using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using NPin.Framework.AuditLogging.Domain.Repositories; using Volo.Abp.Auditing; using Volo.Abp.DependencyInjection; using Volo.Abp.Uow; namespace NPin.Framework.AuditLogging.Domain; public class AuditingStore : IAuditingStore, ITransientDependency { public ILogger Logger { get; set; } protected IAuditLogRepository AuditLogRepository { get; } protected IUnitOfWorkManager UnitOfWorkManager { get; } protected AbpAuditingOptions Options { get; } protected IAuditLogInfoToAuditLogConverter Converter { get; } public AuditingStore(ILogger logger, IAuditLogRepository auditLogRepository, IUnitOfWorkManager unitOfWorkManager, IOptions options, IAuditLogInfoToAuditLogConverter converter) { Logger = logger; AuditLogRepository = auditLogRepository; UnitOfWorkManager = unitOfWorkManager; Options = options.Value; Converter = converter; } public virtual async Task SaveAsync(AuditLogInfo auditInfo) { if (!Options.HideErrors) { await SaveLogAsync(auditInfo); return; } try { await SaveLogAsync(auditInfo); } catch (Exception ex) { Logger.LogWarning($"无法保存审计日志: {Environment.NewLine}{auditInfo}"); Logger.LogException(ex, LogLevel.Error); } } protected virtual async Task SaveLogAsync(AuditLogInfo auditInfo) { var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; Logger.LogDebug($"NPin-请求日志:{JsonConvert.SerializeObject(auditInfo, Formatting.Indented, timeConverter)}"); using var uow = UnitOfWorkManager.Begin(true); await AuditLogRepository.InsertAsync(await Converter.ConvertAsync(auditInfo)); await uow.CompleteAsync(); } }