diff --git a/EonaCat.Logger/EonaCat.Logger.csproj b/EonaCat.Logger/EonaCat.Logger.csproj index 48694de..463f851 100644 --- a/EonaCat.Logger/EonaCat.Logger.csproj +++ b/EonaCat.Logger/EonaCat.Logger.csproj @@ -3,7 +3,7 @@ .netstandard2.1; net6.0; net7.0; net8.0; net4.8; icon.ico latest - 1.2.4 + 1.2.5 EonaCat (Jeroen Saey) true EonaCat (Jeroen Saey) @@ -22,7 +22,19 @@ EonaCat.Logger git - + + + 1.0.0.0+{chash:10}.{c:ymd} + true + true + v[0-9]* + true + git + true + true + + + True @@ -39,7 +51,11 @@ - + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/EonaCat.Logger/Managers/LogHelper.cs b/EonaCat.Logger/Managers/LogHelper.cs index 1315c4f..6b191c2 100644 --- a/EonaCat.Logger/Managers/LogHelper.cs +++ b/EonaCat.Logger/Managers/LogHelper.cs @@ -1,14 +1,9 @@ using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; using System.Net; -using System.Net.Http; using System.Text; using System.Threading.Tasks; -using System.Xml.Linq; using EonaCat.Json; -using EonaCat.Json.Linq; using EonaCat.Logger.Extensions; using EonaCat.Logger.GrayLog; using EonaCat.Logger.Splunk.Models; @@ -35,36 +30,21 @@ namespace EonaCat.Logger.Managers if (string.IsNullOrWhiteSpace(currentMessage)) return currentMessage; - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(settings?.HeaderFormat ?? "[EonaCatLogger]"); - sb.Append(settings?.HeaderFormat ?? "[EonaCatLogger]"); + sb.Replace("{ts}", dateTime.ToString(settings?.TimestampFormat ?? "yyyy-MM-dd HH:mm:ss") + " " + (settings?.UseLocalTime ?? false ? "[LOCAL]" : "[UTC]")) + .Replace("{host}", $"[Host:{Dns.GetHostName()}]") + .Replace("{thread}", $"[ThreadId:{Environment.CurrentManagedThreadId}]") + .Replace("{sev}", $"[{logType}]"); - if (settings != null) - { - if (sb.ToString().Contains("{ts}")) - sb.Replace("{ts}", dateTime.ToString(settings.TimestampFormat) + " " + (settings.UseLocalTime ? "[LOCAL]" : "[UTC]")); + if (!settings?.RemoveMessagePrefix ?? false && !currentMessage.Contains("[EonaCatLogger]")) + sb.Insert(0, "[EonaCatLogger] "); - 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); + sb.Append(" ").Append(currentMessage); return sb.ToString(); } - - internal static void SendToConsole(LoggerSettings settings, ELogType logType, string message, bool writeToConsole) { if (settings == null || !writeToConsole || string.IsNullOrWhiteSpace(message)) @@ -123,20 +103,15 @@ namespace EonaCat.Logger.Managers } } - internal static void SendToFile(ILogger logger, LoggerSettings settings, ELogType logType, string message) + internal static async Task SendToFile(ILogger logger, LoggerSettings settings, ELogType logType, string message) { if (logger == null || settings == null || !settings.EnableFileLogging || string.IsNullOrWhiteSpace(message)) return; 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); + if (logLevel >= settings.MaxLogType.ToLogLevel()) + await Task.Run(() => logger.Log(logLevel, message)); } public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload, bool sendToSplunkServer) @@ -151,35 +126,25 @@ namespace EonaCat.Logger.Managers foreach (var splunkServer in settings.SplunkServers) { - if (!splunkServer.HasHecUrl) + if (!splunkServer.HasHecUrl || !splunkServer.HasHecToken) { - Console.WriteLine("Splunk server HecUrl not specified, skipping splunkServer"); + OnException?.Invoke(null, new ErrorMessage { Message = $"Splunk server HecUrl or HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'" }); continue; } - if (!splunkServer.HasHecToken) + try { - OnException?.Invoke(null, new ErrorMessage { Message = $"Splunk server HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'" }); - Console.WriteLine($"Splunk server HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'"); - continue; + var response = await splunkServer.SendAsync(splunkPayload); + + if (!response.IsSuccessStatusCode) + { + OnException?.Invoke(null, new ErrorMessage { Message = $"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}" }); + } } - - await Task.Run(async () => + catch (Exception exception) { - try - { - var response = await splunkServer.SendAsync(splunkPayload); - - if (!response.IsSuccessStatusCode) - { - OnException?.Invoke(null, new ErrorMessage { Message = $"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}" }); - } - } - catch (Exception exception) - { - OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to Splunk Server '{splunkServer.SplunkHecUrl}': {exception.Message}" }); - } - }); + OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to Splunk Server '{splunkServer.SplunkHecUrl}': {exception.Message}" }); + } } } @@ -203,36 +168,28 @@ namespace EonaCat.Logger.Managers if (settings == null || !sendToGrayLogServer || string.IsNullOrWhiteSpace(message)) return; - if (settings.GrayLogServers == null || !settings.GrayLogServers.Any()) + foreach (var grayLogServer in settings.GrayLogServers ?? new List { new GrayLogServer("127.0.0.1", 12201) }) { - settings.GrayLogServers = new List { new GrayLogServer("127.0.0.1", 12201) }; - } - - foreach (var grayLogServer in settings.GrayLogServers) - { - await Task.Run(async () => + try { - try + var gelfMessage = new { - var gelfMessage = new - { - version, - host = Environment.MachineName, - short_message = message, - level = logLevel.ToGrayLogLevel(), - facility, - source, - timestamp = DateTime.UtcNow.ToUnixTimestamp(), - }; + version, + host = Environment.MachineName, + short_message = message, + level = logLevel.ToGrayLogLevel(), + facility, + source, + timestamp = DateTime.UtcNow.ToUnixTimestamp(), + }; - var messageBytes = Encoding.UTF8.GetBytes(JsonHelper.ToJson(gelfMessage)); - await grayLogServer.Udp.SendAsync(messageBytes, messageBytes.Length, new IPEndPoint(IPAddress.Parse(grayLogServer.Hostname), grayLogServer.Port)); - } - catch (Exception exception) - { - OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to GrayLog Server '{grayLogServer.Hostname}': {exception.Message}" }); - } - }); + var messageBytes = Encoding.UTF8.GetBytes(JsonHelper.ToJson(gelfMessage)); + await grayLogServer.Udp.SendAsync(messageBytes, messageBytes.Length, new IPEndPoint(IPAddress.Parse(grayLogServer.Hostname), grayLogServer.Port)); + } + catch (Exception exception) + { + OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to GrayLog Server '{grayLogServer.Hostname}': {exception.Message}" }); + } } } @@ -241,38 +198,29 @@ namespace EonaCat.Logger.Managers if (settings == null || !sendToSyslogServers || string.IsNullOrWhiteSpace(message)) return; - if (settings.SysLogServers == null || !settings.SysLogServers.Any()) + foreach (var server in settings.SysLogServers ?? new List { new SyslogServer("127.0.0.1", 514) }) { - settings.SysLogServers = new List { new SyslogServer("127.0.0.1", 514) }; - } - - byte[] data = Encoding.UTF8.GetBytes(message); - - foreach (SyslogServer server in settings.SysLogServers) - { - await Task.Run(() => + try { - try + if (string.IsNullOrWhiteSpace(server.Hostname)) { - if (string.IsNullOrWhiteSpace(server.Hostname)) - { - OnException?.Invoke(null, new ErrorMessage { Message = "Server hostname not specified, skipping SysLog Server" }); - return; - } - - if (server.Port < 0) - { - OnException?.Invoke(null, new ErrorMessage { Message = "Server port must be zero or greater, skipping SysLog Server" }); - return; - } - - server.Udp.Send(data, data.Length); + OnException?.Invoke(null, new ErrorMessage { Message = "Server hostname not specified, skipping SysLog Server" }); + continue; } - catch (Exception exception) + + if (server.Port < 0) { - OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to SysLog Server '{server.Hostname}': {exception.Message}" }); + OnException?.Invoke(null, new ErrorMessage { Message = "Server port must be zero or greater, skipping SysLog Server" }); + continue; } - }); + + byte[] data = Encoding.UTF8.GetBytes(message); + await server.Udp.SendAsync(data, data.Length, new IPEndPoint(IPAddress.Parse(server.Hostname), server.Port)); + } + catch (Exception exception) + { + OnException?.Invoke(null, new ErrorMessage { Exception = exception, Message = $"Error while logging to SysLog Server '{server.Hostname}': {exception.Message}" }); + } } } } diff --git a/EonaCat.Logger/Managers/LogManager.cs b/EonaCat.Logger/Managers/LogManager.cs index 45b843e..4d93b04 100644 --- a/EonaCat.Logger/Managers/LogManager.cs +++ b/EonaCat.Logger/Managers/LogManager.cs @@ -10,7 +10,6 @@ using EonaCat.Logger.EonaCatCoreLogger; using EonaCat.Logger.EonaCatCoreLogger.Extensions; using EonaCat.Logger.EonaCatCoreLogger.Models; using EonaCat.Logger.Extensions; -using System.Text; namespace EonaCat.Logger.Managers { @@ -65,10 +64,14 @@ namespace EonaCat.Logger.Managers public async Task StartNewLogAsync() { if (_tokenSource.IsCancellationRequested) + { return; + } if (IsRunning && CurrentDateTme.Date > _logDate.Date) + { await StopLoggingAsync().ConfigureAwait(false); + } IsRunning = true; @@ -103,45 +106,42 @@ namespace EonaCat.Logger.Managers Logger = LoggerFactory.CreateLogger(Settings.Id); } - private void InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null, bool? sendToSyslogServers = null, bool? sendToSplunkServers = null, string customSplunkSourceType = null, bool? sendToGrayLogServers = null, string grayLogFacility = null, string grayLogSource = null, string grayLogVersion = "1.1") + private async Task InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null, bool? sendToSyslogServers = null, bool? sendToSplunkServers = null, string customSplunkSourceType = null, bool? sendToGrayLogServers = null, string grayLogFacility = null, string grayLogSource = null, string grayLogVersion = "1.1") { if (string.IsNullOrEmpty(message) || logType == ELogType.NONE || (int)logType >= (int)Settings.MaxLogType) + { return; + } - var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime); + string messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime); + bool writeToConsoleValue = writeToConsole ?? Settings.EnableConsole; + bool sendToSyslogServersValue = sendToSyslogServers ?? Settings.SendToSyslogServers; + bool sendToSplunkServersValue = sendToSplunkServers ?? Settings.SendToSplunkServers; + bool sendToGrayLogServersValue = sendToGrayLogServers ?? Settings.SendToGrayLogServers; - writeToConsole ??= Settings.EnableConsole; - if (writeToConsole.Value) + if (writeToConsoleValue) { LogHelper.SendToConsole(Settings, logType, messageWithHeader, true); } - Task.Run(() => { LogHelper.SendToFile(Logger, Settings, logType, message); }); - - sendToSyslogServers ??= Settings.SendToSyslogServers; - if (sendToSyslogServers.Value) + if (sendToSyslogServersValue || sendToSplunkServersValue || sendToGrayLogServersValue) { - Task.Run(async () => + await Task.Run(async () => { - await LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader, true); - }); - } + if (sendToSyslogServersValue) + { + await LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader, true); + } - sendToSplunkServers ??= Settings.SendToSplunkServers; - if (sendToSplunkServers.Value) - { - Task.Run(async () => - { - await LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader, true); - }); - } + if (sendToSplunkServersValue) + { + await LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader, true); + } - sendToGrayLogServers ??= Settings.SendToGrayLogServers; - if (sendToGrayLogServers.Value) - { - Task.Run(async () => - { - await LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility, grayLogSource, true, grayLogVersion); + if (sendToGrayLogServersValue) + { + await LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility, grayLogSource, true, grayLogVersion); + } }); } @@ -155,9 +155,8 @@ namespace EonaCat.Logger.Managers Settings.OnLogEvent(logMessage); } - - public void Reset() => Settings.ResetLogEvent(); + public void Reset() => Settings.ResetLogEvent(); public LogManager(LoggerSettings settings, string serverIp, int serverPort) { @@ -221,10 +220,10 @@ namespace EonaCat.Logger.Managers Dispose(); } - private Task StopLoggingAsync() + private async Task StopLoggingAsync() { IsRunning = false; - InternalWriteAsync(CurrentDateTme, $"{DllInfo.ApplicationName} stopped."); + await InternalWriteAsync(CurrentDateTme, $"{DllInfo.ApplicationName} stopped.").ConfigureAwait(false); return Task.Delay(500); }