This commit is contained in:
2025-02-16 13:30:54 +01:00
parent 0991422672
commit 99b3417186
15 changed files with 541 additions and 99 deletions

View File

@@ -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>
/// Message severity.
/// </summary>

View File

@@ -3,7 +3,7 @@
<TargetFrameworks>.netstandard2.1; net6.0; net7.0; net8.0; net4.8;</TargetFrameworks>
<ApplicationIcon>icon.ico</ApplicationIcon>
<LangVersion>latest</LangVersion>
<FileVersion>1.3.8</FileVersion>
<FileVersion>1.3.9</FileVersion>
<Authors>EonaCat (Jeroen Saey)</Authors>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<Company>EonaCat (Jeroen Saey)</Company>
@@ -24,7 +24,7 @@
</PropertyGroup>
<PropertyGroup>
<EVRevisionFormat>1.3.8+{chash:10}.{c:ymd}</EVRevisionFormat>
<EVRevisionFormat>1.3.9+{chash:10}.{c:ymd}</EVRevisionFormat>
<EVDefault>true</EVDefault>
<EVInfo>true</EVInfo>
<EVTagMatch>v[0-9]*</EVTagMatch>

View File

@@ -9,9 +9,9 @@ public interface ILogManager
{
Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = 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,
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);
}

View File

@@ -30,6 +30,44 @@ internal static class LogHelper
private static readonly string MachineName = Environment.MachineName;
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,
DateTime dateTime, string category = null)
{
@@ -62,9 +100,12 @@ internal static class LogHelper
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)
{
@@ -121,6 +162,7 @@ internal static class LogHelper
Log(logger, logType.ToLogLevel(), message);
}
}
private static bool IsLogLevelEnabled(LoggerSettings loggerSettings, ELogType logType)
{
if (loggerSettings == null)
@@ -129,18 +171,50 @@ internal static class LogHelper
return false;
}
var isEnabled = loggerSettings.MaxLogType != ELogType.NONE && logType <= loggerSettings.MaxLogType;
if (!isEnabled)
var isEnabled = loggerSettings.TypesToLog == null || loggerSettings.TypesToLog.Count == 0 || loggerSettings.TypesToLog.Contains(logType);
if (logType == ELogType.NONE || !isEnabled)
{
OnLogLevelDisabled?.Invoke(null, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled." });
return false;
}
return isEnabled;
return true;
}
public static void SetLogLevel(LoggerSettings settings, ELogType logType)
public static void AddLogLevel(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)
@@ -148,7 +222,12 @@ internal static class LogHelper
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)
{
@@ -166,7 +245,18 @@ internal static class LogHelper
{
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)
{
LogError($"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}");
@@ -184,7 +274,7 @@ internal static class LogHelper
/// <summary>
/// Overload for sending a simple log message to Splunk.
/// </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))
{
@@ -200,10 +290,10 @@ internal static class LogHelper
{
Host = Environment.MachineName,
EventData = message,
SourceType = logType
SourceType = logType,
};
await SendToSplunkServersAsync(settings, splunkPayload);
await SendToSplunkServersAsync(settings, splunkPayload, logType, disableSplunkSSL);
}
/// <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")
{
if (settings == null || string.IsNullOrWhiteSpace(message))
@@ -235,7 +325,7 @@ internal static class LogHelper
version,
host = MachineName,
short_message = message,
level = logLevel.ToGrayLogLevel(),
level = logType.ToGrayLogLevel(),
facility,
source,
timestamp = DateTime.UtcNow.ToUnixTimestamp()
@@ -249,6 +339,18 @@ internal static class LogHelper
{
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)
{
// 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))
{
@@ -322,6 +424,27 @@ internal static class LogHelper
{
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);
if (data.Length <= MaxUdpPacketSize)
@@ -353,7 +476,7 @@ internal static class LogHelper
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))
{
@@ -371,9 +494,19 @@ internal static class LogHelper
{
try
{
var isEnabled = server.TypesToLog == null || server.TypesToLog.Count == 0 || server.TypesToLog.Contains(logType);
if (logType == ELogType.NONE || !isEnabled)
{
server?.DisposeTcp();
return;
}
if (!server.IsConnected)
{
server.SetTcp();
}
var data = Encoding.UTF8.GetBytes(message);
server.DisposeTcp();
server.SetTcp();
await server.WriteAsync(data).ConfigureAwait(false);
}
catch (Exception ex)
@@ -389,7 +522,7 @@ internal static class LogHelper
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))
{
@@ -407,9 +540,19 @@ internal static class LogHelper
{
try
{
var isEnabled = server.TypesToLog == null || server.TypesToLog.Count == 0 || server.TypesToLog.Contains(logType);
if (logType == ELogType.NONE || !isEnabled)
{
server?.DisposeUdp();
return;
}
if (!server.IsConnected)
{
server.SetUdp();
}
var data = Encoding.UTF8.GetBytes(message);
server.DisposeUdp();
server.SetUdp();
await server.WriteAsync(data).ConfigureAwait(false);
}
catch (Exception ex)

View File

@@ -79,7 +79,7 @@ namespace EonaCat.Logger.Managers
public async Task WriteAsync(Exception exception, string module = null, string method = null,
bool criticalException = false,
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)
{
@@ -89,13 +89,13 @@ namespace EonaCat.Logger.Managers
await WriteAsync(exception.FormatExceptionToMessage(module, method),
criticalException ? ELogType.CRITICAL : ELogType.ERROR, writeToConsole,
customSplunkSourceType, grayLogFacility, grayLogSource,
grayLogVersion);
grayLogVersion, disableSplunkSSL = false);
}
public async Task WriteAsync(string message, ELogType logType = ELogType.INFO, bool? writeToConsole = null,
string customSplunkSourceType = null,
string grayLogFacility = null, string grayLogSource = null,
string grayLogVersion = "1.1")
string grayLogVersion = "1.1", bool disableSplunkSSL = false)
{
if (logType == ELogType.NONE)
{
@@ -103,7 +103,7 @@ namespace EonaCat.Logger.Managers
}
await InternalWriteAsync(CurrentDateTime, message, logType, writeToConsole,
customSplunkSourceType, grayLogFacility, grayLogSource, grayLogVersion);
customSplunkSourceType, grayLogFacility, grayLogSource, grayLogVersion, disableSplunkSSL);
}
/// <summary>
@@ -121,7 +121,6 @@ namespace EonaCat.Logger.Managers
var settings = new LoggerSettings
{
Id = "EonaCatLogger",
MaxLogType = ELogType.INFO
};
return settings;
}
@@ -164,7 +163,7 @@ namespace EonaCat.Logger.Managers
LoggerFactory?.Dispose();
IServiceCollection serviceCollection = new ServiceCollection();
serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.MaxLogType.ToLogLevel())
serviceCollection.AddLogging(builder => builder.SetMinimumLevel(Settings.TypesToLog.Min().ToLogLevel())
.AddEonaCatFileLogger(configuration =>
{
var fileLoggerOptions = Settings.FileLoggerOptions;
@@ -193,7 +192,7 @@ namespace EonaCat.Logger.Managers
private async Task InternalWriteAsync(DateTime dateTime, string message, ELogType logType = ELogType.INFO,
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)
{
@@ -212,16 +211,16 @@ namespace EonaCat.Logger.Managers
if (writeToConsoleValue)
{
LogHelper.SendToConsole(Settings, logType, messageWithHeader, true);
LogHelper.SendToConsole(Settings, logType, messageWithHeader);
}
var tasks = new List<Task>(5)
{
LogHelper.SendToSysLogServersAsync(Settings, messageWithHeader),
LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader),
LogHelper.SendToSysLogServersAsync(Settings, message, logType, dateTime, _category),
LogHelper.SendToSplunkServersAsync(Settings, customSplunkSourceType ?? logType.ToString(), messageWithHeader, disableSplunkSSL),
LogHelper.SendToGrayLogServersAsync(Settings, messageWithHeader, logType, grayLogFacility, grayLogSource, grayLogVersion),
LogHelper.SendToTcpLogServersAsync(Settings, messageWithHeader),
LogHelper.SendToUdpLogServersAsync(Settings, messageWithHeader),
LogHelper.SendToTcpLogServersAsync(Settings, messageWithHeader, logType),
LogHelper.SendToUdpLogServersAsync(Settings, messageWithHeader, logType),
};
if (tasks.Count > 0)
@@ -247,12 +246,13 @@ namespace EonaCat.Logger.Managers
return false;
}
var isEnabled = Settings.MaxLogType != ELogType.NONE && logType <= Settings.MaxLogType;
if (!isEnabled)
var isEnabled = Settings.TypesToLog == null || Settings.TypesToLog.Count == 0 || Settings.TypesToLog.Contains(logType);
if (logType == ELogType.NONE || !isEnabled)
{
OnLogLevelDisabled?.Invoke(this, new ErrorMessage { Message = $"Logtype '{logType}' is not enabled, cannot log message" });
return false;
}
return isEnabled;
return true;
}
public void Reset()
@@ -321,13 +321,16 @@ namespace EonaCat.Logger.Managers
}
/// <summary>
/// Add sysLog server
/// Add Syslog server
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
/// <param name="nickName"></param>
/// <param name="typesToLog"></param>
/// <param name="convertToRfc5424"></param>
/// <param name="convertToRfc3164"></param>
/// <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)
{
@@ -339,7 +342,7 @@ namespace EonaCat.Logger.Managers
return false;
}
Settings.SysLogServers.Add(new Syslog(address, port));
Settings.SysLogServers.Add(new Syslog(address, port, nickName, typesToLog, convertToRfc5424, convertToRfc3164));
return true;
}
@@ -389,10 +392,11 @@ namespace EonaCat.Logger.Managers
/// </summary>
/// <param name="splunkHecUrl"></param>
/// <param name="splunkHecToken"></param>
/// <param name="httpClientHandler">(optional)</param>
/// <param name="nickName">(optional)</param>
/// <param name="httpClientHandler"></param>
/// <param name="nickName"></param>
/// <param name="typesToLog"></param>
/// <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)
{
@@ -404,7 +408,7 @@ namespace EonaCat.Logger.Managers
return false;
}
Settings.SplunkServers.Add(new Splunk(splunkHecUrl, splunkHecToken, httpClientHandler, nickName));
Settings.SplunkServers.Add(new Splunk(splunkHecUrl, splunkHecToken, httpClientHandler, nickName, typesToLog));
return true;
}
@@ -450,13 +454,14 @@ namespace EonaCat.Logger.Managers
}
/// <summary>
/// Add GrayLog server
/// Add Graylog server
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
/// <param name="nickName"></param>
/// <param name="typesToLog"></param>
/// <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)
{
@@ -468,7 +473,7 @@ namespace EonaCat.Logger.Managers
return false;
}
Settings.GrayLogServers.Add(new Graylog(address, port));
Settings.GrayLogServers.Add(new Graylog(address, port, nickName, typesToLog));
return true;
}
@@ -514,13 +519,14 @@ namespace EonaCat.Logger.Managers
}
/// <summary>
/// Add Tcp server
/// Add Tcp Server
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
/// <param name="nickName"></param>
/// <param name="typesToLog"></param>
/// <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)
{
@@ -532,7 +538,7 @@ namespace EonaCat.Logger.Managers
return false;
}
Settings.TcpServers.Add(new Tcp(address, port));
Settings.TcpServers.Add(new Tcp(address, port, nickName, typesToLog));
return true;
}
@@ -578,13 +584,14 @@ namespace EonaCat.Logger.Managers
}
/// <summary>
/// Add Udp server
/// Add Udp Server
/// </summary>
/// <param name="address"></param>
/// <param name="port"></param>
/// <param name="nickName"></param>
/// <param name="typesToLog"></param>
/// <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)
{
@@ -596,7 +603,7 @@ namespace EonaCat.Logger.Managers
return false;
}
Settings.UdpServers.Add(new Udp(address, port));
Settings.UdpServers.Add(new Udp(address, port, nickName, typesToLog));
return true;
}

View File

@@ -23,7 +23,6 @@ public class LoggerSettings
private FileLoggerOptions _fileLoggerOptions;
private string _headerFormat = "{ts} {host} {category} {thread} {sev}";
private int _maxMessageLength = 1024;
private string _timestampFormat = "yyyy-MM-dd HH:mm:ss";
/// <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<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<Servers.Tcp.Tcp> TcpServers { get; internal set; }
@@ -232,4 +244,100 @@ public class LoggerSettings
{
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);
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
namespace EonaCat.Logger.Servers.GrayLog;
@@ -21,10 +22,20 @@ public class Graylog : IDisposable
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));
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
TypesToLog = typesToLog;
Nickname = nickName ?? IpPort;
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()
{
DisposeUdp();
Udp = new UdpClient(_Hostname, _Port);
try
{
DisposeUdp();
Udp = new UdpClient(_Hostname, _Port);
IsConnected = true;
}
catch
{
IsConnected = false;
}
}
private void DisposeUdp()
internal void DisposeUdp()
{
if (Udp != null)
{
Udp.Dispose();
IsConnected = false;
try
{
Udp?.Close();
Udp.Dispose();
}
catch
{
// Do nothing
}
Udp = null;
}
}

View File

@@ -1,8 +1,4 @@
using System;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using EonaCat.Json;
using EonaCat.Json;
namespace EonaCat.Logger.Servers.Splunk;
@@ -14,6 +10,7 @@ using EonaCat.Logger.Servers.Splunk.Models;
/// Splunk Server.
/// </summary>
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
@@ -33,13 +30,23 @@ public class Splunk : IDisposable
public bool IsHttpsHecUrl => HasHecUrl && _splunkHecUrl.ToLower().StartsWith("https");
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));
SplunkHecToken = splunkHecToken ?? throw new ArgumentNullException(nameof(splunkHecToken));
Nickname = nickName ?? $"{splunkHecUrl}_{splunkHecToken}";
SplunkClientHandler = httpClientHandler ?? new HttpClientHandler();
TypesToLog = typesToLog;
CreateHttpClient();
}
@@ -59,6 +66,8 @@ public class Splunk : IDisposable
}
}
public List<ELogType> TypesToLog { get; set; }
private void CreateHttpClient()
{
DisposeHttpClient();
@@ -84,7 +93,7 @@ public class Splunk : IDisposable
CreateHttpClient();
}
public async Task<HttpResponseMessage> SendAsync(SplunkPayload splunkPayload)
public async Task<HttpResponseMessage> SendAsync(SplunkPayload splunkPayload, bool disableSplunkSSL = false)
{
if (splunkPayload == null) return null;
@@ -95,6 +104,16 @@ public class Splunk : IDisposable
host = splunkPayload.Host
};
if (disableSplunkSSL)
{
DisableSSLValidation();
}
if (HttpClient == null)
{
CreateHttpClient();
}
var eventJson = JsonHelper.ToJson(eventObject);
if (!HasHecToken) CreateHttpClient();
@@ -102,7 +121,7 @@ public class Splunk : IDisposable
return await HttpClient.PostAsync("/services/collector/event", content);
}
private void DisposeHttpClient()
internal void DisposeHttpClient()
{
if (HttpClient != null)
{

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
namespace EonaCat.Logger.Servers.Syslog;
@@ -12,17 +13,29 @@ public class Syslog : IDisposable
{
private string _Hostname = "127.0.0.1";
private int _Port = 514;
private bool IsConnected { get; set; }
public bool IsConnected { get; private set; }
internal UdpClient Udp;
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;
Port = port;
Nickname = nickName ?? IpPort;
TypesToLog = typesToLog;
ConvertToRfc5424 = convertToRfc5424;
ConvertToRfc3164 = convertToRfc3164;
}
public string Hostname
@@ -54,8 +67,11 @@ public class Syslog : IDisposable
public string IpPort => _Hostname + ":" + _Port;
public bool SupportsTcp { 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
{
@@ -69,12 +85,21 @@ public class Syslog : IDisposable
}
}
private void DisposeUdp()
internal void DisposeUdp()
{
if (Udp != null)
{
IsConnected = false;
Udp.Dispose();
try
{
Udp?.Close();
Udp.Dispose();
}
catch
{
// Do nothing
}
Udp = null;
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
@@ -12,16 +13,27 @@ namespace EonaCat.Logger.Servers.Tcp
private int _Port = 514;
internal TcpClient _tcp;
private bool IsConnected { get; set; }
public bool IsConnected { get; private set; }
public string Nickname { get; set; }
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));
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
Nickname = nickname ?? IpPort;
TypesToLog = typesToLog;
SetTcp();
}
@@ -51,6 +63,8 @@ namespace EonaCat.Logger.Servers.Tcp
}
}
public List<ELogType> TypesToLog { get; set; }
internal void SetTcp()
{
try
@@ -70,9 +84,17 @@ namespace EonaCat.Logger.Servers.Tcp
if (_tcp != null)
{
IsConnected = false;
_tcp.Close();
_tcp.Dispose();
_tcp = null;
try
{
_tcp.Close();
_tcp.Dispose();
_tcp = null;
}
catch
{
// Do nothing
}
}
}

View File

@@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
@@ -13,15 +14,24 @@ namespace EonaCat.Logger.Servers.Udp
private int _Port = 514;
internal UdpClient _udp;
private bool IsConnected { get; set; }
public bool IsConnected { get; private set; }
public string Nickname { get; set; }
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));
_Port = port >= 0 ? port : throw new ArgumentException("Port must be zero or greater.");
TypesToLog = typesToLog;
Nickname = nickname ?? IpPort;
SetUdp();
}
@@ -52,6 +62,8 @@ namespace EonaCat.Logger.Servers.Udp
}
}
public List<ELogType> TypesToLog { get; set; }
internal void SetUdp()
{
try
@@ -71,7 +83,16 @@ namespace EonaCat.Logger.Servers.Udp
if (_udp != null)
{
IsConnected = false;
_udp.Dispose();
try
{
_udp?.Close();
_udp.Dispose();
}
catch
{
// Do nothing
}
_udp = null;
}
}

View File

@@ -11,6 +11,13 @@ namespace EonaCat.Logger.Servers.Zabbix.API;
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)
{
_user = user;

View File

@@ -22,6 +22,12 @@ namespace EonaCat.Logger.Servers.Zabbix
/// </summary>
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)
{
Request = "sender data";

View File

@@ -8,22 +8,29 @@ namespace EonaCat.Logger.Test.Web;
public class Logger
{
private LogManager _logManager;
public ELogType MaxLogType { get; set; }
public List<ELogType> TypesToLog { get; set; } = new List<ELogType>();
public LoggerSettings LoggerSettings { get; }
public bool UseLocalTime { get; set; }
public string LogFolder { get; set; } = Path.Combine(FileLoggerOptions.DefaultPath, "logs");
public string CurrentLogFile => _logManager.CurrentLogFile;
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;
MaxLogType = maxLogType;
TypesToLog = typesToLog;
LoggerSettings = new LoggerSettings
{
Id = name,
MaxLogType = MaxLogType,
TypesToLog = TypesToLog,
UseLocalTime = UseLocalTime,
FileLoggerOptions =
{
@@ -129,7 +136,7 @@ public class Logger
return;
}
if (ELogType.ERROR <= MaxLogType)
if (TypesToLog.Contains(ELogType.ERROR))
{
await _logManager.WriteAsync(exception, message, writeToConsole: writeToConsole).ConfigureAwait(false);
}

View File

@@ -18,7 +18,13 @@ var defaultColor = Console.ForegroundColor;
// Add services to the container.
Logger logger = new Logger();
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.UseMask = true;
@@ -119,7 +125,7 @@ void RunLoggingExceptionTests()
var loggerSettings = new LoggerSettings();
loggerSettings.FileLoggerOptions.UseLocalTime = true;
loggerSettings.UseLocalTime = true;
loggerSettings.MaxLogType = ELogType.INFO;
loggerSettings.TypesToLog.Add(ELogType.INFO);
var logger = new LogManager(loggerSettings);
for (var i = 0; i < 10; i++)
@@ -215,7 +221,18 @@ async Task RunLoggingTestsAsync()
var loggerSettings = new LoggerSettings();
loggerSettings.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.FileNamePrefix = "AllTypes";
loggerSettings.FileLoggerOptions.MaxRolloverFiles = 5;