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,160 +1,98 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using EonaCat.Logger.Syslog;
using Microsoft.Extensions.Logging;
namespace EonaCat.Logger.Managers
{
public static class LogHelper
internal static class LogHelper
{
private static readonly object FileLock = new object();
internal static string FormatMessageWithHeader(LoggerSettings settings, ELogType logType, string currentMessage, DateTime dateTime)
{
if (string.IsNullOrWhiteSpace(currentMessage))
return currentMessage;
string header = settings?.HeaderFormat ?? "[EonaCatLogger]";
if (header.Contains("{ts}"))
header = header.Replace("{ts}", dateTime.ToString(settings?.TimestampFormat));
if (header.Contains("{host}"))
header = header.Replace("{host}", Dns.GetHostName());
if (header.Contains("{thread}"))
header = header.Replace("{thread}", Thread.CurrentThread.ManagedThreadId.ToString());
if (header.Contains("{sev}"))
header = header.Replace("{sev}", logType.ToString());
string fullMessage = AddHeaderIfNotExists(settings, header, currentMessage);
return fullMessage;
}
private static string AddHeaderIfNotExists(LoggerSettings settings, string header, string currentMessage)
{
if (settings == null || !settings.RemoveMessagePrefix)
{
if (!currentMessage.Contains("[EonaCatLogger]"))
return "[EonaCatLogger] " + header + " " + currentMessage;
}
return header + " " + currentMessage;
}
public static string FormatExceptionToMessage(this Exception exception, string module = null, string method = null)
{
if (exception == null)
return string.Empty;
var st = new StackTrace(exception, true);
var frame = st.GetFrame(0);
int fileLine = frame.GetFileLineNumber();
string filename = frame.GetFileName();
string message =
Environment.NewLine +
"--- Exception details provided by EonaCatLogger ---" + Environment.NewLine +
(!string.IsNullOrEmpty(module) ? " Module : " + module + Environment.NewLine : "") +
(!string.IsNullOrEmpty(method) ? " Method : " + method + Environment.NewLine : "") +
" Type : " + exception.GetType().ToString() + Environment.NewLine +
" Data : " + (exception.Data != null && exception.Data.Count > 0 ? Environment.NewLine + FormatExceptionData(exception.Data) : "(none)") + Environment.NewLine +
" Inner : " + (exception.InnerException != null ? FormatInnerException(exception.InnerException) : "(null)") + Environment.NewLine +
" Message : " + exception.Message + Environment.NewLine +
" Source : " + exception.Source + Environment.NewLine +
" StackTrace : " + exception.StackTrace + Environment.NewLine +
" Line : " + fileLine + Environment.NewLine +
" File : " + filename + Environment.NewLine +
" ToString : " + exception.ToString() + Environment.NewLine +
"---";
return message;
}
private static string FormatExceptionData(IDictionary data)
{
StringBuilder sb = new StringBuilder();
foreach (DictionaryEntry entry in data)
sb.Append(settings?.HeaderFormat ?? "[EonaCatLogger]");
if (settings != null)
{
sb.Append(" | ")
.Append(entry.Key)
.Append(": ")
.Append(entry.Value)
.Append(Environment.NewLine);
if (sb.ToString().Contains("{ts}"))
sb.Replace("{ts}", dateTime.ToString(settings.TimestampFormat));
if (sb.ToString().Contains("{host}"))
sb.Replace("{host}", $"[Host:{Dns.GetHostName()}]");
if (sb.ToString().Contains("{thread}"))
sb.Replace("{thread}", $"[ThreadId:{Environment.CurrentManagedThreadId.ToString()}]");
if (sb.ToString().Contains("{sev}"))
sb.Replace("{sev}", $"[{logType.ToString()}]");
if (!settings.RemoveMessagePrefix && !currentMessage.Contains("[EonaCatLogger]"))
sb.Insert(0, "[EonaCatLogger] ");
}
sb.Append(" ");
sb.Append(currentMessage);
return sb.ToString();
}
private static string FormatInnerException(Exception innerException)
{
StringBuilder sb = new StringBuilder();
sb.AppendLine(innerException.GetType().ToString())
.AppendLine(" Message : " + innerException.Message)
.AppendLine(" Source : " + innerException.Source)
.AppendLine(" StackTrace : " + innerException.StackTrace)
.AppendLine(" ToString : " + innerException.ToString())
.Append(" Data : ")
.AppendLine(innerException.Data != null && innerException.Data.Count > 0 ? Environment.NewLine + FormatExceptionData(innerException.Data) : "(none)");
return sb.ToString();
}
internal static void SendConsole(LoggerSettings settings, ELogType logType, string message, bool writeToConsole)
internal static void SendToConsole(LoggerSettings settings, ELogType logType, string message, bool writeToConsole)
{
if (settings == null || !writeToConsole || string.IsNullOrWhiteSpace(message))
return;
if (settings.EnableColors)
if (settings.EnableColors && settings.Colors != null)
{
ConsoleColor prevForeground = Console.ForegroundColor;
ConsoleColor prevBackground = Console.BackgroundColor;
if (settings.Colors != null)
ConsoleColor foregroundColor;
ConsoleColor backgroundColor;
switch (logType)
{
switch (logType)
{
case ELogType.DEBUG:
Console.ForegroundColor = settings.Colors.Debug.Foreground;
Console.BackgroundColor = settings.Colors.Debug.Background;
break;
case ELogType.INFO:
Console.ForegroundColor = settings.Colors.Info.Foreground;
Console.BackgroundColor = settings.Colors.Info.Background;
break;
case ELogType.WARNING:
Console.ForegroundColor = settings.Colors.Warning.Foreground;
Console.BackgroundColor = settings.Colors.Warning.Background;
break;
case ELogType.ERROR:
Console.ForegroundColor = settings.Colors.Error.Foreground;
Console.BackgroundColor = settings.Colors.Error.Background;
break;
case ELogType.TRAFFIC:
Console.ForegroundColor = settings.Colors.Traffic.Foreground;
Console.BackgroundColor = settings.Colors.Traffic.Background;
break;
case ELogType.CRITICAL:
Console.ForegroundColor = settings.Colors.Critical.Foreground;
Console.BackgroundColor = settings.Colors.Critical.Background;
break;
case ELogType.TRACE:
Console.ForegroundColor = settings.Colors.Trace.Foreground;
Console.BackgroundColor = settings.Colors.Trace.Background;
break;
}
case ELogType.DEBUG:
foregroundColor = settings.Colors.Debug.Foreground;
backgroundColor = settings.Colors.Debug.Background;
break;
case ELogType.INFO:
foregroundColor = settings.Colors.Info.Foreground;
backgroundColor = settings.Colors.Info.Background;
break;
case ELogType.WARNING:
foregroundColor = settings.Colors.Warning.Foreground;
backgroundColor = settings.Colors.Warning.Background;
break;
case ELogType.ERROR:
foregroundColor = settings.Colors.Error.Foreground;
backgroundColor = settings.Colors.Error.Background;
break;
case ELogType.TRAFFIC:
foregroundColor = settings.Colors.Traffic.Foreground;
backgroundColor = settings.Colors.Traffic.Background;
break;
case ELogType.CRITICAL:
foregroundColor = settings.Colors.Critical.Foreground;
backgroundColor = settings.Colors.Critical.Background;
break;
case ELogType.TRACE:
foregroundColor = settings.Colors.Trace.Foreground;
backgroundColor = settings.Colors.Trace.Background;
break;
default:
return;
}
Console.ForegroundColor = foregroundColor;
Console.BackgroundColor = backgroundColor;
Console.WriteLine(message);
Console.ForegroundColor = prevForeground;
Console.BackgroundColor = prevBackground;
@@ -165,54 +103,20 @@ namespace EonaCat.Logger.Managers
}
}
internal static void SendFile(ILogger logger, LoggerSettings settings, ELogType logType, string message, int maxTries = 3)
internal static void SendToFile(ILogger logger, LoggerSettings settings, ELogType logType, string message)
{
lock (FileLock)
{
if (logger == null || settings == null || !settings.EnableFileLogging || string.IsNullOrWhiteSpace(message))
return;
if (logger == null || settings == null || !settings.EnableFileLogging || string.IsNullOrWhiteSpace(message))
return;
int tries = 0;
bool completed = false;
while (!completed)
{
try
{
switch (logType)
{
case ELogType.CRITICAL:
logger.LogCritical(message);
break;
case ELogType.DEBUG:
logger.LogDebug(message);
break;
case ELogType.ERROR:
logger.LogError(message);
break;
case ELogType.INFO:
logger.LogInformation(message);
break;
case ELogType.TRACE:
logger.LogTrace(message);
break;
case ELogType.TRAFFIC:
logger.LogTrace($"[TRAFFIC] {message}");
break;
case ELogType.WARNING:
logger.LogWarning(message);
break;
}
completed = true;
}
catch (Exception exc)
{
tries++;
Task.Delay(100);
if (tries >= maxTries)
throw;
}
}
}
LogLevel logLevel = logType.ToLogLevel();
if (logLevel >= settings.MaxLogType.ToLogLevel()) // Filter out log levels
Log(logger, logLevel, message);
}
private static void Log(ILogger logger, LogLevel logLevel, string message)
{
logger.Log(logLevel, message);
}
internal static void SendToSysLogServers(LoggerSettings settings, string message)
@@ -227,31 +131,31 @@ namespace EonaCat.Logger.Managers
byte[] data = Encoding.UTF8.GetBytes(message);
var sysLogServers = settings.SysLogServers.ToList();
foreach (SyslogServer server in sysLogServers)
foreach (SyslogServer server in settings.SysLogServers)
{
if (string.IsNullOrWhiteSpace(server.Hostname))
{
Console.WriteLine("Server hostname not specified, skipping syslog server");
continue;
}
if (server.Port < 0)
{
Console.WriteLine("Server port must be zero or greater, skipping syslog server");
continue;
}
lock (server.SendLock)
{
if (string.IsNullOrWhiteSpace(server.Hostname))
{
Console.WriteLine("Server hostname not specified, skipping syslog server");
}
if (server.Port < 0)
{
Console.WriteLine("Server port must be zero or greater, skipping syslog server");
}
try
{
server.Udp.Send(data, data.Length);
}
catch (Exception)
catch
{
// Do nothing
}
}
}
}
}
}
}