diff --git a/EonaCat.Logger/Enums.cs b/EonaCat.Logger/Enums.cs index 517b748..01d7f5c 100644 --- a/EonaCat.Logger/Enums.cs +++ b/EonaCat.Logger/Enums.cs @@ -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) +} + /// /// Message severity. /// diff --git a/EonaCat.Logger/EonaCat.Logger.csproj b/EonaCat.Logger/EonaCat.Logger.csproj index 3cf026d..f9d5a58 100644 --- a/EonaCat.Logger/EonaCat.Logger.csproj +++ b/EonaCat.Logger/EonaCat.Logger.csproj @@ -3,7 +3,7 @@ .netstandard2.1; net6.0; net7.0; net8.0; net4.8; icon.ico latest - 1.3.8 + 1.3.9 EonaCat (Jeroen Saey) true EonaCat (Jeroen Saey) @@ -24,7 +24,7 @@ - 1.3.8+{chash:10}.{c:ymd} + 1.3.9+{chash:10}.{c:ymd} true true v[0-9]* diff --git a/EonaCat.Logger/Managers/ILogManager.cs b/EonaCat.Logger/Managers/ILogManager.cs index 0260478..375233e 100644 --- a/EonaCat.Logger/Managers/ILogManager.cs +++ b/EonaCat.Logger/Managers/ILogManager.cs @@ -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); } \ No newline at end of file diff --git a/EonaCat.Logger/Managers/LogHelper.cs b/EonaCat.Logger/Managers/LogHelper.cs index fa1281c..146252f 100644 --- a/EonaCat.Logger/Managers/LogHelper.cs +++ b/EonaCat.Logger/Managers/LogHelper.cs @@ -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(); + } + + 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(); + } + + 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(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 /// /// Overload for sending a simple log message to Splunk. /// - 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); } /// @@ -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)) { @@ -364,16 +487,26 @@ internal static class LogHelper { return; } - + var tasks = settings.TcpServers? .Where(server => !string.IsNullOrWhiteSpace(server.Hostname) && server.Port >= 0) .Select(async server => { 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) diff --git a/EonaCat.Logger/Managers/LogManager.cs b/EonaCat.Logger/Managers/LogManager.cs index e59f418..e3d9eb4 100644 --- a/EonaCat.Logger/Managers/LogManager.cs +++ b/EonaCat.Logger/Managers/LogManager.cs @@ -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); } /// @@ -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(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 } /// - /// Add sysLog server + /// Add Syslog server /// /// /// /// + /// + /// + /// /// - public bool AddSyslogServer(string address, int port, string nickName = null) + public bool AddSyslogServer(string address, int port, string nickName = null, List 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 /// /// /// - /// (optional) - /// (optional) + /// + /// + /// /// - 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 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 } /// - /// Add GrayLog server + /// Add Graylog server /// /// /// /// + /// /// - public bool AddGrayLogServer(string address, int port, string nickName = null) + public bool AddGrayLogServer(string address, int port, string nickName = null, List 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 } /// - /// Add Tcp server + /// Add Tcp Server /// /// /// /// + /// /// - public bool AddTcpLogServer(string address, int port, string nickName = null) + public bool AddTcpLogServer(string address, int port, string nickName = null, List 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 } /// - /// Add Udp server + /// Add Udp Server /// /// /// /// + /// /// - public bool AddUdpLogServer(string address, int port, string nickName = null) + public bool AddUdpLogServer(string address, int port, string nickName = null, List 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; } diff --git a/EonaCat.Logger/Managers/LoggerSettings.cs b/EonaCat.Logger/Managers/LoggerSettings.cs index e500570..5ee3219 100644 --- a/EonaCat.Logger/Managers/LoggerSettings.cs +++ b/EonaCat.Logger/Managers/LoggerSettings.cs @@ -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"; /// @@ -126,9 +125,22 @@ public class LoggerSettings } } - public ELogType MaxLogType { get; set; } = ELogType.INFO; + private List _logTypes = new List { ELogType.INFO, ELogType.WARNING, ELogType.ERROR, ELogType.TRAFFIC, ELogType.DEBUG, ELogType.CRITICAL, ELogType.TRACE }; + public List TypesToLog + { + get + { + return _logTypes; + } + + set + { + _logTypes = value; + } + } + public List SysLogServers { get; internal set; } - public List SplunkServers { get; internal set; } + public List SplunkServers { get; internal set; } public List GrayLogServers { get; internal set; } public List 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(); + } + + if (!TypesToLog.Contains(ELogType.INFO)) + { + TypesToLog.Add(ELogType.INFO); + } + } + + public void LogWarning() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.WARNING)) + { + TypesToLog.Add(ELogType.WARNING); + } + } + + public void LogError() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.ERROR)) + { + TypesToLog.Add(ELogType.ERROR); + } + } + + public void LogCritical() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.CRITICAL)) + { + TypesToLog.Add(ELogType.CRITICAL); + } + } + + public void LogTraffic() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.TRAFFIC)) + { + TypesToLog.Add(ELogType.TRAFFIC); + } + } + + public void LogTrace() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.TRACE)) + { + TypesToLog.Add(ELogType.TRACE); + } + } + + public void LogDebug() + { + if (TypesToLog == null) + { + TypesToLog = new List(); + } + + if (!TypesToLog.Contains(ELogType.DEBUG)) + { + TypesToLog.Add(ELogType.DEBUG); + } + } } \ No newline at end of file diff --git a/EonaCat.Logger/Servers/GrayLog/Graylog.cs b/EonaCat.Logger/Servers/GrayLog/Graylog.cs index c08a103..bba57e7 100644 --- a/EonaCat.Logger/Servers/GrayLog/Graylog.cs +++ b/EonaCat.Logger/Servers/GrayLog/Graylog.cs @@ -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) + /// + /// Graylog server + /// + /// + /// + /// + /// + /// + /// + public Graylog(string hostname = "127.0.0.1", int port = 12201, string nickName = null, List 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 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; } } diff --git a/EonaCat.Logger/Servers/Splunk/Splunk.cs b/EonaCat.Logger/Servers/Splunk/Splunk.cs index 2308fe3..31bfdb8 100644 --- a/EonaCat.Logger/Servers/Splunk/Splunk.cs +++ b/EonaCat.Logger/Servers/Splunk/Splunk.cs @@ -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. /// 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) + /// + /// Splunk Server + /// + /// + /// + /// + /// + /// + /// + public Splunk(string splunkHecUrl, string splunkHecToken, HttpClientHandler httpClientHandler = null, string nickName = null, List 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 TypesToLog { get; set; } + private void CreateHttpClient() { DisposeHttpClient(); @@ -84,7 +93,7 @@ public class Splunk : IDisposable CreateHttpClient(); } - public async Task SendAsync(SplunkPayload splunkPayload) + public async Task 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) { diff --git a/EonaCat.Logger/Servers/Syslog/Syslog.cs b/EonaCat.Logger/Servers/Syslog/Syslog.cs index f9f3a7d..4092bda 100644 --- a/EonaCat.Logger/Servers/Syslog/Syslog.cs +++ b/EonaCat.Logger/Servers/Syslog/Syslog.cs @@ -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) + /// + /// Syslog server + /// + /// + /// + /// + /// + /// + /// + public Syslog(string hostname = "127.0.0.1", int port = 514, string nickName = null, List 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 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; } } diff --git a/EonaCat.Logger/Servers/Tcp/Tcp.cs b/EonaCat.Logger/Servers/Tcp/Tcp.cs index 7c4845c..e632f07 100644 --- a/EonaCat.Logger/Servers/Tcp/Tcp.cs +++ b/EonaCat.Logger/Servers/Tcp/Tcp.cs @@ -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) + /// + /// Tcp Server + /// + /// + /// + /// + /// + /// + /// + public Tcp(string hostname, int port, string nickname = null, List 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 TypesToLog { get; set; } + internal void SetTcp() { try @@ -59,7 +73,7 @@ namespace EonaCat.Logger.Servers.Tcp _tcp = new TcpClient(_Hostname, _Port); IsConnected = true; } - catch + catch { IsConnected = false; } @@ -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 + } } } @@ -125,7 +147,7 @@ namespace EonaCat.Logger.Servers.Tcp } if (IsConnected) - { + { var sendData = Encoding.UTF8.GetBytes(data); using var stream = _tcp.GetStream(); await stream.WriteAsync(sendData, 0, sendData.Length); diff --git a/EonaCat.Logger/Servers/Udp/Udp.cs b/EonaCat.Logger/Servers/Udp/Udp.cs index 6234e98..07eb72d 100644 --- a/EonaCat.Logger/Servers/Udp/Udp.cs +++ b/EonaCat.Logger/Servers/Udp/Udp.cs @@ -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) + /// + /// Udp Server + /// + /// + /// + /// + /// + /// + /// + public Udp(string hostname, int port, string nickname = null, List 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 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; } } diff --git a/EonaCat.Logger/Servers/Zabbix/API/ZabbixApi.cs b/EonaCat.Logger/Servers/Zabbix/API/ZabbixApi.cs index fdb64e3..297c811 100644 --- a/EonaCat.Logger/Servers/Zabbix/API/ZabbixApi.cs +++ b/EonaCat.Logger/Servers/Zabbix/API/ZabbixApi.cs @@ -11,6 +11,13 @@ namespace EonaCat.Logger.Servers.Zabbix.API; public class ZabbixApi { + /// + /// Zabbix Api + /// + /// + /// + /// + /// public ZabbixApi(string user, string password, string zabbixURL, bool basicAuth) { _user = user; diff --git a/EonaCat.Logger/Servers/Zabbix/ZabbixRequest.cs b/EonaCat.Logger/Servers/Zabbix/ZabbixRequest.cs index 0b13e48..1ee70a2 100644 --- a/EonaCat.Logger/Servers/Zabbix/ZabbixRequest.cs +++ b/EonaCat.Logger/Servers/Zabbix/ZabbixRequest.cs @@ -22,6 +22,12 @@ namespace EonaCat.Logger.Servers.Zabbix /// public ZabbixData[] Data { get; set; } + /// + /// Zabbix request + /// + /// + /// + /// public ZabbixRequest(string host, string key, string value) { Request = "sender data"; diff --git a/Testers/EonaCat.Logger.Test.Web/Logger.cs b/Testers/EonaCat.Logger.Test.Web/Logger.cs index bf9390d..2ab94db 100644 --- a/Testers/EonaCat.Logger.Test.Web/Logger.cs +++ b/Testers/EonaCat.Logger.Test.Web/Logger.cs @@ -8,22 +8,29 @@ namespace EonaCat.Logger.Test.Web; public class Logger { private LogManager _logManager; - public ELogType MaxLogType { get; set; } + public List TypesToLog { get; set; } = new List(); 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) + /// + /// Logger + /// + /// + /// + /// + /// + public Logger(string name = "EonaCatTestLogger", List 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); } diff --git a/Testers/EonaCat.Logger.Test.Web/Program.cs b/Testers/EonaCat.Logger.Test.Web/Program.cs index ba8b999..c869bff 100644 --- a/Testers/EonaCat.Logger.Test.Web/Program.cs +++ b/Testers/EonaCat.Logger.Test.Web/Program.cs @@ -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;