Updated
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
<TargetFrameworks>.netstandard2.1; net6.0; net7.0; net8.0; net4.8;</TargetFrameworks>
|
<TargetFrameworks>.netstandard2.1; net6.0; net7.0; net8.0; net4.8;</TargetFrameworks>
|
||||||
<ApplicationIcon>icon.ico</ApplicationIcon>
|
<ApplicationIcon>icon.ico</ApplicationIcon>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<FileVersion>1.3.3</FileVersion>
|
<FileVersion>1.3.4</FileVersion>
|
||||||
<Authors>EonaCat (Jeroen Saey)</Authors>
|
<Authors>EonaCat (Jeroen Saey)</Authors>
|
||||||
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
|
||||||
<Company>EonaCat (Jeroen Saey)</Company>
|
<Company>EonaCat (Jeroen Saey)</Company>
|
||||||
@@ -24,7 +24,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<EVRevisionFormat>1.3.3+{chash:10}.{c:ymd}</EVRevisionFormat>
|
<EVRevisionFormat>1.3.4+{chash:10}.{c:ymd}</EVRevisionFormat>
|
||||||
<EVDefault>true</EVDefault>
|
<EVDefault>true</EVDefault>
|
||||||
<EVInfo>true</EVInfo>
|
<EVInfo>true</EVInfo>
|
||||||
<EVTagMatch>v[0-9]*</EVTagMatch>
|
<EVTagMatch>v[0-9]*</EVTagMatch>
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -27,89 +28,49 @@ internal static class LogHelper
|
|||||||
|
|
||||||
internal static event EventHandler<ErrorMessage> OnLogLevelDisabled;
|
internal static event EventHandler<ErrorMessage> OnLogLevelDisabled;
|
||||||
|
|
||||||
|
private static readonly string MachineName = Environment.MachineName;
|
||||||
|
private static readonly string HostName = Dns.GetHostName();
|
||||||
|
|
||||||
internal static string FormatMessageWithHeader(LoggerSettings settings, ELogType logType, string currentMessage,
|
internal static string FormatMessageWithHeader(LoggerSettings settings, ELogType logType, string currentMessage,
|
||||||
DateTime dateTime, string category = null)
|
DateTime dateTime, string category = null)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(currentMessage))
|
if (string.IsNullOrWhiteSpace(currentMessage)) return currentMessage;
|
||||||
{
|
|
||||||
return currentMessage;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(category))
|
|
||||||
{
|
|
||||||
category = "General";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
category ??= "General";
|
||||||
var sb = new StringBuilder(settings?.HeaderFormat ?? "[EonaCatLogger]");
|
var sb = new StringBuilder(settings?.HeaderFormat ?? "[EonaCatLogger]");
|
||||||
|
var timestamp = dateTime.ToString(settings?.TimestampFormat ?? "yyyy-MM-dd HH:mm:ss");
|
||||||
|
var timeLabel = settings?.UseLocalTime ?? false ? "[LOCAL]" : "[UTC]";
|
||||||
|
|
||||||
sb.Replace("{ts}",
|
sb.Replace("{ts}", $"{timestamp} {timeLabel}")
|
||||||
dateTime.ToString(settings?.TimestampFormat ?? "yyyy-MM-dd HH:mm:ss") + " " +
|
.Replace("{host}", $"[Host:{HostName}]")
|
||||||
(settings?.UseLocalTime ?? false ? "[LOCAL]" : "[UTC]"))
|
|
||||||
.Replace("{host}", $"[Host:{Dns.GetHostName()}]")
|
|
||||||
.Replace("{category}", $"[Category:{category}]")
|
.Replace("{category}", $"[Category:{category}]")
|
||||||
.Replace("{thread}", $"[ThreadId:{Environment.CurrentManagedThreadId}]")
|
.Replace("{thread}", $"[ThreadId:{Environment.CurrentManagedThreadId}]")
|
||||||
.Replace("{sev}", $"[{logType}]");
|
.Replace("{sev}", $"[{logType}]");
|
||||||
|
|
||||||
if (!settings?.RemoveMessagePrefix ?? (false && !currentMessage.Contains("[EonaCatLogger]")))
|
if (!(settings?.RemoveMessagePrefix ?? false) && !currentMessage.Contains("[EonaCatLogger]"))
|
||||||
{
|
{
|
||||||
sb.Insert(0, "[EonaCatLogger] ");
|
sb.Insert(0, "[EonaCatLogger] ");
|
||||||
}
|
}
|
||||||
|
|
||||||
sb.Append(" ").Append(currentMessage);
|
sb.Append(" ").Append(currentMessage);
|
||||||
|
|
||||||
return sb.ToString();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void SendToConsole(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))
|
if (settings == null || !writeToConsole || string.IsNullOrWhiteSpace(message)) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.EnableColors && settings.Colors != null)
|
if (settings.EnableColors && settings.Colors != null)
|
||||||
{
|
{
|
||||||
var prevForeground = Console.ForegroundColor;
|
var prevForeground = Console.ForegroundColor;
|
||||||
var prevBackground = Console.BackgroundColor;
|
var prevBackground = Console.BackgroundColor;
|
||||||
|
|
||||||
ConsoleColor foregroundColor;
|
if (TryGetLogColor(settings.Colors, logType, out var foregroundColor, out var backgroundColor))
|
||||||
ConsoleColor backgroundColor;
|
|
||||||
switch (logType)
|
|
||||||
{
|
{
|
||||||
case ELogType.DEBUG:
|
Console.ForegroundColor = foregroundColor;
|
||||||
foregroundColor = settings.Colors.Debug.Foreground;
|
Console.BackgroundColor = backgroundColor;
|
||||||
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.WriteLine(message);
|
||||||
Console.ForegroundColor = prevForeground;
|
Console.ForegroundColor = prevForeground;
|
||||||
Console.BackgroundColor = prevBackground;
|
Console.BackgroundColor = prevBackground;
|
||||||
@@ -120,21 +81,40 @@ internal static class LogHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static void SendToFile(ILogger logger, LoggerSettings settings, ELogType logType, string message)
|
private static bool TryGetLogColor(ColorSchema colors, ELogType logType, out ConsoleColor foreground, out ConsoleColor background)
|
||||||
{
|
{
|
||||||
if (logger == null || settings == null || !settings.EnableFileLogging ||
|
foreground = default;
|
||||||
string.IsNullOrWhiteSpace(message))
|
background = default;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var logLevel = logType.ToLogLevel();
|
return logType switch
|
||||||
if (IsLogLevelEnabled(settings, logType))
|
|
||||||
{
|
{
|
||||||
Log(logger, logLevel, message);
|
ELogType.DEBUG => TrySetColors(colors.Debug, out foreground, out background),
|
||||||
}
|
ELogType.INFO => TrySetColors(colors.Info, out foreground, out background),
|
||||||
|
ELogType.WARNING => TrySetColors(colors.Warning, out foreground, out background),
|
||||||
|
ELogType.ERROR => TrySetColors(colors.Error, out foreground, out background),
|
||||||
|
ELogType.TRAFFIC => TrySetColors(colors.Traffic, out foreground, out background),
|
||||||
|
ELogType.CRITICAL => TrySetColors(colors.Critical, out foreground, out background),
|
||||||
|
ELogType.TRACE => TrySetColors(colors.Trace, out foreground, out background),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static bool TrySetColors(ColorScheme color, out ConsoleColor foreground, out ConsoleColor background)
|
||||||
|
{
|
||||||
|
foreground = color.Foreground;
|
||||||
|
background = color.Background;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static void SendToFile(ILogger logger, LoggerSettings settings, ELogType logType, string message)
|
||||||
|
{
|
||||||
|
if (logger == null || settings == null || !settings.EnableFileLogging || string.IsNullOrWhiteSpace(message)) return;
|
||||||
|
|
||||||
|
if (IsLogLevelEnabled(settings, logType))
|
||||||
|
{
|
||||||
|
Log(logger, logType.ToLogLevel(), message);
|
||||||
|
}
|
||||||
|
}
|
||||||
private static bool IsLogLevelEnabled(LoggerSettings loggerSettings, ELogType logType)
|
private static bool IsLogLevelEnabled(LoggerSettings loggerSettings, ELogType logType)
|
||||||
{
|
{
|
||||||
if (loggerSettings == null)
|
if (loggerSettings == null)
|
||||||
@@ -146,8 +126,9 @@ internal static class LogHelper
|
|||||||
var isEnabled = loggerSettings.MaxLogType != ELogType.NONE && logType <= loggerSettings.MaxLogType;
|
var isEnabled = loggerSettings.MaxLogType != ELogType.NONE && logType <= loggerSettings.MaxLogType;
|
||||||
if (!isEnabled)
|
if (!isEnabled)
|
||||||
{
|
{
|
||||||
OnLogLevelDisabled?.Invoke(null, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled, cannot log message" });
|
OnLogLevelDisabled?.Invoke(null, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled." });
|
||||||
}
|
}
|
||||||
|
|
||||||
return isEnabled;
|
return isEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,55 +142,29 @@ internal static class LogHelper
|
|||||||
logger.Log(logLevel, message);
|
logger.Log(logLevel, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload,
|
public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload, bool sendToSplunkServer)
|
||||||
bool sendToSplunkServer)
|
|
||||||
{
|
{
|
||||||
if (settings == null || !sendToSplunkServer || splunkPayload == null)
|
if (settings == null || !sendToSplunkServer || splunkPayload == null) return;
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (settings.SplunkServers == null)
|
foreach (var splunkServer in settings.SplunkServers ?? Enumerable.Empty<SplunkServer.SplunkServer>())
|
||||||
{
|
|
||||||
settings.SplunkServers = new List<SplunkServer.SplunkServer>();
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach (var splunkServer in settings.SplunkServers)
|
|
||||||
{
|
{
|
||||||
if (!splunkServer.HasHecUrl || !splunkServer.HasHecToken)
|
if (!splunkServer.HasHecUrl || !splunkServer.HasHecToken)
|
||||||
{
|
{
|
||||||
OnException?.Invoke(null,
|
OnException?.Invoke(null, new ErrorMessage { Message = $"Invalid Splunk server configuration for '{splunkServer.SplunkHecUrl}'" });
|
||||||
new ErrorMessage
|
|
||||||
{
|
|
||||||
Message =
|
|
||||||
$"Splunk server HecUrl or HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'"
|
|
||||||
});
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var response = await splunkServer.SendAsync(splunkPayload);
|
var response = await splunkServer.SendAsync(splunkPayload);
|
||||||
|
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
OnException?.Invoke(null,
|
OnException?.Invoke(null, new ErrorMessage { Message = $"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}" });
|
||||||
new ErrorMessage
|
|
||||||
{
|
|
||||||
Message =
|
|
||||||
$"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}"
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (Exception exception)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
OnException?.Invoke(null,
|
OnException?.Invoke(null, new ErrorMessage { Exception = ex, Message = $"Error logging to Splunk '{splunkServer.SplunkHecUrl}': {ex.Message}" });
|
||||||
new ErrorMessage
|
|
||||||
{
|
|
||||||
Exception = exception,
|
|
||||||
Message =
|
|
||||||
$"Error while logging to Splunk Server '{splunkServer.SplunkHecUrl}': {exception.Message}"
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,7 +202,7 @@ internal static class LogHelper
|
|||||||
var gelfMessage = new
|
var gelfMessage = new
|
||||||
{
|
{
|
||||||
version,
|
version,
|
||||||
host = Environment.MachineName,
|
host = MachineName,
|
||||||
short_message = message,
|
short_message = message,
|
||||||
level = logLevel.ToGrayLogLevel(),
|
level = logLevel.ToGrayLogLevel(),
|
||||||
facility,
|
facility,
|
||||||
|
|||||||
@@ -202,31 +202,25 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
private async Task InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO,
|
private async Task InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO,
|
||||||
bool? writeToConsole = null, bool? sendToSyslogServers = null, bool? sendToSplunkServers = null,
|
bool? writeToConsole = null, bool? sendToSyslogServers = null, bool? sendToSplunkServers = null,
|
||||||
string customSplunkSourceType = null, bool? sendToGrayLogServers = null, string grayLogFacility = null,
|
string customSplunkSourceType = null, bool? sendToGrayLogServers = null, string grayLogFacility = null,
|
||||||
string grayLogSource = null, string grayLogVersion = "1.1")
|
string grayLogSource = null, string grayLogVersion = "1.1")
|
||||||
{
|
{
|
||||||
if (string.IsNullOrEmpty(message) || logType == ELogType.NONE ||
|
if (string.IsNullOrWhiteSpace(message) || logType == ELogType.NONE || !IsLogLevelEnabled(logType) || _isDisposing)
|
||||||
!IsLogLevelEnabled(logType))
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (_isDisposing)
|
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!IsRunning)
|
if (!IsRunning)
|
||||||
{
|
{
|
||||||
await StartNewLogAsync();
|
await StartNewLogAsync().ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime, _category);
|
var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime, _category);
|
||||||
var writeToConsoleValue = writeToConsole ?? Settings.EnableConsole;
|
var writeToConsoleValue = writeToConsole.GetValueOrDefault(Settings.EnableConsole);
|
||||||
var sendToSyslogServersValue = sendToSyslogServers ?? Settings.SendToSyslogServers;
|
var sendToSyslogServersValue = sendToSyslogServers.GetValueOrDefault(Settings.SendToSyslogServers);
|
||||||
var sendToSplunkServersValue = sendToSplunkServers ?? Settings.SendToSplunkServers;
|
var sendToSplunkServersValue = sendToSplunkServers.GetValueOrDefault(Settings.SendToSplunkServers);
|
||||||
var sendToGrayLogServersValue = sendToGrayLogServers ?? Settings.SendToGrayLogServers;
|
var sendToGrayLogServersValue = sendToGrayLogServers.GetValueOrDefault(Settings.SendToGrayLogServers);
|
||||||
|
|
||||||
LogHelper.SendToFile(Logger, Settings, logType, message);
|
LogHelper.SendToFile(Logger, Settings, logType, message);
|
||||||
|
|
||||||
@@ -235,27 +229,25 @@ namespace EonaCat.Logger.Managers
|
|||||||
LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
|
LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
var tasks = new List<Task>();
|
var tasks = new List<Task>(3);
|
||||||
if (sendToSyslogServersValue || sendToSplunkServersValue || sendToGrayLogServersValue)
|
if (sendToSyslogServersValue)
|
||||||
{
|
{
|
||||||
if (sendToSyslogServersValue)
|
tasks.Add(LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader, true));
|
||||||
{
|
}
|
||||||
tasks.Add(LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader, true));
|
if (sendToSplunkServersValue)
|
||||||
}
|
{
|
||||||
|
tasks.Add(LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(),
|
||||||
|
messageWithHeader, true));
|
||||||
|
}
|
||||||
|
if (sendToGrayLogServersValue)
|
||||||
|
{
|
||||||
|
tasks.Add(LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility,
|
||||||
|
grayLogSource, true, grayLogVersion));
|
||||||
|
}
|
||||||
|
|
||||||
if (sendToSplunkServersValue)
|
if (tasks.Count > 0)
|
||||||
{
|
{
|
||||||
tasks.Add(LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(),
|
await Task.WhenAll(tasks).ConfigureAwait(false);
|
||||||
messageWithHeader, true));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sendToGrayLogServersValue)
|
|
||||||
{
|
|
||||||
tasks.Add(LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility,
|
|
||||||
grayLogSource, true, grayLogVersion));
|
|
||||||
}
|
|
||||||
|
|
||||||
await Task.WhenAll(tasks);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var logMessage = new EonaCatLogMessage
|
var logMessage = new EonaCatLogMessage
|
||||||
@@ -263,9 +255,8 @@ namespace EonaCat.Logger.Managers
|
|||||||
DateTime = dateTime,
|
DateTime = dateTime,
|
||||||
Message = message,
|
Message = message,
|
||||||
LogType = logType,
|
LogType = logType,
|
||||||
Origin = string.IsNullOrWhiteSpace(Settings.LogOrigin) ? "LogManager" : Settings.LogOrigin
|
Origin = string.IsNullOrEmpty(Settings.LogOrigin) ? "LogManager" : Settings.LogOrigin
|
||||||
};
|
};
|
||||||
|
|
||||||
Settings.OnLogEvent(logMessage);
|
Settings.OnLogEvent(logMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user