AyCode.Core/AyCode.Entities/AcLogItemWriterBase.cs

120 lines
3.9 KiB
C#

using AyCode.Core.Enums;
using AyCode.Core.Helpers;
using AyCode.Core.Loggers;
using AyCode.Interfaces.Entities;
using AyCode.Utils.Extensions;
using System.Collections.Concurrent;
using AyCode.Core.Consts;
namespace AyCode.Entities;
public abstract class AcLogItemWriterBase<TLogItem> : AcLogWriterBase where TLogItem : class, IAcLogItemClient
{
protected readonly Mutex MutexLock = new();//new(false, "GLOBAL");
protected AcLogItemWriterBase() : this(null)
{ }
protected AcLogItemWriterBase(string? categoryName = null) : base(categoryName)
{ }
protected AcLogItemWriterBase(AppType appType, LogLevel logLevel, string? categoryName = null) : base(appType, logLevel, categoryName)
{
}
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<TLogItem>();
logItem.TimeStampUtc = utcNow;
logItem.AppType = appType;
logItem.LogLevel = logLevel;
logItem.CategoryName = categoryName ?? CategoryName;
logItem.CallerName = callerMemberName;
logItem.Text = logText;
logItem.ThreadId = threadId;
logItem.ErrorType = errorType;
logItem.Exception = exMessage;
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)
{
if (logLevel < LogLevel) return;
var utcNow = DateTime.UtcNow;
var threadId = Environment.CurrentManagedThreadId;
TaskHelper.RunOnThreadPool(() => WriteLogItem(CreateLogItem(utcNow, appType, threadId, logLevel, logText, callerMemberName, categoryName, errorType, exMessage)));
}
public void WriteLogItemAsync(TLogItem? logItem)
{
if (logItem == null || logItem.LogLevel < LogLevel) return;
TaskHelper.RunOnThreadPool(() => WriteLogItem(logItem));
}
public void WriteLogItem(TLogItem logItem)
{
try
{
if (logItem.LogLevel < LogLevel) return;
using (MutexLock.UseWaitOne())
{
WriteLogItemCallback(logItem);
}
}
catch (Exception ex)
{
Console.WriteLine($@"ERROR!!! {nameof(AcLogItemWriterBase<TLogItem>)}->WriteLogItem; ex: {ex.Message}{AcEnv.NL}{AcEnv.NL}{ex}");
//Console.WriteLine("ERRORORROROR! " + AcEnv.NL + ex);
//throw;
}
}
protected virtual void WriteLogItemCallback(TLogItem logItem)
{
throw new NotImplementedException();
}
//private volatile bool _isLocked = false;
//private readonly object _forLock = new();
//private readonly List<TLogItem> _logItemsCahce = new();
//private readonly List<TLogItem> _logItemsCahce2 = new();
//protected virtual void WriteLogItem(TLogItem logItem, Action<IEnumerable<TLogItem>>? callback = null)
//{
// lock (_forLock) _logItemsCahce.Add(logItem);
// if (_isLocked) return;
// using (MutexLock.UseWaitOne())
// {
// _isLocked = true;
// _logItemsCahce2.Clear();
// lock (_forLock)
// {
// _logItemsCahce2.AddRange(_logItemsCahce);
// _logItemsCahce.Clear();
// }
// callback?.Invoke(_logItemsCahce2);
// }
// _isLocked = false;
//}
}