diff --git a/EonaCat.Logger/EonaCat.Logger.csproj b/EonaCat.Logger/EonaCat.Logger.csproj
index 2275da1..c1921d8 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.3.3
+ 1.3.4
EonaCat (Jeroen Saey)
true
EonaCat (Jeroen Saey)
@@ -24,7 +24,7 @@
- 1.3.3+{chash:10}.{c:ymd}
+ 1.3.4+{chash:10}.{c:ymd}
true
true
v[0-9]*
diff --git a/EonaCat.Logger/Managers/LogHelper.cs b/EonaCat.Logger/Managers/LogHelper.cs
index 48a4d32..8cbced9 100644
--- a/EonaCat.Logger/Managers/LogHelper.cs
+++ b/EonaCat.Logger/Managers/LogHelper.cs
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
+using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
@@ -27,89 +28,49 @@ internal static class LogHelper
internal static event EventHandler 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,
DateTime dateTime, string category = null)
{
- if (string.IsNullOrWhiteSpace(currentMessage))
- {
- return currentMessage;
- }
-
- if (string.IsNullOrWhiteSpace(category))
- {
- category = "General";
- }
+ if (string.IsNullOrWhiteSpace(currentMessage)) return currentMessage;
+ category ??= "General";
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}",
- dateTime.ToString(settings?.TimestampFormat ?? "yyyy-MM-dd HH:mm:ss") + " " +
- (settings?.UseLocalTime ?? false ? "[LOCAL]" : "[UTC]"))
- .Replace("{host}", $"[Host:{Dns.GetHostName()}]")
+ sb.Replace("{ts}", $"{timestamp} {timeLabel}")
+ .Replace("{host}", $"[Host:{HostName}]")
.Replace("{category}", $"[Category:{category}]")
.Replace("{thread}", $"[ThreadId:{Environment.CurrentManagedThreadId}]")
.Replace("{sev}", $"[{logType}]");
- if (!settings?.RemoveMessagePrefix ?? (false && !currentMessage.Contains("[EonaCatLogger]")))
+ if (!(settings?.RemoveMessagePrefix ?? false) && !currentMessage.Contains("[EonaCatLogger]"))
{
sb.Insert(0, "[EonaCatLogger] ");
}
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))
- {
- return;
- }
+ if (settings == null || !writeToConsole || string.IsNullOrWhiteSpace(message)) return;
if (settings.EnableColors && settings.Colors != null)
{
var prevForeground = Console.ForegroundColor;
var prevBackground = Console.BackgroundColor;
- ConsoleColor foregroundColor;
- ConsoleColor backgroundColor;
- switch (logType)
+ if (TryGetLogColor(settings.Colors, logType, out var foregroundColor, out var backgroundColor))
{
- 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.ForegroundColor = foregroundColor;
- Console.BackgroundColor = backgroundColor;
Console.WriteLine(message);
Console.ForegroundColor = prevForeground;
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 ||
- string.IsNullOrWhiteSpace(message))
- {
- return;
- }
+ foreground = default;
+ background = default;
- var logLevel = logType.ToLogLevel();
- if (IsLogLevelEnabled(settings, logType))
+ return logType switch
{
- 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)
{
if (loggerSettings == null)
@@ -146,8 +126,9 @@ internal static class LogHelper
var isEnabled = loggerSettings.MaxLogType != ELogType.NONE && logType <= loggerSettings.MaxLogType;
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;
}
@@ -161,55 +142,29 @@ internal static class LogHelper
logger.Log(logLevel, message);
}
- public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload,
- bool sendToSplunkServer)
+ public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload, bool sendToSplunkServer)
{
- if (settings == null || !sendToSplunkServer || splunkPayload == null)
- {
- return;
- }
+ if (settings == null || !sendToSplunkServer || splunkPayload == null) return;
- if (settings.SplunkServers == null)
- {
- settings.SplunkServers = new List();
- }
-
- foreach (var splunkServer in settings.SplunkServers)
+ foreach (var splunkServer in settings.SplunkServers ?? Enumerable.Empty())
{
if (!splunkServer.HasHecUrl || !splunkServer.HasHecToken)
{
- OnException?.Invoke(null,
- new ErrorMessage
- {
- Message =
- $"Splunk server HecUrl or HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'"
- });
+ OnException?.Invoke(null, new ErrorMessage { Message = $"Invalid Splunk server configuration for '{splunkServer.SplunkHecUrl}'" });
continue;
}
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}"
- });
+ OnException?.Invoke(null, new ErrorMessage { Message = $"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}" });
}
}
- catch (Exception exception)
+ catch (Exception ex)
{
- OnException?.Invoke(null,
- new ErrorMessage
- {
- Exception = exception,
- Message =
- $"Error while logging to Splunk Server '{splunkServer.SplunkHecUrl}': {exception.Message}"
- });
+ OnException?.Invoke(null, new ErrorMessage { Exception = ex, Message = $"Error logging to Splunk '{splunkServer.SplunkHecUrl}': {ex.Message}" });
}
}
}
@@ -247,7 +202,7 @@ internal static class LogHelper
var gelfMessage = new
{
version,
- host = Environment.MachineName,
+ host = MachineName,
short_message = message,
level = logLevel.ToGrayLogLevel(),
facility,
diff --git a/EonaCat.Logger/Managers/LogManager.cs b/EonaCat.Logger/Managers/LogManager.cs
index e91790c..b953922 100644
--- a/EonaCat.Logger/Managers/LogManager.cs
+++ b/EonaCat.Logger/Managers/LogManager.cs
@@ -1,272 +1,263 @@
-using System;
-using System.Collections.Generic;
-using System.IO;
-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;
-using EonaCat.Logger.Syslog;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-
-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 class LogManager : ILogManager, IDisposable
- {
- private static readonly Lazy _instance = new(() => new LogManager(CreateDefaultSettings()));
- private readonly CancellationTokenSource _tokenSource = new();
- private DateTime _logDate;
- private bool _isDisposing;
- private string _category;
-
- public LogManager(LoggerSettings settings, string serverIp, int serverPort)
- {
- if (string.IsNullOrEmpty(serverIp))
- {
- throw new ArgumentNullException(nameof(serverIp));
- }
-
- if (serverPort < 0)
- {
- throw new ArgumentException("Server port must be zero or greater.");
- }
-
- settings.SysLogServers = new List
- {
- new(serverIp, serverPort)
- };
-
- Settings = settings;
- SetupLogManager();
- }
-
- public LogManager(LoggerSettings settings, string category = null)
- {
- _category = category;
- if (string.IsNullOrWhiteSpace(category))
- {
- _category = "General";
- }
- Settings = settings;
- SetupFileLogger(settings);
- SetupLogManager();
- LogHelper.OnException += LogHelper_OnException;
- LogHelper.OnLogLevelDisabled += LogHelper_OnLogLevelDisabled;
+using System;
+using System.Collections.Generic;
+using System.IO;
+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;
+using EonaCat.Logger.Syslog;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+
+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 class LogManager : ILogManager, IDisposable
+ {
+ private static readonly Lazy _instance = new(() => new LogManager(CreateDefaultSettings()));
+ private readonly CancellationTokenSource _tokenSource = new();
+ private DateTime _logDate;
+ private bool _isDisposing;
+ private string _category;
+
+ public LogManager(LoggerSettings settings, string serverIp, int serverPort)
+ {
+ if (string.IsNullOrEmpty(serverIp))
+ {
+ throw new ArgumentNullException(nameof(serverIp));
+ }
+
+ if (serverPort < 0)
+ {
+ throw new ArgumentException("Server port must be zero or greater.");
+ }
+
+ settings.SysLogServers = new List
+ {
+ new(serverIp, serverPort)
+ };
+
+ Settings = settings;
+ SetupLogManager();
}
- private void LogHelper_OnLogLevelDisabled(object sender, ErrorMessage e)
- {
- OnLogLevelDisabled?.Invoke(sender, e);
+ public LogManager(LoggerSettings settings, string category = null)
+ {
+ _category = category;
+ if (string.IsNullOrWhiteSpace(category))
+ {
+ _category = "General";
+ }
+ Settings = settings;
+ SetupFileLogger(settings);
+ SetupLogManager();
+ LogHelper.OnException += LogHelper_OnException;
+ LogHelper.OnLogLevelDisabled += LogHelper_OnLogLevelDisabled;
+ }
+
+ private void LogHelper_OnLogLevelDisabled(object sender, ErrorMessage e)
+ {
+ OnLogLevelDisabled?.Invoke(sender, e);
+ }
+
+ private DateTime CurrentDateTime => Settings.UseLocalTime ? DateTime.Now : DateTime.UtcNow;
+ public ILoggerProvider LoggerProvider { get; private set; }
+ public ILoggerFactory LoggerFactory { get; private set; }
+ public ILogger Logger { get; private set; }
+
+ public string CurrentLogFile => LoggerProvider is FileLoggerProvider fileLoggerProvider
+ ? fileLoggerProvider.LogFile
+ : string.Empty;
+
+ public bool IsRunning { get; private set; }
+
+ public static LogManager Instance => _instance.Value;
+
+ public LoggerSettings Settings { get; set; } = CreateDefaultSettings();
+
+ public void Dispose()
+ {
+ DisposeAsync(true).GetAwaiter().GetResult();
+ GC.SuppressFinalize(this);
+ }
+
+ public async Task WriteAsync(Exception exception, string module = null, string method = null,
+ bool criticalException = false,
+ 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 (exception == null)
+ {
+ return;
+ }
+
+ await WriteAsync(exception.FormatExceptionToMessage(module, method),
+ criticalException ? ELogType.CRITICAL : ELogType.ERROR, writeToConsole, sendToSysLogServers,
+ sendToSplunkServers, customSplunkSourceType, sendToGrayLogServers, grayLogFacility, grayLogSource,
+ grayLogVersion);
+ }
+
+ public async Task WriteAsync(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 (logType == ELogType.NONE)
+ {
+ return;
+ }
+
+ await InternalWriteAsync(CurrentDateTime, message, logType, writeToConsole, sendToSysLogServers, sendToSplunkServers,
+ customSplunkSourceType, sendToGrayLogServers, grayLogFacility, grayLogSource, grayLogVersion);
}
- private DateTime CurrentDateTime => Settings.UseLocalTime ? DateTime.Now : DateTime.UtcNow;
- public ILoggerProvider LoggerProvider { get; private set; }
- public ILoggerFactory LoggerFactory { get; private set; }
- public ILogger Logger { get; private set; }
-
- public string CurrentLogFile => LoggerProvider is FileLoggerProvider fileLoggerProvider
- ? fileLoggerProvider.LogFile
- : string.Empty;
-
- public bool IsRunning { get; private set; }
-
- public static LogManager Instance => _instance.Value;
-
- public LoggerSettings Settings { get; set; } = CreateDefaultSettings();
-
- public void Dispose()
- {
- DisposeAsync(true).GetAwaiter().GetResult();
- GC.SuppressFinalize(this);
- }
-
- public async Task WriteAsync(Exception exception, string module = null, string method = null,
- bool criticalException = false,
- 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 (exception == null)
- {
- return;
- }
-
- await WriteAsync(exception.FormatExceptionToMessage(module, method),
- criticalException ? ELogType.CRITICAL : ELogType.ERROR, writeToConsole, sendToSysLogServers,
- sendToSplunkServers, customSplunkSourceType, sendToGrayLogServers, grayLogFacility, grayLogSource,
- grayLogVersion);
- }
-
- public async Task WriteAsync(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 (logType == ELogType.NONE)
- {
- return;
- }
-
- await InternalWriteAsync(CurrentDateTime, message, logType, writeToConsole, sendToSysLogServers, sendToSplunkServers,
- customSplunkSourceType, sendToGrayLogServers, grayLogFacility, grayLogSource, grayLogVersion);
- }
-
///
/// Gets fired when an exception occurs during logging
- ///
- public event EventHandler OnException;
-
+ ///
+ public event EventHandler OnException;
+
///
/// Gets fired when the log level is disabled and the user tries to log a message
- ///
- public event EventHandler OnLogLevelDisabled;
-
- private static LoggerSettings CreateDefaultSettings()
- {
- var settings = new LoggerSettings
- {
- Id = "EonaCatLogger",
- MaxLogType = ELogType.INFO
- };
- return settings;
- }
-
- protected virtual async Task DisposeAsync(bool disposing)
- {
- if (disposing)
- {
- _isDisposing = true;
- await StopLoggingAsync();
- await Task.Delay(100);
- }
- }
-
- public async Task StartNewLogAsync()
- {
- if (_tokenSource.IsCancellationRequested)
- {
- return;
- }
-
- if (IsRunning && CurrentDateTime.Date > _logDate.Date)
- {
- await StopLoggingAsync();
- }
-
- IsRunning = true;
-
- CreateLogger();
-
- Directory.CreateDirectory(Settings.FileLoggerOptions.LogDirectory);
-
- _logDate = CurrentDateTime;
- }
-
- private void CreateLogger()
- {
- // Dispose of previous ServiceProvider if it exists
- LoggerProvider?.Dispose();
- LoggerFactory?.Dispose();
-
- IServiceCollection serviceCollection = new ServiceCollection();
- serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.MaxLogType.ToLogLevel())
- .AddEonaCatFileLogger(configuration =>
- {
- var fileLoggerOptions = Settings.FileLoggerOptions;
- configuration.MaxWriteTries = fileLoggerOptions.MaxWriteTries;
- configuration.RetainedFileCountLimit = fileLoggerOptions.RetainedFileCountLimit;
- configuration.FlushPeriod = fileLoggerOptions.FlushPeriod;
- configuration.IsEnabled = fileLoggerOptions.IsEnabled;
- configuration.BatchSize = fileLoggerOptions.BatchSize;
- configuration.FileSizeLimit = fileLoggerOptions.FileSizeLimit;
- configuration.LogDirectory = fileLoggerOptions.LogDirectory;
- configuration.FileNamePrefix = fileLoggerOptions.FileNamePrefix;
- configuration.MaxRolloverFiles = fileLoggerOptions.MaxRolloverFiles;
- configuration.UseLocalTime = Settings.UseLocalTime;
- configuration.UseMask = Settings.UseMask;
- configuration.Mask = fileLoggerOptions.Mask;
- configuration.UseDefaultMasking = Settings.UseDefaultMasking;
- configuration.MaskedKeywords = fileLoggerOptions.MaskedKeywords;
- }));
-
- var serviceProvider = serviceCollection.BuildServiceProvider();
- LoggerProvider = serviceProvider.GetService();
- LoggerFactory = serviceProvider.GetService();
- Logger = LoggerFactory.CreateLogger(Settings.Id);
- LogHelper.SendToFile(Logger, Settings, ELogType.INFO, LogHelper.GetStartupMessage());
- }
-
- 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 ||
- !IsLogLevelEnabled(logType))
- {
- return;
- }
-
- if (_isDisposing)
- {
- return;
- }
-
- if (!IsRunning)
- {
- await StartNewLogAsync();
- }
-
- var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime, _category);
- var writeToConsoleValue = writeToConsole ?? Settings.EnableConsole;
- var sendToSyslogServersValue = sendToSyslogServers ?? Settings.SendToSyslogServers;
- var sendToSplunkServersValue = sendToSplunkServers ?? Settings.SendToSplunkServers;
- var sendToGrayLogServersValue = sendToGrayLogServers ?? Settings.SendToGrayLogServers;
-
- LogHelper.SendToFile(Logger, Settings, logType, message);
-
- if (writeToConsoleValue)
- {
- LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
- }
-
- var tasks = new List();
- if (sendToSyslogServersValue || sendToSplunkServersValue || sendToGrayLogServersValue)
- {
- if (sendToSyslogServersValue)
- {
- 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));
- }
-
- await Task.WhenAll(tasks);
- }
-
- var logMessage = new EonaCatLogMessage
- {
- DateTime = dateTime,
- Message = message,
- LogType = logType,
- Origin = string.IsNullOrWhiteSpace(Settings.LogOrigin) ? "LogManager" : Settings.LogOrigin
- };
-
- Settings.OnLogEvent(logMessage);
+ ///
+ public event EventHandler OnLogLevelDisabled;
+
+ private static LoggerSettings CreateDefaultSettings()
+ {
+ var settings = new LoggerSettings
+ {
+ Id = "EonaCatLogger",
+ MaxLogType = ELogType.INFO
+ };
+ return settings;
+ }
+
+ protected virtual async Task DisposeAsync(bool disposing)
+ {
+ if (disposing)
+ {
+ _isDisposing = true;
+ await StopLoggingAsync();
+ await Task.Delay(100);
+ }
+ }
+
+ public async Task StartNewLogAsync()
+ {
+ if (_tokenSource.IsCancellationRequested)
+ {
+ return;
+ }
+
+ if (IsRunning && CurrentDateTime.Date > _logDate.Date)
+ {
+ await StopLoggingAsync();
+ }
+
+ IsRunning = true;
+
+ CreateLogger();
+
+ Directory.CreateDirectory(Settings.FileLoggerOptions.LogDirectory);
+
+ _logDate = CurrentDateTime;
+ }
+
+ private void CreateLogger()
+ {
+ // Dispose of previous ServiceProvider if it exists
+ LoggerProvider?.Dispose();
+ LoggerFactory?.Dispose();
+
+ IServiceCollection serviceCollection = new ServiceCollection();
+ serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.MaxLogType.ToLogLevel())
+ .AddEonaCatFileLogger(configuration =>
+ {
+ var fileLoggerOptions = Settings.FileLoggerOptions;
+ configuration.MaxWriteTries = fileLoggerOptions.MaxWriteTries;
+ configuration.RetainedFileCountLimit = fileLoggerOptions.RetainedFileCountLimit;
+ configuration.FlushPeriod = fileLoggerOptions.FlushPeriod;
+ configuration.IsEnabled = fileLoggerOptions.IsEnabled;
+ configuration.BatchSize = fileLoggerOptions.BatchSize;
+ configuration.FileSizeLimit = fileLoggerOptions.FileSizeLimit;
+ configuration.LogDirectory = fileLoggerOptions.LogDirectory;
+ configuration.FileNamePrefix = fileLoggerOptions.FileNamePrefix;
+ configuration.MaxRolloverFiles = fileLoggerOptions.MaxRolloverFiles;
+ configuration.UseLocalTime = Settings.UseLocalTime;
+ configuration.UseMask = Settings.UseMask;
+ configuration.Mask = fileLoggerOptions.Mask;
+ configuration.UseDefaultMasking = Settings.UseDefaultMasking;
+ configuration.MaskedKeywords = fileLoggerOptions.MaskedKeywords;
+ }));
+
+ var serviceProvider = serviceCollection.BuildServiceProvider();
+ LoggerProvider = serviceProvider.GetService();
+ LoggerFactory = serviceProvider.GetService();
+ Logger = LoggerFactory.CreateLogger(Settings.Id);
+ LogHelper.SendToFile(Logger, Settings, ELogType.INFO, LogHelper.GetStartupMessage());
+ }
+
+ 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.IsNullOrWhiteSpace(message) || logType == ELogType.NONE || !IsLogLevelEnabled(logType) || _isDisposing)
+ {
+ return;
+ }
+
+ if (!IsRunning)
+ {
+ await StartNewLogAsync().ConfigureAwait(false);
+ }
+
+ var messageWithHeader = LogHelper.FormatMessageWithHeader(Settings, logType, message, dateTime, _category);
+ var writeToConsoleValue = writeToConsole.GetValueOrDefault(Settings.EnableConsole);
+ var sendToSyslogServersValue = sendToSyslogServers.GetValueOrDefault(Settings.SendToSyslogServers);
+ var sendToSplunkServersValue = sendToSplunkServers.GetValueOrDefault(Settings.SendToSplunkServers);
+ var sendToGrayLogServersValue = sendToGrayLogServers.GetValueOrDefault(Settings.SendToGrayLogServers);
+
+ LogHelper.SendToFile(Logger, Settings, logType, message);
+
+ if (writeToConsoleValue)
+ {
+ LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
+ }
+
+ var tasks = new List(3);
+ if (sendToSyslogServersValue)
+ {
+ 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 (tasks.Count > 0)
+ {
+ await Task.WhenAll(tasks).ConfigureAwait(false);
+ }
+
+ var logMessage = new EonaCatLogMessage
+ {
+ DateTime = dateTime,
+ Message = message,
+ LogType = logType,
+ Origin = string.IsNullOrEmpty(Settings.LogOrigin) ? "LogManager" : Settings.LogOrigin
+ };
+ Settings.OnLogEvent(logMessage);
}
private bool IsLogLevelEnabled(ELogType logType)
@@ -285,69 +276,69 @@ namespace EonaCat.Logger.Managers
return isEnabled;
}
- public void Reset()
- {
- Settings.ResetLogEvent();
- }
-
- private void LogHelper_OnException(object sender, ErrorMessage e)
- {
- OnException?.Invoke(sender, e);
- }
-
- private void SetupFileLogger(LoggerSettings settings = null, string logFolder = null, bool defaultPrefix = true)
- {
- if (settings == null)
- {
- settings = Settings;
- }
-
- if (!settings.EnableFileLogging)
- {
- return;
- }
-
- if (logFolder != null)
- {
- settings.FileLoggerOptions.LogDirectory = logFolder;
- }
-
- if (string.IsNullOrWhiteSpace(settings.FileLoggerOptions.FileNamePrefix))
- {
- settings.FileLoggerOptions.FileNamePrefix = defaultPrefix ? "EonaCat" : string.Empty;
- }
- }
-
- private void SetupLogManager()
- {
- AppDomain.CurrentDomain.ProcessExit += ProcessExit;
- _logDate = CurrentDateTime;
- }
-
- private void ProcessExit(object sender, EventArgs e)
- {
- Dispose();
- }
-
- private Task StopLoggingAsync()
- {
- WriteStopMessage();
- IsRunning = false;
- return Task.CompletedTask;
- }
-
- private void WriteStopMessage()
- {
- var stopMessage = $"{DllInfo.ApplicationName} stopped.{Environment.NewLine}";
- LogHelper.SendToFile(Logger, Settings, ELogType.INFO, stopMessage);
- }
-
- public void DeleteCurrentLogFile()
- {
- if (!string.IsNullOrEmpty(CurrentLogFile))
- {
- File.Delete(CurrentLogFile);
- }
- }
- }
+ public void Reset()
+ {
+ Settings.ResetLogEvent();
+ }
+
+ private void LogHelper_OnException(object sender, ErrorMessage e)
+ {
+ OnException?.Invoke(sender, e);
+ }
+
+ private void SetupFileLogger(LoggerSettings settings = null, string logFolder = null, bool defaultPrefix = true)
+ {
+ if (settings == null)
+ {
+ settings = Settings;
+ }
+
+ if (!settings.EnableFileLogging)
+ {
+ return;
+ }
+
+ if (logFolder != null)
+ {
+ settings.FileLoggerOptions.LogDirectory = logFolder;
+ }
+
+ if (string.IsNullOrWhiteSpace(settings.FileLoggerOptions.FileNamePrefix))
+ {
+ settings.FileLoggerOptions.FileNamePrefix = defaultPrefix ? "EonaCat" : string.Empty;
+ }
+ }
+
+ private void SetupLogManager()
+ {
+ AppDomain.CurrentDomain.ProcessExit += ProcessExit;
+ _logDate = CurrentDateTime;
+ }
+
+ private void ProcessExit(object sender, EventArgs e)
+ {
+ Dispose();
+ }
+
+ private Task StopLoggingAsync()
+ {
+ WriteStopMessage();
+ IsRunning = false;
+ return Task.CompletedTask;
+ }
+
+ private void WriteStopMessage()
+ {
+ var stopMessage = $"{DllInfo.ApplicationName} stopped.{Environment.NewLine}";
+ LogHelper.SendToFile(Logger, Settings, ELogType.INFO, stopMessage);
+ }
+
+ public void DeleteCurrentLogFile()
+ {
+ if (!string.IsNullOrEmpty(CurrentLogFile))
+ {
+ File.Delete(CurrentLogFile);
+ }
+ }
+ }
}
\ No newline at end of file