Added test program

This commit is contained in:
2023-07-12 18:19:28 +02:00
parent 1742537612
commit 4627e103fe
13 changed files with 351 additions and 306 deletions

View File

@@ -1,21 +1,19 @@
using EonaCat.Logger.Exceptions;
using EonaCat.Logger.Syslog;
using EonaCat.Logger.Syslog;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.CompilerServices;
using System.Threading;
using System.Threading.Tasks;
using EonaCat.Logger.EonaCatCoreLogger;
using EonaCat.Logger.EonaCatCoreLogger.Extensions;
using EonaCat.Logger.EonaCatCoreLogger.Models;
using EonaCat.Logger.Extensions;
namespace EonaCat.Logger.Managers
{
// This file is part of the EonaCat project(s) which is released under the Apache License.
// See the LICENSE file or go to https://EonaCat.com/License for full license details.
public partial class LogManager : ILogManager, IDisposable
{
private DateTime _logDate;
@@ -25,47 +23,41 @@ namespace EonaCat.Logger.Managers
public string CurrentLogFile => LoggerProvider is FileLoggerProvider fileLoggerProvider ? fileLoggerProvider.LogFile : string.Empty;
public bool IsRunning { get; private set; }
public string CategoryName { get; set; }
public string Id { get; }
private bool _disposed;
private static LogManager _instance;
private LoggerSettings _settings;
private readonly CancellationTokenSource _tokenSource = new CancellationTokenSource();
public static LogManager Instance => InstanceInit();
public LoggerSettings Settings
{
get
{
_settings ??= new LoggerSettings();
return _settings;
}
set => _settings = value;
}
public LoggerSettings Settings { get; } = CreateDefaultSettings();
private static LogManager InstanceInit()
{
_instance ??= new LogManager(null, id: "EonaCat");
if (_instance == null)
{
_instance = new LogManager(CreateDefaultSettings());
}
return _instance;
}
protected virtual void Dispose(bool disposing)
private static LoggerSettings CreateDefaultSettings()
{
if (_disposed)
return;
if (disposing)
{
StopLogging();
_tokenSource.Cancel();
}
_disposed = true;
var settings = new LoggerSettings();
settings.Id = "EonaCatLogger";
settings.MaxLogType = ELogType.TRACE;
return settings;
}
private void StartNewLog()
protected virtual async Task DisposeAsync(bool disposing)
{
if (disposing)
{
await StopLoggingAsync().ConfigureAwait(false);
}
}
public async Task StartNewLogAsync()
{
if (_tokenSource.IsCancellationRequested)
return;
@@ -73,10 +65,19 @@ namespace EonaCat.Logger.Managers
DateTime now = DateTime.UtcNow;
if (IsRunning && now.Date > _logDate.Date)
StopLogging();
await StopLoggingAsync().ConfigureAwait(false);
IsRunning = true;
CreateLogger();
Directory.CreateDirectory(Settings.FileLoggerOptions.LogDirectory);
_logDate = now;
}
private void CreateLogger()
{
IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder.AddEonaCatFileLogger(configuration =>
{
@@ -95,55 +96,40 @@ namespace EonaCat.Logger.Managers
var serviceProvider = serviceCollection.BuildServiceProvider();
LoggerProvider = serviceProvider.GetService<ILoggerProvider>();
LoggerFactory = serviceProvider.GetService<ILoggerFactory>();
CategoryName ??= string.Empty;
Logger = LoggerFactory.CreateLogger(CategoryName);
Directory.CreateDirectory(Settings.FileLoggerOptions.LogDirectory);
_logDate = now;
Write(now, $"{DllInfo.ApplicationName} started.");
Logger = LoggerFactory.CreateLogger(Settings.Id);
}
public void Assert(bool condition, string message)
private void InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null)
{
if (!condition)
throw new EonaCatLoggerAssertionException(message);
}
private void Write(DateTime dateTime, string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null)
{
if (string.IsNullOrEmpty(message) || logType < ELogType.INFO)
if (string.IsNullOrEmpty(message) || logType == ELogType.NONE || (int)logType >= (int)Settings.MaxLogType)
return;
string currentMessage = message.Length > _settings.MaxMessageLength ? message.Substring(0, _settings.MaxMessageLength) : message;
string remainder = message.Length > _settings.MaxMessageLength ? message.Substring(_settings.MaxMessageLength) : "";
var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime);
var fullMessage = LogHelper.FormatMessageWithHeader(_settings, logType, currentMessage, dateTime);
writeToConsole ??= Settings.EnableConsole;
if (writeToConsole.Value)
{
LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
}
writeToConsole ??= _settings.EnableConsole;
LogHelper.SendConsole(_settings, logType, fullMessage, writeToConsole.Value);
LogHelper.SendFile(Logger, _settings, logType, fullMessage);
LogHelper.SendToSysLogServers(_settings, fullMessage);
Task.Run(() => { LogHelper.SendToFile(Logger, Settings, logType, message); });
if (!string.IsNullOrEmpty(remainder))
Write(dateTime, remainder, logType, writeToConsole);
Task.Run(() => { LogHelper.SendToSysLogServers(Settings, messageWithHeader); });
var logMessage = new EonaCatLogMessage
{
DateTime = dateTime,
Message = currentMessage,
Message = message,
LogType = logType,
Origin = string.IsNullOrWhiteSpace(Settings?.LogOrigin) ? "LogManager" : Settings.LogOrigin
Origin = string.IsNullOrWhiteSpace(Settings.LogOrigin) ? "LogManager" : Settings.LogOrigin
};
Settings?.OnLogEvent(logMessage);
Settings.OnLogEvent(logMessage);
}
public void Reset() => Settings?.ResetLogEvent();
public void Reset() => Settings.ResetLogEvent();
public LogManager(LoggerSettings settings, string serverIp, int serverPort, string id = "EonaCatLogger")
public LogManager(LoggerSettings settings, string serverIp, int serverPort)
{
if (string.IsNullOrEmpty(serverIp))
throw new ArgumentNullException(nameof(serverIp));
@@ -152,18 +138,16 @@ namespace EonaCat.Logger.Managers
throw new ArgumentException("Server port must be zero or greater.");
settings.SysLogServers = new List<SyslogServer>
{
new SyslogServer(serverIp, serverPort)
};
{
new SyslogServer(serverIp, serverPort)
};
Id = id;
Settings = settings;
SetupLogManager();
}
public LogManager(LoggerSettings settings, string id = "EonaCatLogger")
public LogManager(LoggerSettings settings)
{
Id = id;
Settings = settings;
SetupFileLogger(settings, null, true);
SetupLogManager();
@@ -193,25 +177,31 @@ namespace EonaCat.Logger.Managers
private void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e)
{
Dispose(true);
Dispose();
}
private void ProcessExit(object sender, EventArgs e)
{
Dispose(true);
Dispose();
}
private void StopLogging()
private Task StopLoggingAsync()
{
IsRunning = false;
Write(DateTime.UtcNow, $"{DllInfo.ApplicationName} stopped.");
Task.Delay(500, _tokenSource.Token);
InternalWriteAsync(DateTime.UtcNow, $"{DllInfo.ApplicationName} stopped.");
return Task.Delay(500);
}
public LogManager(string logFolder = null, bool defaultPrefix = true)
public void DeleteCurrentLogFile()
{
SetupFileLogger(null, logFolder, defaultPrefix);
SetupLogManager();
if (CurrentLogFile != null)
File.Delete(CurrentLogFile);
}
public void Dispose()
{
DisposeAsync(true).GetAwaiter().GetResult();
GC.SuppressFinalize(this);
}
public void Write(Exception exception, string module = null, string method = null, bool criticalException = false, bool? writeToConsole = null)
@@ -227,25 +217,12 @@ namespace EonaCat.Logger.Managers
if (logType == ELogType.NONE)
return;
DateTime now = DateTime.UtcNow;
var now = DateTime.UtcNow;
if (!IsRunning)
StartNewLog();
StartNewLogAsync().ConfigureAwait(false);
Write(now, message, logType, writeToConsole);
}
public void DeleteCurrentLogFile()
{
if (!string.IsNullOrWhiteSpace(CurrentLogFile))
File.Delete(CurrentLogFile);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
InternalWriteAsync(now, message, logType, writeToConsole);
}
}
}
}