diff --git a/EonaCat.Logger/EonaCat.Logger.csproj b/EonaCat.Logger/EonaCat.Logger.csproj index f9d5a58..1af008a 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.9 + 1.4.0 EonaCat (Jeroen Saey) true EonaCat (Jeroen Saey) @@ -24,7 +24,7 @@ - 1.3.9+{chash:10}.{c:ymd} + 1.4.0+{chash:10}.{c:ymd} true true v[0-9]* diff --git a/EonaCat.Logger/Managers/LogHelper.cs b/EonaCat.Logger/Managers/LogHelper.cs index 146252f..ad2c12f 100644 --- a/EonaCat.Logger/Managers/LogHelper.cs +++ b/EonaCat.Logger/Managers/LogHelper.cs @@ -416,8 +416,6 @@ internal static class LogHelper return; } - const int MaxUdpPacketSize = 4096; - var tasks = settings.SysLogServers? .Where(server => !string.IsNullOrWhiteSpace(server.Hostname) && server.Port >= 0) .Select(async server => @@ -444,24 +442,7 @@ internal static class LogHelper { server.SetUdp(); } - - var data = Encoding.UTF8.GetBytes(message); - - if (data.Length <= MaxUdpPacketSize) - { - // Send via UDP (single packet) - await server.Udp.SendAsync(data, data.Length); - } - else if (server.SupportsTcp) - { - // Send via TCP if supported - await SendViaTcpAsync(server, data); - } - else - { - // Chunk large messages for UDP - await SendUdpInChunksAsync(server, data, MaxUdpPacketSize); - } + await server.WriteAsync(message); } catch (Exception ex) { @@ -567,32 +548,6 @@ internal static class LogHelper await Task.WhenAll(tasks); } - - /// - /// Sends a message via TCP to a syslog server. - /// - private static async Task SendViaTcpAsync(Servers.Syslog.Syslog server, byte[] data) - { - using var tcpClient = new System.Net.Sockets.TcpClient(); - await tcpClient.ConnectAsync(server.Hostname, server.Port); - using var stream = tcpClient.GetStream(); - await stream.WriteAsync(data, 0, data.Length); - await stream.FlushAsync(); - } - - /// - /// Sends large messages in chunks over UDP. - /// - private static async Task SendUdpInChunksAsync(Servers.Syslog.Syslog server, byte[] data, int chunkSize) - { - for (int i = 0; i < data.Length; i += chunkSize) - { - var chunk = data.Skip(i).Take(chunkSize).ToArray(); - await server.Udp.SendAsync(chunk, chunk.Length); - } - } - - internal static string GetStartupMessage() { return $"{DllInfo.ApplicationName} started."; diff --git a/EonaCat.Logger/Managers/LogManager.cs b/EonaCat.Logger/Managers/LogManager.cs index e3d9eb4..6cf62da 100644 --- a/EonaCat.Logger/Managers/LogManager.cs +++ b/EonaCat.Logger/Managers/LogManager.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; using EonaCat.Logger.EonaCatCoreLogger; diff --git a/EonaCat.Logger/Servers/Syslog/Syslog.cs b/EonaCat.Logger/Servers/Syslog/Syslog.cs index 4092bda..fb5af25 100644 --- a/EonaCat.Logger/Servers/Syslog/Syslog.cs +++ b/EonaCat.Logger/Servers/Syslog/Syslog.cs @@ -1,6 +1,9 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; namespace EonaCat.Logger.Servers.Syslog; // This file is part of the EonaCat project(s) which is released under the Apache License. @@ -11,6 +14,7 @@ namespace EonaCat.Logger.Servers.Syslog; /// public class Syslog : IDisposable { + const int MaxUdpPacketSize = 4096; private string _Hostname = "127.0.0.1"; private int _Port = 514; public bool IsConnected { get; private set; } @@ -108,8 +112,62 @@ public class Syslog : IDisposable { DisposeUdp(); GC.SuppressFinalize(this); - } - + } + + public async Task WriteAsync(string message) + { + var data = Encoding.UTF8.GetBytes(message); + await SendAsync(data); + } + + public async Task WriteAsync(byte[] data) + { + await SendAsync(data); + } + + private async Task SendAsync(byte[] data) + { + if (data.Length <= MaxUdpPacketSize) + { + // Send via UDP (single packet) + await Udp.SendAsync(data, data.Length); + } + else if (SupportsTcp) + { + // Send via TCP if supported + await SendViaTcpAsync(this, data); + } + else + { + // Chunk large messages for UDP + await SendUdpInChunksAsync(this, data, MaxUdpPacketSize); + } + } + + /// + /// Sends a message via TCP to a syslog server. + /// + private static async Task SendViaTcpAsync(Servers.Syslog.Syslog server, byte[] data) + { + using var tcpClient = new System.Net.Sockets.TcpClient(); + await tcpClient.ConnectAsync(server.Hostname, server.Port); + using var stream = tcpClient.GetStream(); + await stream.WriteAsync(data, 0, data.Length); + await stream.FlushAsync(); + } + + /// + /// Sends large messages in chunks over UDP. + /// + private static async Task SendUdpInChunksAsync(Servers.Syslog.Syslog server, byte[] data, int chunkSize) + { + for (int i = 0; i < data.Length; i += chunkSize) + { + var chunk = data.Skip(i).Take(chunkSize).ToArray(); + await server.Udp.SendAsync(chunk, chunk.Length); + } + } + ~Syslog() { Dispose(); diff --git a/EonaCat.Logger/Servers/Tcp/Tcp.cs b/EonaCat.Logger/Servers/Tcp/Tcp.cs index e632f07..ed1d47e 100644 --- a/EonaCat.Logger/Servers/Tcp/Tcp.cs +++ b/EonaCat.Logger/Servers/Tcp/Tcp.cs @@ -104,7 +104,7 @@ namespace EonaCat.Logger.Servers.Tcp GC.SuppressFinalize(this); } - internal async Task WriteAsync(byte[] data) + public async Task WriteAsync(byte[] data) { if (_tcp == null) { @@ -129,7 +129,7 @@ namespace EonaCat.Logger.Servers.Tcp } } - internal async Task WriteAsync(string data) + public async Task WriteAsync(string data) { if (_tcp == null) { diff --git a/EonaCat.Logger/Servers/Udp/Udp.cs b/EonaCat.Logger/Servers/Udp/Udp.cs index 07eb72d..66ce754 100644 --- a/EonaCat.Logger/Servers/Udp/Udp.cs +++ b/EonaCat.Logger/Servers/Udp/Udp.cs @@ -103,7 +103,7 @@ namespace EonaCat.Logger.Servers.Udp GC.SuppressFinalize(this); } - internal async Task WriteAsync(byte[] data, bool dontFragment = false) + public async Task WriteAsync(byte[] data, bool dontFragment = false) { if (_udp == null || data == null) { @@ -134,7 +134,7 @@ namespace EonaCat.Logger.Servers.Udp } } - internal async Task WriteAsync(string data, bool dontFragment = false) + public async Task WriteAsync(string data, bool dontFragment = false) { if (_udp == null || string.IsNullOrEmpty(data)) {