Updated
This commit is contained in:
@@ -150,6 +150,34 @@ public static class LogTypeConverter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public enum SyslogFacility
|
||||||
|
{
|
||||||
|
Kernel = 0, // 0 - Kernel messages
|
||||||
|
UserLevel = 1, // 1 - User-level messages
|
||||||
|
MailSystem = 2, // 2 - Mail system
|
||||||
|
Daemon = 3, // 3 - Daemon messages
|
||||||
|
Auth = 4, // 4 - Security/authorization messages
|
||||||
|
Syslog = 5, // 5 - Messages generated by syslogd
|
||||||
|
Lpr = 6, // 6 - Line printer subsystem
|
||||||
|
News = 7, // 7 - Network news subsystem
|
||||||
|
UUCP = 8, // 8 - UUCP subsystem
|
||||||
|
Clock = 9, // 9 - Clock daemon
|
||||||
|
AuthPriv = 10, // 10 - Security/authorization messages (privileged)
|
||||||
|
Ftp = 11, // 11 - FTP daemon
|
||||||
|
Ntp = 12, // 12 - NTP subsystem
|
||||||
|
Audit = 13, // 13 - Audit messages
|
||||||
|
Alert = 14, // 14 - Log alert messages
|
||||||
|
Cron = 15, // 15 - Cron daemon
|
||||||
|
Local0 = 16, // 16 - Local use 0 (custom usage)
|
||||||
|
Local1 = 17, // 17 - Local use 1 (custom usage)
|
||||||
|
Local2 = 18, // 18 - Local use 2 (custom usage)
|
||||||
|
Local3 = 19, // 19 - Local use 3 (custom usage)
|
||||||
|
Local4 = 20, // 20 - Local use 4 (custom usage)
|
||||||
|
Local5 = 21, // 21 - Local use 5 (custom usage)
|
||||||
|
Local6 = 22, // 22 - Local use 6 (custom usage)
|
||||||
|
Local7 = 23 // 23 - Local use 7 (custom usage)
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Message severity.
|
/// Message severity.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -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.8</FileVersion>
|
<FileVersion>1.3.9</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.8+{chash:10}.{c:ymd}</EVRevisionFormat>
|
<EVRevisionFormat>1.3.9+{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>
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ public interface ILogManager
|
|||||||
{
|
{
|
||||||
Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null,
|
Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null,
|
||||||
string customSplunkSourceType = null, string grayLogFacility = null, string grayLogSource = null,
|
string customSplunkSourceType = null, string grayLogFacility = null, string grayLogSource = null,
|
||||||
string grayLogVersion = "1.1");
|
string grayLogVersion = "1.1", bool disableSplunkSSL = false);
|
||||||
|
|
||||||
Task WriteAsync(Exception exception, string module = null, string method = null, bool criticalException = false,
|
Task WriteAsync(Exception exception, string module = null, string method = null, bool criticalException = false,
|
||||||
bool? writeToConsole = null, string customSplunkSourceType = null, string grayLogFacility = null,
|
bool? writeToConsole = null, string customSplunkSourceType = null, string grayLogFacility = null,
|
||||||
string grayLogSource = null, string grayLogVersion = "1.1");
|
string grayLogSource = null, string grayLogVersion = "1.1", bool disableSplunkSSL = false);
|
||||||
}
|
}
|
||||||
@@ -30,6 +30,44 @@ internal static class LogHelper
|
|||||||
private static readonly string MachineName = Environment.MachineName;
|
private static readonly string MachineName = Environment.MachineName;
|
||||||
private static readonly string HostName = Dns.GetHostName();
|
private static readonly string HostName = Dns.GetHostName();
|
||||||
|
|
||||||
|
internal static string ConvertToSyslogRfc5424(LoggerSettings settings, ELogType logType, string currentMessage, DateTime dateTime, string category = null)
|
||||||
|
{
|
||||||
|
string formattedMessage = FormatMessageWithHeader(settings, logType, currentMessage, dateTime, category);
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(formattedMessage))
|
||||||
|
{
|
||||||
|
return formattedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
string hostname = HostName;
|
||||||
|
|
||||||
|
int facility = (int)SyslogFacility.Local0;
|
||||||
|
int severity = (int)logType;
|
||||||
|
int pri = (facility * 8) + severity;
|
||||||
|
string timestamp = dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffZ");
|
||||||
|
string syslogMessage = $"<{pri}>1 {timestamp} {hostname} {settings?.Id ?? "EonaCatLogger"} - - {formattedMessage}";
|
||||||
|
return syslogMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
internal static string ConvertToSyslogRfc3164(LoggerSettings settings, ELogType logType, string currentMessage, DateTime dateTime, string category = null)
|
||||||
|
{
|
||||||
|
string formattedMessage = FormatMessageWithHeader(settings, logType, currentMessage, dateTime, category);
|
||||||
|
|
||||||
|
if (string.IsNullOrWhiteSpace(formattedMessage))
|
||||||
|
{
|
||||||
|
return formattedMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
string hostname = HostName;
|
||||||
|
int facility = (int)SyslogFacility.Local0;
|
||||||
|
int severity = (int)logType;
|
||||||
|
int pri = (facility * 8) + severity;
|
||||||
|
string timestamp = dateTime.ToString("MMM dd HH:mm:ss");
|
||||||
|
string syslogMessage = $"<{pri}>{timestamp} {hostname} {settings?.Id ?? "EonaCatLogger"}: {formattedMessage}";
|
||||||
|
return syslogMessage;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
||||||
{
|
{
|
||||||
@@ -62,9 +100,12 @@ internal static class LogHelper
|
|||||||
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)
|
||||||
{
|
{
|
||||||
if (settings == null || !writeToConsole || string.IsNullOrWhiteSpace(message)) return;
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (settings.EnableColors && settings.Colors != null)
|
if (settings.EnableColors && settings.Colors != null)
|
||||||
{
|
{
|
||||||
@@ -121,6 +162,7 @@ internal static class LogHelper
|
|||||||
Log(logger, logType.ToLogLevel(), message);
|
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)
|
||||||
@@ -129,18 +171,50 @@ internal static class LogHelper
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var isEnabled = loggerSettings.MaxLogType != ELogType.NONE && logType <= loggerSettings.MaxLogType;
|
var isEnabled = loggerSettings.TypesToLog == null || loggerSettings.TypesToLog.Count == 0 || loggerSettings.TypesToLog.Contains(logType);
|
||||||
if (!isEnabled)
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
{
|
{
|
||||||
OnLogLevelDisabled?.Invoke(null, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled." });
|
OnLogLevelDisabled?.Invoke(null, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled." });
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return isEnabled;
|
public static void AddLogLevel(LoggerSettings settings, ELogType logType)
|
||||||
}
|
|
||||||
|
|
||||||
public static void SetLogLevel(LoggerSettings settings, ELogType logType)
|
|
||||||
{
|
{
|
||||||
settings.MaxLogType = logType;
|
if (logType == ELogType.NONE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.TypesToLog == null || settings.TypesToLog.Count == 0)
|
||||||
|
{
|
||||||
|
settings.TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!settings.TypesToLog.Contains(logType))
|
||||||
|
{
|
||||||
|
settings.TypesToLog.Add(logType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void RemoveLogLevel(LoggerSettings settings, ELogType logType)
|
||||||
|
{
|
||||||
|
if (logType == ELogType.NONE)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (settings.TypesToLog == null || settings.TypesToLog.Count == 0)
|
||||||
|
{
|
||||||
|
settings.TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!settings.TypesToLog.Contains(logType))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
settings.TypesToLog.Remove(logType);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void Log(ILogger logger, LogLevel logLevel, string message)
|
private static void Log(ILogger logger, LogLevel logLevel, string message)
|
||||||
@@ -148,7 +222,12 @@ internal static class LogHelper
|
|||||||
logger.Log(logLevel, message);
|
logger.Log(logLevel, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload)
|
private static bool TryGetEnumValue<TEnum>(string value, out TEnum result) where TEnum : struct, Enum
|
||||||
|
{
|
||||||
|
return Enum.TryParse(value, true, out result);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task SendToSplunkServersAsync(LoggerSettings settings, SplunkPayload splunkPayload, string logType, bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (settings == null || splunkPayload == null)
|
if (settings == null || splunkPayload == null)
|
||||||
{
|
{
|
||||||
@@ -166,7 +245,18 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var response = await splunkServer.SendAsync(splunkPayload);
|
bool isValid = TryGetEnumValue(logType, out ELogType currentLogType);
|
||||||
|
if (isValid)
|
||||||
|
{
|
||||||
|
var isEnabled = splunkServer.TypesToLog == null || splunkServer.TypesToLog.Count == 0 || splunkServer.TypesToLog.Contains(currentLogType);
|
||||||
|
if (currentLogType == ELogType.NONE || !isEnabled)
|
||||||
|
{
|
||||||
|
splunkServer?.DisposeHttpClient();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var response = await splunkServer.SendAsync(splunkPayload, disableSplunkSSL);
|
||||||
if (!response.IsSuccessStatusCode)
|
if (!response.IsSuccessStatusCode)
|
||||||
{
|
{
|
||||||
LogError($"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}");
|
LogError($"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}");
|
||||||
@@ -184,7 +274,7 @@ internal static class LogHelper
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Overload for sending a simple log message to Splunk.
|
/// Overload for sending a simple log message to Splunk.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static async Task SendToSplunkServersAsync(LoggerSettings settings, string logType, string message)
|
public static async Task SendToSplunkServersAsync(LoggerSettings settings, string logType, string message, bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (settings == null || string.IsNullOrWhiteSpace(message))
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
{
|
{
|
||||||
@@ -200,10 +290,10 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
Host = Environment.MachineName,
|
Host = Environment.MachineName,
|
||||||
EventData = message,
|
EventData = message,
|
||||||
SourceType = logType
|
SourceType = logType,
|
||||||
};
|
};
|
||||||
|
|
||||||
await SendToSplunkServersAsync(settings, splunkPayload);
|
await SendToSplunkServersAsync(settings, splunkPayload, logType, disableSplunkSSL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -215,7 +305,7 @@ internal static class LogHelper
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
internal static async Task SendToGrayLogServersAsync(LoggerSettings settings, string message, ELogType logLevel,
|
internal static async Task SendToGrayLogServersAsync(LoggerSettings settings, string message, ELogType logType,
|
||||||
string facility, string source, string version = "1.1")
|
string facility, string source, string version = "1.1")
|
||||||
{
|
{
|
||||||
if (settings == null || string.IsNullOrWhiteSpace(message))
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
@@ -235,7 +325,7 @@ internal static class LogHelper
|
|||||||
version,
|
version,
|
||||||
host = MachineName,
|
host = MachineName,
|
||||||
short_message = message,
|
short_message = message,
|
||||||
level = logLevel.ToGrayLogLevel(),
|
level = logType.ToGrayLogLevel(),
|
||||||
facility,
|
facility,
|
||||||
source,
|
source,
|
||||||
timestamp = DateTime.UtcNow.ToUnixTimestamp()
|
timestamp = DateTime.UtcNow.ToUnixTimestamp()
|
||||||
@@ -249,6 +339,18 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var isEnabled = grayLogServer.TypesToLog == null || grayLogServer.TypesToLog.Count == 0 || grayLogServer.TypesToLog.Contains(logType);
|
||||||
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
|
{
|
||||||
|
grayLogServer?.DisposeUdp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!grayLogServer.IsConnected)
|
||||||
|
{
|
||||||
|
grayLogServer.SetUdp();
|
||||||
|
}
|
||||||
|
|
||||||
if (messageBytes.Length <= MaxUdpPacketSize)
|
if (messageBytes.Length <= MaxUdpPacketSize)
|
||||||
{
|
{
|
||||||
// Send via UDP (single packet)
|
// Send via UDP (single packet)
|
||||||
@@ -302,7 +404,7 @@ internal static class LogHelper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task SendToSysLogServersAsync(LoggerSettings settings, string message)
|
internal static async Task SendToSysLogServersAsync(LoggerSettings settings, string message, ELogType logType, DateTime dateTime, string category)
|
||||||
{
|
{
|
||||||
if (settings == null || string.IsNullOrWhiteSpace(message))
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
{
|
{
|
||||||
@@ -322,6 +424,27 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
var isEnabled = server.TypesToLog == null || server.TypesToLog.Count == 0 || server.TypesToLog.Contains(logType);
|
||||||
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
|
{
|
||||||
|
server?.DisposeUdp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (server.ConvertToRfc5424)
|
||||||
|
{
|
||||||
|
message = ConvertToSyslogRfc5424(settings, logType, message, dateTime, category);
|
||||||
|
}
|
||||||
|
else if (server.ConvertToRfc3164)
|
||||||
|
{
|
||||||
|
message = ConvertToSyslogRfc3164(settings, logType, message, dateTime, category);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server.IsConnected)
|
||||||
|
{
|
||||||
|
server.SetUdp();
|
||||||
|
}
|
||||||
|
|
||||||
var data = Encoding.UTF8.GetBytes(message);
|
var data = Encoding.UTF8.GetBytes(message);
|
||||||
|
|
||||||
if (data.Length <= MaxUdpPacketSize)
|
if (data.Length <= MaxUdpPacketSize)
|
||||||
@@ -353,7 +476,7 @@ internal static class LogHelper
|
|||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task SendToTcpLogServersAsync(LoggerSettings settings, string message)
|
internal static async Task SendToTcpLogServersAsync(LoggerSettings settings, string message, ELogType logType)
|
||||||
{
|
{
|
||||||
if (settings == null || string.IsNullOrWhiteSpace(message))
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
{
|
{
|
||||||
@@ -371,9 +494,19 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var data = Encoding.UTF8.GetBytes(message);
|
var isEnabled = server.TypesToLog == null || server.TypesToLog.Count == 0 || server.TypesToLog.Contains(logType);
|
||||||
server.DisposeTcp();
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
|
{
|
||||||
|
server?.DisposeTcp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server.IsConnected)
|
||||||
|
{
|
||||||
server.SetTcp();
|
server.SetTcp();
|
||||||
|
}
|
||||||
|
|
||||||
|
var data = Encoding.UTF8.GetBytes(message);
|
||||||
await server.WriteAsync(data).ConfigureAwait(false);
|
await server.WriteAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
@@ -389,7 +522,7 @@ internal static class LogHelper
|
|||||||
await Task.WhenAll(tasks);
|
await Task.WhenAll(tasks);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal static async Task SendToUdpLogServersAsync(LoggerSettings settings, string message)
|
internal static async Task SendToUdpLogServersAsync(LoggerSettings settings, string message, ELogType logType)
|
||||||
{
|
{
|
||||||
if (settings == null || string.IsNullOrWhiteSpace(message))
|
if (settings == null || string.IsNullOrWhiteSpace(message))
|
||||||
{
|
{
|
||||||
@@ -407,9 +540,19 @@ internal static class LogHelper
|
|||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var data = Encoding.UTF8.GetBytes(message);
|
var isEnabled = server.TypesToLog == null || server.TypesToLog.Count == 0 || server.TypesToLog.Contains(logType);
|
||||||
server.DisposeUdp();
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
|
{
|
||||||
|
server?.DisposeUdp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!server.IsConnected)
|
||||||
|
{
|
||||||
server.SetUdp();
|
server.SetUdp();
|
||||||
|
}
|
||||||
|
|
||||||
|
var data = Encoding.UTF8.GetBytes(message);
|
||||||
await server.WriteAsync(data).ConfigureAwait(false);
|
await server.WriteAsync(data).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
public async Task WriteAsync(Exception exception, string module = null, string method = null,
|
public async Task WriteAsync(Exception exception, string module = null, string method = null,
|
||||||
bool criticalException = false,
|
bool criticalException = false,
|
||||||
bool? writeToConsole = null, string customSplunkSourceType = null, string grayLogFacility = null,
|
bool? writeToConsole = null, string customSplunkSourceType = null, string grayLogFacility = null,
|
||||||
string grayLogSource = null, string grayLogVersion = "1.1")
|
string grayLogSource = null, string grayLogVersion = "1.1", bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (exception == null)
|
if (exception == null)
|
||||||
{
|
{
|
||||||
@@ -89,13 +89,13 @@ namespace EonaCat.Logger.Managers
|
|||||||
await WriteAsync(exception.FormatExceptionToMessage(module, method),
|
await WriteAsync(exception.FormatExceptionToMessage(module, method),
|
||||||
criticalException ? ELogType.CRITICAL : ELogType.ERROR, writeToConsole,
|
criticalException ? ELogType.CRITICAL : ELogType.ERROR, writeToConsole,
|
||||||
customSplunkSourceType, grayLogFacility, grayLogSource,
|
customSplunkSourceType, grayLogFacility, grayLogSource,
|
||||||
grayLogVersion);
|
grayLogVersion, disableSplunkSSL = false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null,
|
public async Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null,
|
||||||
string customSplunkSourceType = null,
|
string customSplunkSourceType = null,
|
||||||
string grayLogFacility = null, string grayLogSource = null,
|
string grayLogFacility = null, string grayLogSource = null,
|
||||||
string grayLogVersion = "1.1")
|
string grayLogVersion = "1.1", bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (logType == ELogType.NONE)
|
if (logType == ELogType.NONE)
|
||||||
{
|
{
|
||||||
@@ -103,7 +103,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
await InternalWriteAsync(CurrentDateTime, message, logType, writeToConsole,
|
await InternalWriteAsync(CurrentDateTime, message, logType, writeToConsole,
|
||||||
customSplunkSourceType, grayLogFacility, grayLogSource, grayLogVersion);
|
customSplunkSourceType, grayLogFacility, grayLogSource, grayLogVersion, disableSplunkSSL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -121,7 +121,6 @@ namespace EonaCat.Logger.Managers
|
|||||||
var settings = new LoggerSettings
|
var settings = new LoggerSettings
|
||||||
{
|
{
|
||||||
Id = "EonaCatLogger",
|
Id = "EonaCatLogger",
|
||||||
MaxLogType = ELogType.INFO
|
|
||||||
};
|
};
|
||||||
return settings;
|
return settings;
|
||||||
}
|
}
|
||||||
@@ -164,7 +163,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
LoggerFactory?.Dispose();
|
LoggerFactory?.Dispose();
|
||||||
|
|
||||||
IServiceCollection serviceCollection = new ServiceCollection();
|
IServiceCollection serviceCollection = new ServiceCollection();
|
||||||
serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.MaxLogType.ToLogLevel())
|
serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.TypesToLog.Min().ToLogLevel())
|
||||||
.AddEonaCatFileLogger(configuration =>
|
.AddEonaCatFileLogger(configuration =>
|
||||||
{
|
{
|
||||||
var fileLoggerOptions = Settings.FileLoggerOptions;
|
var fileLoggerOptions = Settings.FileLoggerOptions;
|
||||||
@@ -193,7 +192,7 @@ 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, string customSplunkSourceType = null, string grayLogFacility = null,
|
bool? writeToConsole = null, string customSplunkSourceType = null, string grayLogFacility = null,
|
||||||
string grayLogSource = null, string grayLogVersion = "1.1")
|
string grayLogSource = null, string grayLogVersion = "1.1", bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(message) || logType == ELogType.NONE || !IsLogLevelEnabled(logType) || _isDisposing)
|
if (string.IsNullOrWhiteSpace(message) || logType == ELogType.NONE || !IsLogLevelEnabled(logType) || _isDisposing)
|
||||||
{
|
{
|
||||||
@@ -212,16 +211,16 @@ namespace EonaCat.Logger.Managers
|
|||||||
|
|
||||||
if (writeToConsoleValue)
|
if (writeToConsoleValue)
|
||||||
{
|
{
|
||||||
LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
|
LogHelper.SendToConsole(Settings, logType, messageWithHeader);
|
||||||
}
|
}
|
||||||
|
|
||||||
var tasks = new List<Task>(5)
|
var tasks = new List<Task>(5)
|
||||||
{
|
{
|
||||||
LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader),
|
LogHelper.SendToSysLogServersAsync(Settings, message, logType, dateTime, _category),
|
||||||
LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader),
|
LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader, disableSplunkSSL),
|
||||||
LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility, grayLogSource, grayLogVersion),
|
LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility, grayLogSource, grayLogVersion),
|
||||||
LogHelper.SendToTcpLogServersAsync(Settings, messageWithHeader),
|
LogHelper.SendToTcpLogServersAsync(Settings, messageWithHeader, logType),
|
||||||
LogHelper.SendToUdpLogServersAsync(Settings, messageWithHeader),
|
LogHelper.SendToUdpLogServersAsync(Settings, messageWithHeader, logType),
|
||||||
};
|
};
|
||||||
|
|
||||||
if (tasks.Count > 0)
|
if (tasks.Count > 0)
|
||||||
@@ -247,12 +246,13 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var isEnabled = Settings.MaxLogType != ELogType.NONE && logType <= Settings.MaxLogType;
|
var isEnabled = Settings.TypesToLog == null || Settings.TypesToLog.Count == 0 || Settings.TypesToLog.Contains(logType);
|
||||||
if (!isEnabled)
|
if (logType == ELogType.NONE || !isEnabled)
|
||||||
{
|
{
|
||||||
OnLogLevelDisabled?.Invoke(this, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled, cannot log message" });
|
OnLogLevelDisabled?.Invoke(this, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled, cannot log message" });
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
return isEnabled;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Reset()
|
public void Reset()
|
||||||
@@ -321,13 +321,16 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add sysLog server
|
/// Add Syslog server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address"></param>
|
/// <param name="address"></param>
|
||||||
/// <param name="port"></param>
|
/// <param name="port"></param>
|
||||||
/// <param name="nickName"></param>
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <param name="convertToRfc5424"></param>
|
||||||
|
/// <param name="convertToRfc3164"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddSyslogServer(string address, int port, string nickName = null)
|
public bool AddSyslogServer(string address, int port, string nickName = null, List<ELogType> typesToLog = null, bool convertToRfc5424 = false, bool convertToRfc3164 = false)
|
||||||
{
|
{
|
||||||
if (Settings.SysLogServers == null)
|
if (Settings.SysLogServers == null)
|
||||||
{
|
{
|
||||||
@@ -339,7 +342,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.SysLogServers.Add(new Syslog(address, port));
|
Settings.SysLogServers.Add(new Syslog(address, port, nickName, typesToLog, convertToRfc5424, convertToRfc3164));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -389,10 +392,11 @@ namespace EonaCat.Logger.Managers
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="splunkHecUrl"></param>
|
/// <param name="splunkHecUrl"></param>
|
||||||
/// <param name="splunkHecToken"></param>
|
/// <param name="splunkHecToken"></param>
|
||||||
/// <param name="httpClientHandler">(optional)</param>
|
/// <param name="httpClientHandler"></param>
|
||||||
/// <param name="nickName">(optional)</param>
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddSplunkServer(string splunkHecUrl, string splunkHecToken, HttpClientHandler httpClientHandler = null, string nickName = null)
|
public bool AddSplunkServer(string splunkHecUrl, string splunkHecToken, HttpClientHandler httpClientHandler = null, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
if (Settings.SplunkServers == null)
|
if (Settings.SplunkServers == null)
|
||||||
{
|
{
|
||||||
@@ -404,7 +408,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.SplunkServers.Add(new Splunk(splunkHecUrl, splunkHecToken, httpClientHandler, nickName));
|
Settings.SplunkServers.Add(new Splunk(splunkHecUrl, splunkHecToken, httpClientHandler, nickName, typesToLog));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -450,13 +454,14 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add GrayLog server
|
/// Add Graylog server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address"></param>
|
/// <param name="address"></param>
|
||||||
/// <param name="port"></param>
|
/// <param name="port"></param>
|
||||||
/// <param name="nickName"></param>
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddGrayLogServer(string address, int port, string nickName = null)
|
public bool AddGrayLogServer(string address, int port, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
if (Settings.GrayLogServers == null)
|
if (Settings.GrayLogServers == null)
|
||||||
{
|
{
|
||||||
@@ -468,7 +473,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.GrayLogServers.Add(new Graylog(address, port));
|
Settings.GrayLogServers.Add(new Graylog(address, port, nickName, typesToLog));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -514,13 +519,14 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add Tcp server
|
/// Add Tcp Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address"></param>
|
/// <param name="address"></param>
|
||||||
/// <param name="port"></param>
|
/// <param name="port"></param>
|
||||||
/// <param name="nickName"></param>
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddTcpLogServer(string address, int port, string nickName = null)
|
public bool AddTcpLogServer(string address, int port, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
if (Settings.TcpServers == null)
|
if (Settings.TcpServers == null)
|
||||||
{
|
{
|
||||||
@@ -532,7 +538,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.TcpServers.Add(new Tcp(address, port));
|
Settings.TcpServers.Add(new Tcp(address, port, nickName, typesToLog));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -578,13 +584,14 @@ namespace EonaCat.Logger.Managers
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Add Udp server
|
/// Add Udp Server
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="address"></param>
|
/// <param name="address"></param>
|
||||||
/// <param name="port"></param>
|
/// <param name="port"></param>
|
||||||
/// <param name="nickName"></param>
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public bool AddUdpLogServer(string address, int port, string nickName = null)
|
public bool AddUdpLogServer(string address, int port, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
if (Settings.UdpServers == null)
|
if (Settings.UdpServers == null)
|
||||||
{
|
{
|
||||||
@@ -596,7 +603,7 @@ namespace EonaCat.Logger.Managers
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings.UdpServers.Add(new Udp(address, port));
|
Settings.UdpServers.Add(new Udp(address, port, nickName, typesToLog));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -23,7 +23,6 @@ public class LoggerSettings
|
|||||||
private FileLoggerOptions _fileLoggerOptions;
|
private FileLoggerOptions _fileLoggerOptions;
|
||||||
|
|
||||||
private string _headerFormat = "{ts} {host} {category} {thread} {sev}";
|
private string _headerFormat = "{ts} {host} {category} {thread} {sev}";
|
||||||
private int _maxMessageLength = 1024;
|
|
||||||
private string _timestampFormat = "yyyy-MM-dd HH:mm:ss";
|
private string _timestampFormat = "yyyy-MM-dd HH:mm:ss";
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -126,9 +125,22 @@ public class LoggerSettings
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ELogType MaxLogType { get; set; } = ELogType.INFO;
|
private List<ELogType> _logTypes = new List<ELogType> { ELogType.INFO, ELogType.WARNING, ELogType.ERROR, ELogType.TRAFFIC, ELogType.DEBUG, ELogType.CRITICAL, ELogType.TRACE };
|
||||||
|
public List<ELogType> TypesToLog
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return _logTypes;
|
||||||
|
}
|
||||||
|
|
||||||
|
set
|
||||||
|
{
|
||||||
|
_logTypes = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public List<Servers.Syslog.Syslog> SysLogServers { get; internal set; }
|
public List<Servers.Syslog.Syslog> SysLogServers { get; internal set; }
|
||||||
public List<Logger.Servers.Splunk.Splunk> SplunkServers { get; internal set; }
|
public List<Servers.Splunk.Splunk> SplunkServers { get; internal set; }
|
||||||
|
|
||||||
public List<Graylog> GrayLogServers { get; internal set; }
|
public List<Graylog> GrayLogServers { get; internal set; }
|
||||||
public List<Servers.Tcp.Tcp> TcpServers { get; internal set; }
|
public List<Servers.Tcp.Tcp> TcpServers { get; internal set; }
|
||||||
@@ -232,4 +244,100 @@ public class LoggerSettings
|
|||||||
{
|
{
|
||||||
OnLog = null;
|
OnLog = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void AllowAllLogTypes()
|
||||||
|
{
|
||||||
|
TypesToLog.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogInfo()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.INFO))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.INFO);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogWarning()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.WARNING))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.WARNING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogError()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.ERROR))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogCritical()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.CRITICAL))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.CRITICAL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogTraffic()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.TRAFFIC))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.TRAFFIC);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogTrace()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.TRACE))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.TRACE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void LogDebug()
|
||||||
|
{
|
||||||
|
if (TypesToLog == null)
|
||||||
|
{
|
||||||
|
TypesToLog = new List<ELogType>();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!TypesToLog.Contains(ELogType.DEBUG))
|
||||||
|
{
|
||||||
|
TypesToLog.Add(ELogType.DEBUG);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace EonaCat.Logger.Servers.GrayLog;
|
namespace EonaCat.Logger.Servers.GrayLog;
|
||||||
@@ -21,10 +22,20 @@ public class Graylog : IDisposable
|
|||||||
|
|
||||||
public Graylog() { }
|
public Graylog() { }
|
||||||
|
|
||||||
public Graylog(string hostname = "127.0.0.1", int port = 12201, string nickName = null)
|
/// <summary>
|
||||||
|
/// Graylog server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostname"></param>
|
||||||
|
/// <param name="port"></param>
|
||||||
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="logType"></param>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
/// <exception cref="ArgumentException"></exception>
|
||||||
|
public Graylog(string hostname = "127.0.0.1", int port = 12201, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
||||||
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
||||||
|
TypesToLog = typesToLog;
|
||||||
|
|
||||||
Nickname = nickName ?? IpPort;
|
Nickname = nickName ?? IpPort;
|
||||||
SetUdp();
|
SetUdp();
|
||||||
@@ -56,17 +67,38 @@ public class Graylog : IDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SetUdp()
|
public List<ELogType> TypesToLog { get; set; }
|
||||||
|
public bool IsConnected { get; set; }
|
||||||
|
|
||||||
|
internal void SetUdp()
|
||||||
|
{
|
||||||
|
try
|
||||||
{
|
{
|
||||||
DisposeUdp();
|
DisposeUdp();
|
||||||
Udp = new UdpClient(_Hostname, _Port);
|
Udp = new UdpClient(_Hostname, _Port);
|
||||||
|
IsConnected = true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
IsConnected = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisposeUdp()
|
internal void DisposeUdp()
|
||||||
{
|
{
|
||||||
if (Udp != null)
|
if (Udp != null)
|
||||||
{
|
{
|
||||||
|
IsConnected = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Udp?.Close();
|
||||||
Udp.Dispose();
|
Udp.Dispose();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
Udp = null;
|
Udp = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,4 @@
|
|||||||
using System;
|
using EonaCat.Json;
|
||||||
using System.Net.Http;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using EonaCat.Json;
|
|
||||||
|
|
||||||
namespace EonaCat.Logger.Servers.Splunk;
|
namespace EonaCat.Logger.Servers.Splunk;
|
||||||
|
|
||||||
@@ -14,6 +10,7 @@ using EonaCat.Logger.Servers.Splunk.Models;
|
|||||||
/// Splunk Server.
|
/// Splunk Server.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -33,13 +30,23 @@ public class Splunk : IDisposable
|
|||||||
public bool IsHttpsHecUrl => HasHecUrl && _splunkHecUrl.ToLower().StartsWith("https");
|
public bool IsHttpsHecUrl => HasHecUrl && _splunkHecUrl.ToLower().StartsWith("https");
|
||||||
public bool IsLocalHost => HasHecUrl && (_splunkHecUrl.ToLower().Contains("127.0.0.1") || _splunkHecUrl.ToLower().Contains("localhost"));
|
public bool IsLocalHost => HasHecUrl && (_splunkHecUrl.ToLower().Contains("127.0.0.1") || _splunkHecUrl.ToLower().Contains("localhost"));
|
||||||
|
|
||||||
public Splunk(string splunkHecUrl, string splunkHecToken, HttpClientHandler httpClientHandler = null, string nickName = null)
|
/// <summary>
|
||||||
|
/// Splunk Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="splunkHecUrl"></param>
|
||||||
|
/// <param name="splunkHecToken"></param>
|
||||||
|
/// <param name="httpClientHandler"></param>
|
||||||
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
public Splunk(string splunkHecUrl, string splunkHecToken, HttpClientHandler httpClientHandler = null, string nickName = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
SplunkHecUrl = splunkHecUrl ?? throw new ArgumentNullException(nameof(splunkHecUrl));
|
SplunkHecUrl = splunkHecUrl ?? throw new ArgumentNullException(nameof(splunkHecUrl));
|
||||||
SplunkHecToken = splunkHecToken ?? throw new ArgumentNullException(nameof(splunkHecToken));
|
SplunkHecToken = splunkHecToken ?? throw new ArgumentNullException(nameof(splunkHecToken));
|
||||||
|
|
||||||
Nickname = nickName ?? $"{splunkHecUrl}_{splunkHecToken}";
|
Nickname = nickName ?? $"{splunkHecUrl}_{splunkHecToken}";
|
||||||
SplunkClientHandler = httpClientHandler ?? new HttpClientHandler();
|
SplunkClientHandler = httpClientHandler ?? new HttpClientHandler();
|
||||||
|
TypesToLog = typesToLog;
|
||||||
|
|
||||||
CreateHttpClient();
|
CreateHttpClient();
|
||||||
}
|
}
|
||||||
@@ -59,6 +66,8 @@ public class Splunk : IDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ELogType> TypesToLog { get; set; }
|
||||||
|
|
||||||
private void CreateHttpClient()
|
private void CreateHttpClient()
|
||||||
{
|
{
|
||||||
DisposeHttpClient();
|
DisposeHttpClient();
|
||||||
@@ -84,7 +93,7 @@ public class Splunk : IDisposable
|
|||||||
CreateHttpClient();
|
CreateHttpClient();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<HttpResponseMessage> SendAsync(SplunkPayload splunkPayload)
|
public async Task<HttpResponseMessage> SendAsync(SplunkPayload splunkPayload, bool disableSplunkSSL = false)
|
||||||
{
|
{
|
||||||
if (splunkPayload == null) return null;
|
if (splunkPayload == null) return null;
|
||||||
|
|
||||||
@@ -95,6 +104,16 @@ public class Splunk : IDisposable
|
|||||||
host = splunkPayload.Host
|
host = splunkPayload.Host
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if (disableSplunkSSL)
|
||||||
|
{
|
||||||
|
DisableSSLValidation();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (HttpClient == null)
|
||||||
|
{
|
||||||
|
CreateHttpClient();
|
||||||
|
}
|
||||||
|
|
||||||
var eventJson = JsonHelper.ToJson(eventObject);
|
var eventJson = JsonHelper.ToJson(eventObject);
|
||||||
if (!HasHecToken) CreateHttpClient();
|
if (!HasHecToken) CreateHttpClient();
|
||||||
|
|
||||||
@@ -102,7 +121,7 @@ public class Splunk : IDisposable
|
|||||||
return await HttpClient.PostAsync("/services/collector/event", content);
|
return await HttpClient.PostAsync("/services/collector/event", content);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisposeHttpClient()
|
internal void DisposeHttpClient()
|
||||||
{
|
{
|
||||||
if (HttpClient != null)
|
if (HttpClient != null)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
|
|
||||||
namespace EonaCat.Logger.Servers.Syslog;
|
namespace EonaCat.Logger.Servers.Syslog;
|
||||||
@@ -12,17 +13,29 @@ public class Syslog : IDisposable
|
|||||||
{
|
{
|
||||||
private string _Hostname = "127.0.0.1";
|
private string _Hostname = "127.0.0.1";
|
||||||
private int _Port = 514;
|
private int _Port = 514;
|
||||||
private bool IsConnected { get; set; }
|
public bool IsConnected { get; private set; }
|
||||||
|
|
||||||
internal UdpClient Udp;
|
internal UdpClient Udp;
|
||||||
|
|
||||||
public Syslog() { }
|
public Syslog() { }
|
||||||
|
|
||||||
public Syslog(string hostname = "127.0.0.1", int port = 514, string nickName = null)
|
/// <summary>
|
||||||
|
/// Syslog server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostname"></param>
|
||||||
|
/// <param name="port"></param>
|
||||||
|
/// <param name="nickName"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <param name="convertToRfc5424"></param>
|
||||||
|
/// <param name="convertToRfc3164"></param>
|
||||||
|
public Syslog(string hostname = "127.0.0.1", int port = 514, string nickName = null, List<ELogType> typesToLog = null, bool convertToRfc5424 = false, bool convertToRfc3164 = false)
|
||||||
{
|
{
|
||||||
Hostname = hostname;
|
Hostname = hostname;
|
||||||
Port = port;
|
Port = port;
|
||||||
Nickname = nickName ?? IpPort;
|
Nickname = nickName ?? IpPort;
|
||||||
|
TypesToLog = typesToLog;
|
||||||
|
ConvertToRfc5424 = convertToRfc5424;
|
||||||
|
ConvertToRfc3164 = convertToRfc3164;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Hostname
|
public string Hostname
|
||||||
@@ -54,8 +67,11 @@ public class Syslog : IDisposable
|
|||||||
public string IpPort => _Hostname + ":" + _Port;
|
public string IpPort => _Hostname + ":" + _Port;
|
||||||
public bool SupportsTcp { get; set; }
|
public bool SupportsTcp { get; set; }
|
||||||
public string Nickname { get; set; }
|
public string Nickname { get; set; }
|
||||||
|
public List<ELogType> TypesToLog { get; set; }
|
||||||
|
public bool ConvertToRfc5424 { get; set; }
|
||||||
|
public bool ConvertToRfc3164 { get; set; }
|
||||||
|
|
||||||
private void SetUdp()
|
internal void SetUdp()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -69,12 +85,21 @@ public class Syslog : IDisposable
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void DisposeUdp()
|
internal void DisposeUdp()
|
||||||
{
|
{
|
||||||
if (Udp != null)
|
if (Udp != null)
|
||||||
{
|
{
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Udp?.Close();
|
||||||
Udp.Dispose();
|
Udp.Dispose();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
Udp = null;
|
Udp = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -12,16 +13,27 @@ namespace EonaCat.Logger.Servers.Tcp
|
|||||||
private int _Port = 514;
|
private int _Port = 514;
|
||||||
internal TcpClient _tcp;
|
internal TcpClient _tcp;
|
||||||
|
|
||||||
private bool IsConnected { get; set; }
|
public bool IsConnected { get; private set; }
|
||||||
public string Nickname { get; set; }
|
public string Nickname { get; set; }
|
||||||
public string IpPort => _Hostname + ":" + _Port;
|
public string IpPort => _Hostname + ":" + _Port;
|
||||||
|
|
||||||
public Tcp(string hostname, int port, string nickname = null)
|
/// <summary>
|
||||||
|
/// Tcp Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostname"></param>
|
||||||
|
/// <param name="port"></param>
|
||||||
|
/// <param name="nickname"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
/// <exception cref="ArgumentException"></exception>
|
||||||
|
public Tcp(string hostname, int port, string nickname = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
||||||
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
||||||
|
|
||||||
Nickname = nickname ?? IpPort;
|
Nickname = nickname ?? IpPort;
|
||||||
|
TypesToLog = typesToLog;
|
||||||
|
|
||||||
SetTcp();
|
SetTcp();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,6 +63,8 @@ namespace EonaCat.Logger.Servers.Tcp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ELogType> TypesToLog { get; set; }
|
||||||
|
|
||||||
internal void SetTcp()
|
internal void SetTcp()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -70,10 +84,18 @@ namespace EonaCat.Logger.Servers.Tcp
|
|||||||
if (_tcp != null)
|
if (_tcp != null)
|
||||||
{
|
{
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
_tcp.Close();
|
_tcp.Close();
|
||||||
_tcp.Dispose();
|
_tcp.Dispose();
|
||||||
_tcp = null;
|
_tcp = null;
|
||||||
}
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Dispose()
|
public void Dispose()
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net.Sockets;
|
using System.Net.Sockets;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
@@ -13,15 +14,24 @@ namespace EonaCat.Logger.Servers.Udp
|
|||||||
private int _Port = 514;
|
private int _Port = 514;
|
||||||
internal UdpClient _udp;
|
internal UdpClient _udp;
|
||||||
|
|
||||||
private bool IsConnected { get; set; }
|
public bool IsConnected { get; private set; }
|
||||||
public string Nickname { get; set; }
|
public string Nickname { get; set; }
|
||||||
public string IpPort => _Hostname + ":" + _Port;
|
public string IpPort => _Hostname + ":" + _Port;
|
||||||
|
|
||||||
public Udp(string hostname, int port, string nickname = null)
|
/// <summary>
|
||||||
|
/// Udp Server
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="hostname"></param>
|
||||||
|
/// <param name="port"></param>
|
||||||
|
/// <param name="nickname"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <exception cref="ArgumentNullException"></exception>
|
||||||
|
/// <exception cref="ArgumentException"></exception>
|
||||||
|
public Udp(string hostname, int port, string nickname = null, List<ELogType> typesToLog = null)
|
||||||
{
|
{
|
||||||
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
_Hostname = hostname ?? throw new ArgumentNullException(nameof(hostname));
|
||||||
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
|
||||||
|
TypesToLog = typesToLog;
|
||||||
Nickname = nickname ?? IpPort;
|
Nickname = nickname ?? IpPort;
|
||||||
SetUdp();
|
SetUdp();
|
||||||
}
|
}
|
||||||
@@ -52,6 +62,8 @@ namespace EonaCat.Logger.Servers.Udp
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<ELogType> TypesToLog { get; set; }
|
||||||
|
|
||||||
internal void SetUdp()
|
internal void SetUdp()
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
@@ -71,7 +83,16 @@ namespace EonaCat.Logger.Servers.Udp
|
|||||||
if (_udp != null)
|
if (_udp != null)
|
||||||
{
|
{
|
||||||
IsConnected = false;
|
IsConnected = false;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_udp?.Close();
|
||||||
_udp.Dispose();
|
_udp.Dispose();
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Do nothing
|
||||||
|
}
|
||||||
_udp = null;
|
_udp = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,13 @@ namespace EonaCat.Logger.Servers.Zabbix.API;
|
|||||||
|
|
||||||
public class ZabbixApi
|
public class ZabbixApi
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Zabbix Api
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="user"></param>
|
||||||
|
/// <param name="password"></param>
|
||||||
|
/// <param name="zabbixURL"></param>
|
||||||
|
/// <param name="basicAuth"></param>
|
||||||
public ZabbixApi(string user, string password, string zabbixURL, bool basicAuth)
|
public ZabbixApi(string user, string password, string zabbixURL, bool basicAuth)
|
||||||
{
|
{
|
||||||
_user = user;
|
_user = user;
|
||||||
|
|||||||
@@ -22,6 +22,12 @@ namespace EonaCat.Logger.Servers.Zabbix
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public ZabbixData[] Data { get; set; }
|
public ZabbixData[] Data { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Zabbix request
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="host"></param>
|
||||||
|
/// <param name="key"></param>
|
||||||
|
/// <param name="value"></param>
|
||||||
public ZabbixRequest(string host, string key, string value)
|
public ZabbixRequest(string host, string key, string value)
|
||||||
{
|
{
|
||||||
Request = "sender data";
|
Request = "sender data";
|
||||||
|
|||||||
@@ -8,22 +8,29 @@ namespace EonaCat.Logger.Test.Web;
|
|||||||
public class Logger
|
public class Logger
|
||||||
{
|
{
|
||||||
private LogManager _logManager;
|
private LogManager _logManager;
|
||||||
public ELogType MaxLogType { get; set; }
|
public List<ELogType> TypesToLog { get; set; } = new List<ELogType>();
|
||||||
public LoggerSettings LoggerSettings { get; }
|
public LoggerSettings LoggerSettings { get; }
|
||||||
public bool UseLocalTime { get; set; }
|
public bool UseLocalTime { get; set; }
|
||||||
public string LogFolder { get; set; } = Path.Combine(FileLoggerOptions.DefaultPath, "logs");
|
public string LogFolder { get; set; } = Path.Combine(FileLoggerOptions.DefaultPath, "logs");
|
||||||
public string CurrentLogFile => _logManager.CurrentLogFile;
|
public string CurrentLogFile => _logManager.CurrentLogFile;
|
||||||
public bool IsDisabled { get; set; }
|
public bool IsDisabled { get; set; }
|
||||||
|
|
||||||
public Logger(string name = "EonaCatTestLogger", ELogType maxLogType = ELogType.INFO, bool useLocalTime = false, int maxFileSize = 20_000_000)
|
/// <summary>
|
||||||
|
/// Logger
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="typesToLog"></param>
|
||||||
|
/// <param name="useLocalTime"></param>
|
||||||
|
/// <param name="maxFileSize"></param>
|
||||||
|
public Logger(string name = "EonaCatTestLogger", List<ELogType> typesToLog = null, bool useLocalTime = false, int maxFileSize = 20_000_000)
|
||||||
{
|
{
|
||||||
UseLocalTime = useLocalTime;
|
UseLocalTime = useLocalTime;
|
||||||
MaxLogType = maxLogType;
|
TypesToLog = typesToLog;
|
||||||
|
|
||||||
LoggerSettings = new LoggerSettings
|
LoggerSettings = new LoggerSettings
|
||||||
{
|
{
|
||||||
Id = name,
|
Id = name,
|
||||||
MaxLogType = MaxLogType,
|
TypesToLog = TypesToLog,
|
||||||
UseLocalTime = UseLocalTime,
|
UseLocalTime = UseLocalTime,
|
||||||
FileLoggerOptions =
|
FileLoggerOptions =
|
||||||
{
|
{
|
||||||
@@ -129,7 +136,7 @@ public class Logger
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ELogType.ERROR <= MaxLogType)
|
if (TypesToLog.Contains(ELogType.ERROR))
|
||||||
{
|
{
|
||||||
await _logManager.WriteAsync(exception, message, writeToConsole: writeToConsole).ConfigureAwait(false);
|
await _logManager.WriteAsync(exception, message, writeToConsole: writeToConsole).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,13 @@ var defaultColor = Console.ForegroundColor;
|
|||||||
// Add services to the container.
|
// Add services to the container.
|
||||||
Logger logger = new Logger();
|
Logger logger = new Logger();
|
||||||
logger.UseLocalTime = true;
|
logger.UseLocalTime = true;
|
||||||
logger.MaxLogType = ELogType.TRACE;
|
logger.TypesToLog.Add(ELogType.INFO);
|
||||||
|
logger.TypesToLog.Add(ELogType.WARNING);
|
||||||
|
logger.TypesToLog.Add(ELogType.ERROR);
|
||||||
|
logger.TypesToLog.Add(ELogType.CRITICAL);
|
||||||
|
logger.TypesToLog.Add(ELogType.DEBUG);
|
||||||
|
logger.TypesToLog.Add(ELogType.TRACE);
|
||||||
|
logger.TypesToLog.Add(ELogType.TRAFFIC);
|
||||||
logger.LoggerSettings.OnLog += LoggerSettings_OnLog;
|
logger.LoggerSettings.OnLog += LoggerSettings_OnLog;
|
||||||
logger.LoggerSettings.UseMask = true;
|
logger.LoggerSettings.UseMask = true;
|
||||||
|
|
||||||
@@ -119,7 +125,7 @@ void RunLoggingExceptionTests()
|
|||||||
var loggerSettings = new LoggerSettings();
|
var loggerSettings = new LoggerSettings();
|
||||||
loggerSettings.FileLoggerOptions.UseLocalTime = true;
|
loggerSettings.FileLoggerOptions.UseLocalTime = true;
|
||||||
loggerSettings.UseLocalTime = true;
|
loggerSettings.UseLocalTime = true;
|
||||||
loggerSettings.MaxLogType = ELogType.INFO;
|
loggerSettings.TypesToLog.Add(ELogType.INFO);
|
||||||
var logger = new LogManager(loggerSettings);
|
var logger = new LogManager(loggerSettings);
|
||||||
|
|
||||||
for (var i = 0; i < 10; i++)
|
for (var i = 0; i < 10; i++)
|
||||||
@@ -215,7 +221,18 @@ async Task RunLoggingTestsAsync()
|
|||||||
var loggerSettings = new LoggerSettings();
|
var loggerSettings = new LoggerSettings();
|
||||||
loggerSettings.UseLocalTime = true;
|
loggerSettings.UseLocalTime = true;
|
||||||
loggerSettings.FileLoggerOptions.UseLocalTime = true;
|
loggerSettings.FileLoggerOptions.UseLocalTime = true;
|
||||||
loggerSettings.MaxLogType = ELogType.DEBUG;
|
loggerSettings.TypesToLog.Add(ELogType.INFO);
|
||||||
|
loggerSettings.TypesToLog.Add(ELogType.WARNING);
|
||||||
|
loggerSettings.TypesToLog.Add(ELogType.ERROR);
|
||||||
|
loggerSettings.TypesToLog.Add(ELogType.TRAFFIC);
|
||||||
|
loggerSettings.TypesToLog.Add(ELogType.DEBUG);
|
||||||
|
loggerSettings.LogDebug();
|
||||||
|
loggerSettings.LogInfo();
|
||||||
|
loggerSettings.LogWarning();
|
||||||
|
loggerSettings.LogError();
|
||||||
|
loggerSettings.LogCritical();
|
||||||
|
loggerSettings.LogTrace();
|
||||||
|
loggerSettings.LogTraffic();
|
||||||
loggerSettings.FileLoggerOptions.FileSizeLimit = 1024 * 1024 * 1;
|
loggerSettings.FileLoggerOptions.FileSizeLimit = 1024 * 1024 * 1;
|
||||||
loggerSettings.FileLoggerOptions.FileNamePrefix = "AllTypes";
|
loggerSettings.FileLoggerOptions.FileNamePrefix = "AllTypes";
|
||||||
loggerSettings.FileLoggerOptions.MaxRolloverFiles = 5;
|
loggerSettings.FileLoggerOptions.MaxRolloverFiles = 5;
|
||||||
|
|||||||
Reference in New Issue
Block a user