From 38e036553e0ef8f4dca259247019367c19f8df27 Mon Sep 17 00:00:00 2001 From: Loretta Date: Tue, 21 Oct 2025 15:30:43 +0200 Subject: [PATCH] noplogger improvements, fixes, etc... --- Mango.Nop.Core/Loggers/NopLogWriter.cs | 113 ++++++++++++++++-- .../Repositories/MgDbContextBase.cs | 26 +++- 2 files changed, 126 insertions(+), 13 deletions(-) diff --git a/Mango.Nop.Core/Loggers/NopLogWriter.cs b/Mango.Nop.Core/Loggers/NopLogWriter.cs index 9d69ce9..28753fc 100644 --- a/Mango.Nop.Core/Loggers/NopLogWriter.cs +++ b/Mango.Nop.Core/Loggers/NopLogWriter.cs @@ -2,22 +2,94 @@ using AyCode.Entities; using AyCode.Entities.Server.LogItems; using AyCode.Utils.Extensions; +using LinqToDB; +using LinqToDB.Data; +using LinqToDB.DataProvider; +using LinqToDB.DataProvider.SqlServer; +using Mango.Nop.Core.Repositories; +using Nop.Core; +using Nop.Core.Domain.Common; +using Nop.Core.Domain.Customers; +using Nop.Core.Domain.Logging; +using Nop.Data; +using Nop.Data.DataProviders; +using System.Data.Common; +using System.Transactions; using LogLevel = AyCode.Core.Loggers.LogLevel; using LogLevelNop = Nop.Core.Domain.Logging.LogLevel; namespace Mango.Nop.Core.Loggers { + public interface INopLoggerMsSqlNopDataProvider + { + + } + + public class NopLoggerMsSqlNopDataProvider : MsSqlNopDataProvider, INopLoggerMsSqlNopDataProvider + { + //protected override IDataProvider LinqToDbDataProvider => SqlServerTools.GetDataProvider(SqlServerVersion.v2012, SqlServerProvider.MicrosoftDataSqlClient); + + //protected override DbConnection CreateDbConnection(string connectionString = null) + //{ + // connectionString = "Data Source=195.26.231.218;Initial Catalog=MangoManagement;Integrated Security=False;Persist Security Info=False;User ID=sa;Password=v6f_?xNfg9N1;Trust Server Certificate=True"; + // return base.GetInternalDbConnection(connectionString); + //} + + public void InsertLogItem(TEntity entity) where TEntity : notnull + { + using var transaction = CreateTransactionScope(TransactionScopeAsyncFlowOption.Suppress); + using var dataContext = CreateDataConnection(); + + dataContext.Insert(entity); + transaction.Complete(); + } + + public async Task InsertLogItemAsync(TEntity entity) where TEntity : notnull + { + using var transaction = CreateTransactionScope(TransactionScopeAsyncFlowOption.Enabled); + await using var dataContext = CreateDataConnection(); + + await dataContext.InsertAsync(entity); + transaction.Complete(); + } + + private static TransactionScope CreateTransactionScope(TransactionScopeAsyncFlowOption transactionScopeAsyncFlowOption) + { + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadUncommitted, + Timeout = TransactionManager.DefaultTimeout + }; + + return new TransactionScope(TransactionScopeOption.Suppress, transactionOptions, transactionScopeAsyncFlowOption); + } + } + public class NopLogWriter : AcLogItemWriterBase//AcTextLogWriterBase { - private static readonly SemaphoreSlim LockSlim = new(0); + private readonly SemaphoreSlim _lockSlim = new(0); + + private NopLoggerMsSqlNopDataProvider _dataProvider; private readonly global::Nop.Services.Logging.ILogger _nopLogger; - public NopLogWriter(global::Nop.Services.Logging.ILogger nopLogger) : this(nopLogger, null) + protected readonly CommonSettings _commonSettings; + protected readonly CustomerSettings _customerSettings; + + protected readonly IWebHelper _webHelper; + + public NopLogWriter(INopLoggerMsSqlNopDataProvider nopLoggerMsSqlNopDataProvider, CommonSettings commonSettings, CustomerSettings customerSettings, IWebHelper webHelper, + global::Nop.Services.Logging.ILogger nopLogger) : this(nopLoggerMsSqlNopDataProvider, commonSettings, customerSettings, webHelper,nopLogger, null) { } - public NopLogWriter(global::Nop.Services.Logging.ILogger nopLogger, string? categoryName = null) : base(categoryName) + public NopLogWriter(INopLoggerMsSqlNopDataProvider nopLoggerMsSqlNopDataProvider, + CommonSettings commonSettings, CustomerSettings customerSettings, IWebHelper webHelper, global::Nop.Services.Logging.ILogger nopLogger, string? categoryName = null) : base(categoryName) { _nopLogger = nopLogger; + _dataProvider = (NopLoggerMsSqlNopDataProvider)nopLoggerMsSqlNopDataProvider; + + _commonSettings = commonSettings; + _customerSettings = customerSettings; + _webHelper = webHelper; } //public NopLogWriter(ILogger nopLogger, AppType appType, LogLevel logLevel, string? categoryName = null) : base(appType, logLevel, categoryName) @@ -27,26 +99,26 @@ namespace Mango.Nop.Core.Loggers protected override void WriteLogItemCallback(AcLogItem logItem) { - using (LockSlim.UseWait()) + //using (_lockSlim.UseWait()) { switch (logItem.LogLevel) { case LogLevel.Detail: case LogLevel.Trace: case LogLevel.Debug: - if (_nopLogger.IsEnabled(LogLevelNop.Debug)) _nopLogger.InsertLog(LogLevelNop.Debug, logItem.Text, logItem.Exception, null); + if (_nopLogger.IsEnabled(LogLevelNop.Debug)) InsertLog(LogLevelNop.Debug, logItem.Text, logItem.Exception, null); break; case LogLevel.Info: - if (_nopLogger.IsEnabled(LogLevelNop.Information)) _nopLogger.InsertLog(LogLevelNop.Information, logItem.Text, logItem.Exception, null); + if (_nopLogger.IsEnabled(LogLevelNop.Information)) InsertLog(LogLevelNop.Information, logItem.Text, logItem.Exception, null); //_nopLogger.Information(logItem.Text); //.Forget(); break; case LogLevel.Suggest: case LogLevel.Warning: - if (_nopLogger.IsEnabled(LogLevelNop.Warning)) _nopLogger.InsertLog(LogLevelNop.Warning, logItem.Text, logItem.Exception, null); + if (_nopLogger.IsEnabled(LogLevelNop.Warning)) InsertLog(LogLevelNop.Warning, logItem.Text, logItem.Exception, null); //_nopLogger.Warning(logItem.Text); //.Forget(); break; case LogLevel.Error: - if (_nopLogger.IsEnabled(LogLevelNop.Error)) _nopLogger.InsertLog(LogLevelNop.Error, logItem.Text, logItem.Exception, null); + if (_nopLogger.IsEnabled(LogLevelNop.Error)) InsertLog(LogLevelNop.Error, logItem.Text, logItem.Exception, null); //_nopLogger.Error(logItem.Text); //.Forget();//, logItem.Exception); break; case LogLevel.Disabled: @@ -56,5 +128,30 @@ namespace Mango.Nop.Core.Loggers } } } + + private void InsertLog(LogLevelNop logLevel, string shortMessage, string fullMessage = "", Customer customer = null) + { + //check ignore word/phrase list? + //if (IgnoreLog(shortMessage) || IgnoreLog(fullMessage)) + // return; + + _dataProvider.InsertLogItem(PrepareLog(logLevel, shortMessage, fullMessage, customer)); + //_dataProvider.InsertLogItemAsync(PrepareLog(logLevel, shortMessage, fullMessage, customer)).Forget(); + } + + private Log PrepareLog(LogLevelNop logLevel, string shortMessage, string fullMessage = "", Customer customer = null) + { + return new Log + { + LogLevel = logLevel, + ShortMessage = shortMessage, + FullMessage = fullMessage, + IpAddress = _customerSettings.StoreIpAddresses ? _webHelper.GetCurrentIpAddress() : string.Empty, + CustomerId = customer?.Id, + PageUrl = _webHelper.GetThisPageUrl(true), + ReferrerUrl = _webHelper.GetUrlReferrer(), + CreatedOnUtc = DateTime.UtcNow + }; + } } } diff --git a/Mango.Nop.Core/Repositories/MgDbContextBase.cs b/Mango.Nop.Core/Repositories/MgDbContextBase.cs index a38578d..a6701f8 100644 --- a/Mango.Nop.Core/Repositories/MgDbContextBase.cs +++ b/Mango.Nop.Core/Repositories/MgDbContextBase.cs @@ -33,6 +33,20 @@ public class MgDbContextBase : IMgDbContextBase DataProvider = dataProvider; } + private static TransactionScope CreateTransactionScope(TransactionScopeOption transactionScopeOption = TransactionScopeOption.Required) + { + //TransactionManager.ImplicitDistributedTransactions = true; + + var transactionOptions = new TransactionOptions + { + IsolationLevel = IsolationLevel.ReadCommitted, + Timeout = TransactionManager.DefaultTimeout + }; + + return new TransactionScope(transactionScopeOption, transactionOptions, TransactionScopeAsyncFlowOption.Enabled); + //return new TransactionScope(TransactionScopeOption.Required, TransactionScopeAsyncFlowOption.Enabled); + } + public bool Transaction(Func callbackTransactionBody, bool throwException = false) => TransactionInner(callbackTransactionBody, throwException); @@ -76,7 +90,7 @@ public class MgDbContextBase : IMgDbContextBase try { - using (var transaction = new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled)) + using (var transaction = CreateTransactionScope())// new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled)) { result = await callbackTransactionBody(transaction); @@ -102,12 +116,14 @@ public class MgDbContextBase : IMgDbContextBase try { - using var transaction = new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled); + using(var transaction = CreateTransactionScope()) //new TransactionScope( /*TransactionScopeOption.RequiresNew, */TransactionScopeAsyncFlowOption.Enabled) + { + result = callbackTransactionBody(transaction); - result = callbackTransactionBody(transaction); + if (result) transaction.Complete(); + } - if (result) transaction.Complete(); - else Logger.Warning($"TransactionInner({this}) transaction ROLLBACK!"); + if (!result) Logger.Warning($"TransactionInner({this}) transaction ROLLBACK!"); } catch (Exception ex) {