From 986e70bfe5a1b1e037d63b44189b44cc6e384aad Mon Sep 17 00:00:00 2001 From: "jozsef.b@aycode.com" <9Rj@D}fVwBaN> Date: Sat, 18 May 2024 05:12:23 +0200 Subject: [PATCH] refactroing, improvements, fixes, etc... --- AyCode.Core.sln | 6 ++-- AyCode.Core/Loggers/AcConsoleLogWriter.cs | 21 ++++++++++--- AyCode.Core/Loggers/AcLogWriterBase.cs | 4 +++ AyCode.Core/Loggers/AcLoggerBase.cs | 6 ++++ AyCode.Core/Loggers/AcTextLogWriterBase.cs | 28 ++++++++++++----- .../Loggers}/IAcLogItemClient.cs | 6 ++-- AyCode.Core/Loggers/IAcLogWriterBase.cs | 1 + .../AyCode.Database.Tests.csproj | 2 +- AyCode.Database/AcDbLogItemWriter.cs | 4 ++- AyCode.Database/AyCode.Database.csproj | 8 ++--- AyCode.Database/DataLayers/AcDalBase.cs | 4 +++ AyCode.Database/DataLayers/IAcDalBase.cs | 5 +++ .../Loggers/AcLoggerDbContextBase.cs | 9 +++++- .../Loggers/IAcLoggerDbContextBase.cs | 1 - .../DbSets/Loggers/IAcLogItemDbSetBase.cs | 3 +- AyCode.Database/Extensions/AcDalExtension.cs | 28 +++++++++++------ AyCode.Entities.Server/LogItems/AcLogItem.cs | 8 ++--- AyCode.Entities.Server/LogItems/IAcLogItem.cs | 2 -- AyCode.Entities/AcLogItemWriterBase.cs | 22 ++++++++----- AyCode.Entities/LogItems/AcLogItemClient.cs | 27 +++++++++++----- .../AyCode.Services.Server.Tests.csproj | 2 +- .../AyCode.Services.Server.csproj | 2 +- AyCode.Services/AyCode.Services.csproj | 2 +- .../Loggers/AcHttpClientLogItemWriter.cs | 31 ++++++++++++------- .../Loggers/IAcLogWriterClientBase.cs | 6 ++++ AyCode.Utils/AyCode.Utils.csproj | 2 +- 26 files changed, 163 insertions(+), 77 deletions(-) rename {AyCode.Entities/LogItems => AyCode.Core/Loggers}/IAcLogItemClient.cs (80%) create mode 100644 AyCode.Services/Loggers/IAcLogWriterClientBase.cs diff --git a/AyCode.Core.sln b/AyCode.Core.sln index 333ad5d..7edeef5 100644 --- a/AyCode.Core.sln +++ b/AyCode.Core.sln @@ -35,9 +35,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AyCode.Services.Server", "A EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AyCode.Services.Server.Tests", "AyCode.Services.Server.Tests\AyCode.Services.Server.Tests.csproj", "{9AC9AF60-280A-4871-A7FA-69AB4D0C858A}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AyCode.Core.Tests.Internal", "AyCode.Core.Tests.Internal\AyCode.Core.Tests.Internal.csproj", "{DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AyCode.Core.Tests.Internal", "AyCode.Core.Tests.Internal\AyCode.Core.Tests.Internal.csproj", "{DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AyCode.Database.Tests.Internal", "AyCode.Database.Tests.Internal\AyCode.Database.Tests.Internal.csproj", "{73261A8C-FB41-4C4C-90D4-ED5EEC991413}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AyCode.Database.Tests.Internal", "AyCode.Database.Tests.Internal\AyCode.Database.Tests.Internal.csproj", "{73261A8C-FB41-4C4C-90D4-ED5EEC991413}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -109,11 +109,9 @@ Global {DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}.Debug|Any CPU.Build.0 = Debug|Any CPU {DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DE2DD6A4-A906-4BA6-8AAA-2A0433DF523F}.Release|Any CPU.Build.0 = Release|Any CPU {73261A8C-FB41-4C4C-90D4-ED5EEC991413}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73261A8C-FB41-4C4C-90D4-ED5EEC991413}.Debug|Any CPU.Build.0 = Debug|Any CPU {73261A8C-FB41-4C4C-90D4-ED5EEC991413}.Release|Any CPU.ActiveCfg = Release|Any CPU - {73261A8C-FB41-4C4C-90D4-ED5EEC991413}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/AyCode.Core/Loggers/AcConsoleLogWriter.cs b/AyCode.Core/Loggers/AcConsoleLogWriter.cs index 0ef779a..664aa46 100644 --- a/AyCode.Core/Loggers/AcConsoleLogWriter.cs +++ b/AyCode.Core/Loggers/AcConsoleLogWriter.cs @@ -10,13 +10,24 @@ public interface IAcConsoleLogWriter : IAcTextLogWriterBase public class AcConsoleLogWriter : AcTextLogWriterBase, IAcConsoleLogWriter { protected AcConsoleLogWriter() : this(null) - { } + { + Initialize(); + } protected AcConsoleLogWriter(string? categoryName = null) : base(categoryName) - { } + { + Initialize(); + } public AcConsoleLogWriter(AppType appType, LogLevel logLevel, string? categoryName = null) : base(appType, logLevel, categoryName) - { } + { + Initialize(); + } + + private static void Initialize() + { + Console.ForegroundColor = ConsoleColor.White; + } protected override void WriteText(string? logText) { @@ -24,10 +35,10 @@ public class AcConsoleLogWriter : AcTextLogWriterBase, IAcConsoleLogWriter //lock (ForWriterLock) { - //if (logLevel > LogLevel.Trace && logLevel < LogLevel.Suggest) + if (LogLevel is > LogLevel.Trace and < LogLevel.Suggest) { Console.WriteLine(logText); - return; + //return; } if (LogLevel <= LogLevel.Trace) diff --git a/AyCode.Core/Loggers/AcLogWriterBase.cs b/AyCode.Core/Loggers/AcLogWriterBase.cs index 784d4ff..7fc60c7 100644 --- a/AyCode.Core/Loggers/AcLogWriterBase.cs +++ b/AyCode.Core/Loggers/AcLogWriterBase.cs @@ -84,4 +84,8 @@ public abstract class AcLogWriterBase : IAcLogWriterBase throw new NotImplementedException(); } + public virtual void Write(IAcLogItemClient logItem) + { + throw new NotImplementedException(); + } } \ No newline at end of file diff --git a/AyCode.Core/Loggers/AcLoggerBase.cs b/AyCode.Core/Loggers/AcLoggerBase.cs index 61ce540..e5418fd 100644 --- a/AyCode.Core/Loggers/AcLoggerBase.cs +++ b/AyCode.Core/Loggers/AcLoggerBase.cs @@ -1,4 +1,5 @@ using System.Runtime.CompilerServices; +using System.Security.AccessControl; using AyCode.Core.Consts; using AyCode.Core.Enums; using static System.Net.Mime.MediaTypeNames; @@ -109,4 +110,9 @@ public abstract class AcLoggerBase : IAcLoggerBase { if (LogLevel <= logLevel) LogWriters.ForEach(x => x.Write(appType, logLevel, logText, callerMemberName, categoryName ?? CategoryName, errorType, exMessage)); } + + public void Write(IAcLogItemClient logItem) + { + if (LogLevel <= logItem.LogLevel) LogWriters.ForEach(x => x.Write(logItem)); + } } \ No newline at end of file diff --git a/AyCode.Core/Loggers/AcTextLogWriterBase.cs b/AyCode.Core/Loggers/AcTextLogWriterBase.cs index 1e6adac..5481949 100644 --- a/AyCode.Core/Loggers/AcTextLogWriterBase.cs +++ b/AyCode.Core/Loggers/AcTextLogWriterBase.cs @@ -1,4 +1,5 @@ -using AyCode.Core.Enums; +using AyCode.Core.Consts; +using AyCode.Core.Enums; using AyCode.Utils.Extensions; namespace AyCode.Core.Loggers; @@ -25,26 +26,37 @@ public abstract class AcTextLogWriterBase : AcLogWriterBase, IAcTextLogWriterBas } + public override void Write(IAcLogItemClient logItem) + { + if (logItem.LogLevel < LogLevel) return; + + WriteText(GetDiagnosticText(logItem)); + } + protected virtual void WriteText(string? logText) { throw new NotImplementedException(); } - protected virtual string GetDiagnosticText(LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName = null, Exception? ex = null) + protected string GetDiagnosticText(IAcLogItemClient logItem) + => GetDiagnosticText(logItem.TimeStampUtc, logItem.AppType, logItem.LogLevel, logItem.ThreadId, logItem.Text, logItem.CallerName, logItem.CategoryName, logItem.ErrorType, logItem.Exception); + + protected string GetDiagnosticText(LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName = null, Exception? ex = null) => GetDiagnosticText(AppType, logLevel, logText, callerMemberName, categoryName, ex?.GetType().Name, ex?.ToString()); - protected virtual string GetDiagnosticText(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) + protected string GetDiagnosticText(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) + => GetDiagnosticText(DateTime.UtcNow, appType, logLevel, Environment.CurrentManagedThreadId, logText, callerMemberName, categoryName, errorType, exMessage); + + protected string GetDiagnosticText(DateTime utcNow, AppType appType, LogLevel logLevel, int threadId, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) { if (LogLevel > logLevel) return string.Empty; - var threadId = Environment.CurrentManagedThreadId; - if(categoryName.IsNullOrWhiteSpace()) categoryName = CategoryName; - return $"[{DateTime.Now:HH:mm:ss.fff}] [{appType.ToString()[0]}] {"[" + logLevel + "]",-9} {"[" + categoryName + "->" + callerMemberName + "]",-54} {"[" + threadId + "]",5} {logText}{ErrorText(errorType, exMessage)}"; + return $"[{utcNow.ToLocalTime():HH:mm:ss.fff}] [{appType.ToString()[0]}] {"[" + logLevel + "]",-9} {"[" + categoryName + "->" + callerMemberName + "]",-54} {"[" + threadId + "]",5} {logText}{ErrorText(errorType, exMessage)}"; } - protected virtual string ErrorText(Exception? ex) + protected string ErrorText(Exception? ex) { return ex == null ? string.Empty : ErrorText(ex.GetType().Name, ex.ToString()); } @@ -53,6 +65,6 @@ public abstract class AcTextLogWriterBase : AcLogWriterBase, IAcTextLogWriterBas { if (errorType.IsNullOrWhiteSpace() && exMessage.IsNullOrWhiteSpace()) return string.Empty; - return string.IsNullOrWhiteSpace(errorType) ? string.Empty : $"{Environment.NewLine}[{errorType.ToUpper()}]: {exMessage}"; + return string.IsNullOrWhiteSpace(errorType) ? string.Empty : $"{AcEnv.NL}[{errorType.ToUpper()}]: {exMessage}"; } } \ No newline at end of file diff --git a/AyCode.Entities/LogItems/IAcLogItemClient.cs b/AyCode.Core/Loggers/IAcLogItemClient.cs similarity index 80% rename from AyCode.Entities/LogItems/IAcLogItemClient.cs rename to AyCode.Core/Loggers/IAcLogItemClient.cs index 3d6f59d..89271a6 100644 --- a/AyCode.Entities/LogItems/IAcLogItemClient.cs +++ b/AyCode.Core/Loggers/IAcLogItemClient.cs @@ -1,11 +1,11 @@ using AyCode.Core.Enums; -using AyCode.Core.Loggers; -using AyCode.Interfaces.Entities; -namespace AyCode.Entities.LogItems; +namespace AyCode.Core.Loggers; public interface IAcLogItemClient { + public DateTime TimeStampUtc { get; set; } + public AppType AppType { get; set; } public LogLevel LogLevel { get; set; } public int ThreadId { get; set; } diff --git a/AyCode.Core/Loggers/IAcLogWriterBase.cs b/AyCode.Core/Loggers/IAcLogWriterBase.cs index a0c5c4a..1e31cb0 100644 --- a/AyCode.Core/Loggers/IAcLogWriterBase.cs +++ b/AyCode.Core/Loggers/IAcLogWriterBase.cs @@ -29,4 +29,5 @@ public interface IAcLogWriterBase public void Write(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, Exception? ex); public void Write(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage); + public void Write(IAcLogItemClient logItem); } \ No newline at end of file diff --git a/AyCode.Database.Tests/AyCode.Database.Tests.csproj b/AyCode.Database.Tests/AyCode.Database.Tests.csproj index 1e52b26..44886bc 100644 --- a/AyCode.Database.Tests/AyCode.Database.Tests.csproj +++ b/AyCode.Database.Tests/AyCode.Database.Tests.csproj @@ -10,7 +10,7 @@ - + diff --git a/AyCode.Database/AcDbLogItemWriter.cs b/AyCode.Database/AcDbLogItemWriter.cs index d3b7ab6..6a501bc 100644 --- a/AyCode.Database/AcDbLogItemWriter.cs +++ b/AyCode.Database/AcDbLogItemWriter.cs @@ -4,9 +4,9 @@ using AyCode.Core.Helpers; using AyCode.Core.Loggers; using AyCode.Database.DbContexts.Loggers; using AyCode.Entities; -using AyCode.Entities.LogItems; using AyCode.Entities.Server.LogItems; using AyCode.Interfaces.Entities; +using Microsoft.EntityFrameworkCore; namespace AyCode.Database; @@ -26,6 +26,8 @@ public class AcDbLogItemWriter : AcLogItemWriterBase protected override void WriteLogItemCallback(TLogItem logItem) { + //using var ctx = Activator.CreateInstance(); + _ctx.LogItems.Add(logItem); _ctx.SaveChanges(); } diff --git a/AyCode.Database/AyCode.Database.csproj b/AyCode.Database/AyCode.Database.csproj index a3f8139..81932ad 100644 --- a/AyCode.Database/AyCode.Database.csproj +++ b/AyCode.Database/AyCode.Database.csproj @@ -7,10 +7,10 @@ - - - - + + + + diff --git a/AyCode.Database/DataLayers/AcDalBase.cs b/AyCode.Database/DataLayers/AcDalBase.cs index 2d40532..45bc7e6 100644 --- a/AyCode.Database/DataLayers/AcDalBase.cs +++ b/AyCode.Database/DataLayers/AcDalBase.cs @@ -21,8 +21,12 @@ public abstract class AcDalBase : IAcDalBase where TDbCo public bool AutoCloseSession { get; set; } + /// + /// Do not use it! Use Session or Transaction... - J. + /// public TDbContext Context { get; private set; } + public Mutex MutextLock { get; } = new(); //protected AcDalBase() //{ // Name = $"{GetType().Name}"; diff --git a/AyCode.Database/DataLayers/IAcDalBase.cs b/AyCode.Database/DataLayers/IAcDalBase.cs index 8f8bf4f..9e16094 100644 --- a/AyCode.Database/DataLayers/IAcDalBase.cs +++ b/AyCode.Database/DataLayers/IAcDalBase.cs @@ -10,7 +10,12 @@ public interface IAcDalBase //: IDisposable public interface IAcDalBase : IAcDalBase where TDbContext : AcDbContextBase { public bool AutoCloseSession { get; set; } + + /// + /// Do not use it! Use Session or Transaction... - J. + /// public TDbContext Context { get; } + public Mutex MutextLock { get; } public TDbContext CreateDbContext(); public void CloseDbContext(ref TDbContext? ctx); diff --git a/AyCode.Database/DbContexts/Loggers/AcLoggerDbContextBase.cs b/AyCode.Database/DbContexts/Loggers/AcLoggerDbContextBase.cs index 26caf5c..f9c5708 100644 --- a/AyCode.Database/DbContexts/Loggers/AcLoggerDbContextBase.cs +++ b/AyCode.Database/DbContexts/Loggers/AcLoggerDbContextBase.cs @@ -1,12 +1,19 @@ using AyCode.Database.DbSets.Loggers; -using AyCode.Entities.LogItems; using AyCode.Entities.Server.LogItems; using AyCode.Interfaces.Entities; using Microsoft.EntityFrameworkCore; +using Microsoft.Identity.Client; namespace AyCode.Database.DbContexts.Loggers; public class AcLoggerDbContextBase : AcDbContextBase, IAcLoggerDbContextBase where TLogItem : class, IAcLogItem { public DbSet LogItems { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + base.OnConfiguring(optionsBuilder); + + optionsBuilder.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking); + } } \ No newline at end of file diff --git a/AyCode.Database/DbContexts/Loggers/IAcLoggerDbContextBase.cs b/AyCode.Database/DbContexts/Loggers/IAcLoggerDbContextBase.cs index 325ccdc..a6fc3ee 100644 --- a/AyCode.Database/DbContexts/Loggers/IAcLoggerDbContextBase.cs +++ b/AyCode.Database/DbContexts/Loggers/IAcLoggerDbContextBase.cs @@ -1,5 +1,4 @@ using AyCode.Database.DbSets.Loggers; -using AyCode.Entities.LogItems; using AyCode.Entities.Server.LogItems; using AyCode.Interfaces.Entities; diff --git a/AyCode.Database/DbSets/Loggers/IAcLogItemDbSetBase.cs b/AyCode.Database/DbSets/Loggers/IAcLogItemDbSetBase.cs index 75b5e9e..2ac3020 100644 --- a/AyCode.Database/DbSets/Loggers/IAcLogItemDbSetBase.cs +++ b/AyCode.Database/DbSets/Loggers/IAcLogItemDbSetBase.cs @@ -1,5 +1,4 @@ -using AyCode.Entities.LogItems; -using AyCode.Entities.Server.LogItems; +using AyCode.Entities.Server.LogItems; using AyCode.Interfaces.Entities; using AyCode.Interfaces.Users; using Microsoft.EntityFrameworkCore; diff --git a/AyCode.Database/Extensions/AcDalExtension.cs b/AyCode.Database/Extensions/AcDalExtension.cs index f5bd1ec..50f7974 100644 --- a/AyCode.Database/Extensions/AcDalExtension.cs +++ b/AyCode.Database/Extensions/AcDalExtension.cs @@ -2,6 +2,7 @@ using AyCode.Database.DataLayers; using AyCode.Database.DbContexts; using AyCode.Interfaces.Entities; +using AyCode.Utils.Extensions; namespace AyCode.Database.Extensions; @@ -15,16 +16,22 @@ public static class AcDalExtension public static TResultType Session(this IAcDalBase acDal, Func callback) where TDbContext : AcDbContextBase { - using var ctx = acDal.CreateDbContext(); - - return ctx.Session(callback); + //using var ctx = acDal.CreateDbContext(); + + using (acDal.MutextLock.UseWaitOne()) + { + return acDal.Context.Session(callback); + } } public static IEnumerable Session(this IAcDalBase acDal, Func> callback) where TEntity : IEntity where TDbContext : AcDbContextBase { - using var ctx = acDal.CreateDbContext(); - - return ctx.Session(callback); + //using var ctx = acDal.CreateDbContext(); + + using (acDal.MutextLock.UseWaitOne()) + { + return acDal.Context.Session(callback); + } } public static Task TransactionAsync(this IAcDalBase acDal, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase @@ -32,8 +39,11 @@ public static class AcDalExtension public static bool Transaction(this IAcDalBase acDal, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase { - using var ctx = acDal.CreateDbContext(); - - return ctx.Transaction(callbackTransactionBody, throwException); + //using var ctx = acDal.CreateDbContext(); + + using (acDal.MutextLock.UseWaitOne()) + { + return acDal.Context.Transaction(callbackTransactionBody, throwException); + } } } \ No newline at end of file diff --git a/AyCode.Entities.Server/LogItems/AcLogItem.cs b/AyCode.Entities.Server/LogItems/AcLogItem.cs index 71363f9..6aa0d20 100644 --- a/AyCode.Entities.Server/LogItems/AcLogItem.cs +++ b/AyCode.Entities.Server/LogItems/AcLogItem.cs @@ -2,7 +2,6 @@ using System.ComponentModel.DataAnnotations.Schema; using AyCode.Core.Enums; using AyCode.Core.Loggers; -using AyCode.Entities.LogItems; namespace AyCode.Entities.Server.LogItems; @@ -13,10 +12,7 @@ public class AcLogItem : AcLogItemClient, IAcLogItem public int Id { get; set; } public int LogHeaderId { get; set; } - public DateTime TimeStampUtc { get; set; } - public AcLogItem() - { - TimeStampUtc = DateTime.UtcNow; - } + public AcLogItem() : base() + { } } \ No newline at end of file diff --git a/AyCode.Entities.Server/LogItems/IAcLogItem.cs b/AyCode.Entities.Server/LogItems/IAcLogItem.cs index 556665d..e4f74d1 100644 --- a/AyCode.Entities.Server/LogItems/IAcLogItem.cs +++ b/AyCode.Entities.Server/LogItems/IAcLogItem.cs @@ -1,6 +1,5 @@ using AyCode.Core.Enums; using AyCode.Core.Loggers; -using AyCode.Entities.LogItems; using AyCode.Interfaces.Entities; namespace AyCode.Entities.Server.LogItems; @@ -8,5 +7,4 @@ namespace AyCode.Entities.Server.LogItems; public interface IAcLogItem : IAcLogItemClient, IEntityInt { public int LogHeaderId { get; set; } - public DateTime TimeStampUtc { get; set; } } \ No newline at end of file diff --git a/AyCode.Entities/AcLogItemWriterBase.cs b/AyCode.Entities/AcLogItemWriterBase.cs index 41c8879..fa5f359 100644 --- a/AyCode.Entities/AcLogItemWriterBase.cs +++ b/AyCode.Entities/AcLogItemWriterBase.cs @@ -1,7 +1,6 @@ using AyCode.Core.Enums; using AyCode.Core.Helpers; using AyCode.Core.Loggers; -using AyCode.Entities.LogItems; using AyCode.Interfaces.Entities; using AyCode.Utils.Extensions; using System.Collections.Concurrent; @@ -23,10 +22,11 @@ public abstract class AcLogItemWriterBase : AcLogWriterBase where TLog { } - protected virtual TLogItem CreateLogItem(AppType appType, int threadId, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName = null, string? errorType = null, string? exMessage = null) + protected virtual TLogItem CreateLogItem(DateTime utcNow, AppType appType, int threadId, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName = null, string? errorType = null, string? exMessage = null) { var logItem = Activator.CreateInstance(); - + + logItem.TimeStampUtc = utcNow; logItem.AppType = appType; logItem.LogLevel = logLevel; logItem.CategoryName = categoryName ?? CategoryName; @@ -40,21 +40,25 @@ public abstract class AcLogItemWriterBase : AcLogWriterBase where TLog return logItem; } + public override void Write(IAcLogItemClient logItem) + => WriteLogItemAsync(logItem as TLogItem); + public override void Write(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) => WriteAsync(appType, logLevel, logText, callerMemberName, categoryName, errorType, exMessage); - protected virtual void WriteAsync(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) + protected virtual void WriteAsync(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) { if (logLevel < LogLevel) return; + var utcNow = DateTime.UtcNow; var threadId = Environment.CurrentManagedThreadId; - TaskHelper.RunOnThreadPool(() => WriteLogItem(CreateLogItem(appType, threadId, logLevel, logText, callerMemberName, categoryName, errorType, exMessage))); + TaskHelper.RunOnThreadPool(() => WriteLogItem(CreateLogItem(utcNow, appType, threadId, logLevel, logText, callerMemberName, categoryName, errorType, exMessage))); } - public void WriteLogItemAsync(TLogItem logItem) + public void WriteLogItemAsync(TLogItem? logItem) { - if (logItem.LogLevel < LogLevel) return; + if (logItem == null || logItem.LogLevel < LogLevel) return; TaskHelper.RunOnThreadPool(() => WriteLogItem(logItem)); } @@ -72,7 +76,9 @@ public abstract class AcLogItemWriterBase : AcLogWriterBase where TLog } catch (Exception ex) { - Console.WriteLine("ERRORORROROR! " + AcEnv.NL + ex); + Console.WriteLine($@"ERROR!!! {nameof(AcLogItemWriterBase)}->WriteLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}"); + //Console.WriteLine("ERRORORROROR! " + AcEnv.NL + ex); + //throw; } } diff --git a/AyCode.Entities/LogItems/AcLogItemClient.cs b/AyCode.Entities/LogItems/AcLogItemClient.cs index 0cf693c..0ec1c13 100644 --- a/AyCode.Entities/LogItems/AcLogItemClient.cs +++ b/AyCode.Entities/LogItems/AcLogItemClient.cs @@ -1,19 +1,32 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -using AyCode.Core.Enums; -using AyCode.Core.Interfaces; -using AyCode.Core.Loggers; +using AyCode.Core.Enums; -namespace AyCode.Entities.LogItems; +namespace AyCode.Core.Loggers; public class AcLogItemClient : IAcLogItemClient { + public DateTime TimeStampUtc { get; set; } + public AppType AppType { get; set; } public LogLevel LogLevel { get; set; } - public int ThreadId { get; set; } + public int ThreadId { get; set; } = Environment.CurrentManagedThreadId; public string? CategoryName { get; set; } public string? CallerName { get; set; } public string? Text { get; set; } public string? ErrorType { get; set; } public string? Exception { get; set; } + + public override string? ToString() => Text ?? base.ToString(); + + //public string ErrorText() => string.IsNullOrWhiteSpace(ErrorType) ? string.Empty : $"{AcEnv.NL}[{ErrorType.ToUpper()}]: {Exception}"; + + //public string ToMinimalText() => $"{"[" + CategoryName + "->" + CallerName + "]"} - {"[" + ThreadId + "]", 5} {Text}{ErrorText()}"; + + //public string ToNormalText() + // => $"{"[" + LogLevel + "]",-9} {"[" + CategoryName + "->" + CallerName + "]"} - {"[" + ThreadId + "]", 5} {Text}{ErrorText()}"; + + //public string ToDetailText() + // => $"[{TimeStampUtc.ToLocalTime():HH:mm:ss.fff}] {"[" + LogLevel + "]",-9} {"[" + CategoryName + "->" + CallerName + "]", -55} {"[" + ThreadId + "]", 5} {Text}{ErrorText()}"; + + //public string ToDiagnosticText() + // => $"[{TimeStampUtc.ToLocalTime():HH:mm:ss.fff}] [{AppType.ToString()[0]}] {"[" + LogLevel + "]",-9} {"[" + CategoryName + "->" + CallerName + "]", -54} {"[" + ThreadId + "]", 5} {Text}{ErrorText()}"; } \ No newline at end of file diff --git a/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj b/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj index b9c505d..fe4ca76 100644 --- a/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj +++ b/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj @@ -14,7 +14,7 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/AyCode.Services.Server/AyCode.Services.Server.csproj b/AyCode.Services.Server/AyCode.Services.Server.csproj index e3f5e15..efaa724 100644 --- a/AyCode.Services.Server/AyCode.Services.Server.csproj +++ b/AyCode.Services.Server/AyCode.Services.Server.csproj @@ -7,7 +7,7 @@ - + diff --git a/AyCode.Services/AyCode.Services.csproj b/AyCode.Services/AyCode.Services.csproj index 96f7971..070b8e8 100644 --- a/AyCode.Services/AyCode.Services.csproj +++ b/AyCode.Services/AyCode.Services.csproj @@ -7,7 +7,7 @@ - + diff --git a/AyCode.Services/Loggers/AcHttpClientLogItemWriter.cs b/AyCode.Services/Loggers/AcHttpClientLogItemWriter.cs index e0b14be..6c6ecce 100644 --- a/AyCode.Services/Loggers/AcHttpClientLogItemWriter.cs +++ b/AyCode.Services/Loggers/AcHttpClientLogItemWriter.cs @@ -1,35 +1,44 @@ using AyCode.Core.Enums; using AyCode.Core.Loggers; using AyCode.Entities; -using AyCode.Entities.LogItems; -using AyCode.Interfaces.Entities; -using static System.Net.WebRequestMethods; -using System; +using System.Net; namespace AyCode.Services.Loggers; -public abstract class AcHttpClientLogItemWriter : AcLogItemWriterBase where TLogItem : class, IAcLogItemClient +public abstract class AcHttpClientLogItemWriter : AcLogItemWriterBase, IAcLogWriterClientBase where TLogItem : class, IAcLogItemClient { protected HttpClient _httpClient; - protected readonly HttpClientHandler _httpClientHandler; + protected HttpClientHandler _httpClientHandler; protected AcHttpClientLogItemWriter(HttpClient httpClient) : base(AppType.Web, LogLevel.Detail) { - _httpClient = httpClient; + //_httpClient = httpClient; + + Initialize(httpClient.BaseAddress, httpClient.DefaultRequestVersion, httpClient.DefaultVersionPolicy); } protected AcHttpClientLogItemWriter(string? categoryName = null) : base(categoryName) { - _httpClientHandler = new HttpClientHandler(); - _httpClient = new HttpClient(_httpClientHandler, false); + Initialize(null, HttpVersion.Version20, HttpVersionPolicy.RequestVersionOrHigher); } protected AcHttpClientLogItemWriter(AppType appType, LogLevel logLevel, string? categoryName = null) : base(appType, logLevel, categoryName) { - _httpClientHandler = new HttpClientHandler(); - _httpClient = new HttpClient(_httpClientHandler, false); + Initialize(null, HttpVersion.Version20, HttpVersionPolicy.RequestVersionOrHigher); } + private void Initialize(Uri? baseAddress, Version defaultRequestVersion, HttpVersionPolicy defaultVersionPolicy) + { + _httpClientHandler = new HttpClientHandler(); + _httpClient = new HttpClient(_httpClientHandler, false); + + _httpClient.BaseAddress = baseAddress; + _httpClient.DefaultRequestVersion = defaultRequestVersion; + _httpClient.DefaultVersionPolicy = defaultVersionPolicy; + } + + public override void Write(AppType appType, LogLevel logLevel, string? logText, string? callerMemberName, string? categoryName, string? errorType, string? exMessage) + => WriteLogItem(CreateLogItem(DateTime.UtcNow, appType, Environment.CurrentManagedThreadId, logLevel, logText, callerMemberName, categoryName, errorType, exMessage)); //protected override void WriteLogItem(TLogItem logItem, Action? callback = null) //{ diff --git a/AyCode.Services/Loggers/IAcLogWriterClientBase.cs b/AyCode.Services/Loggers/IAcLogWriterClientBase.cs new file mode 100644 index 0000000..2ed1bfc --- /dev/null +++ b/AyCode.Services/Loggers/IAcLogWriterClientBase.cs @@ -0,0 +1,6 @@ +using AyCode.Core.Loggers; + +namespace AyCode.Services.Loggers; + +public interface IAcLogWriterClientBase : IAcLogWriterBase +{} \ No newline at end of file diff --git a/AyCode.Utils/AyCode.Utils.csproj b/AyCode.Utils/AyCode.Utils.csproj index 90a350c..b26949a 100644 --- a/AyCode.Utils/AyCode.Utils.csproj +++ b/AyCode.Utils/AyCode.Utils.csproj @@ -8,7 +8,7 @@ - +