This commit is contained in:
Jeroen Saey
2025-02-17 08:05:22 +01:00
parent 99b3417186
commit c5cb238f42
6 changed files with 68 additions and 54 deletions

View File

@@ -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.9</FileVersion> <FileVersion>1.4.0</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.9+{chash:10}.{c:ymd}</EVRevisionFormat> <EVRevisionFormat>1.4.0+{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>

View File

@@ -416,8 +416,6 @@ internal static class LogHelper
return; return;
} }
const int MaxUdpPacketSize = 4096;
var tasks = settings.SysLogServers? var tasks = settings.SysLogServers?
.Where(server => !string.IsNullOrWhiteSpace(server.Hostname) && server.Port >= 0) .Where(server => !string.IsNullOrWhiteSpace(server.Hostname) && server.Port >= 0)
.Select(async server => .Select(async server =>
@@ -444,24 +442,7 @@ internal static class LogHelper
{ {
server.SetUdp(); server.SetUdp();
} }
await server.WriteAsync(message);
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);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@@ -567,32 +548,6 @@ internal static class LogHelper
await Task.WhenAll(tasks); await Task.WhenAll(tasks);
} }
/// <summary>
/// Sends a message via TCP to a syslog server.
/// </summary>
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();
}
/// <summary>
/// Sends large messages in chunks over UDP.
/// </summary>
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() internal static string GetStartupMessage()
{ {
return $"{DllInfo.ApplicationName} started."; return $"{DllInfo.ApplicationName} started.";

View File

@@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using EonaCat.Logger.EonaCatCoreLogger; using EonaCat.Logger.EonaCatCoreLogger;

View File

@@ -1,6 +1,9 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text;
using System.Threading.Tasks;
namespace EonaCat.Logger.Servers.Syslog; namespace EonaCat.Logger.Servers.Syslog;
// This file is part of the EonaCat project(s) which is released under the Apache License. // 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;
/// </summary> /// </summary>
public class Syslog : IDisposable public class Syslog : IDisposable
{ {
const int MaxUdpPacketSize = 4096;
private string _Hostname = "127.0.0.1"; private string _Hostname = "127.0.0.1";
private int _Port = 514; private int _Port = 514;
public bool IsConnected { get; private set; } public bool IsConnected { get; private set; }
@@ -108,8 +112,62 @@ public class Syslog : IDisposable
{ {
DisposeUdp(); DisposeUdp();
GC.SuppressFinalize(this); 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);
}
}
/// <summary>
/// Sends a message via TCP to a syslog server.
/// </summary>
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();
}
/// <summary>
/// Sends large messages in chunks over UDP.
/// </summary>
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() ~Syslog()
{ {
Dispose(); Dispose();

View File

@@ -104,7 +104,7 @@ namespace EonaCat.Logger.Servers.Tcp
GC.SuppressFinalize(this); GC.SuppressFinalize(this);
} }
internal async Task WriteAsync(byte[] data) public async Task WriteAsync(byte[] data)
{ {
if (_tcp == null) 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) if (_tcp == null)
{ {

View File

@@ -103,7 +103,7 @@ namespace EonaCat.Logger.Servers.Udp
GC.SuppressFinalize(this); 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) 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)) if (_udp == null || string.IsNullOrEmpty(data))
{ {