Added Splunk Logging and GrayLog Logging
This commit is contained in:
@@ -2,10 +2,18 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using EonaCat.Json;
|
||||
using EonaCat.Logger.Extensions;
|
||||
using EonaCat.Logger.GrayLog;
|
||||
using EonaCat.Logger.Syslog;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
// This file is part of the EonaCat project(s) which is released under the Apache License.
|
||||
// See the LICENSE file or go to https://EonaCat.com/License for full license details.
|
||||
|
||||
namespace EonaCat.Logger.Managers
|
||||
{
|
||||
internal static class LogHelper
|
||||
@@ -43,7 +51,7 @@ namespace EonaCat.Logger.Managers
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
internal static void SendToConsole(LoggerSettings settings, ELogType logType, string message, bool writeToConsole)
|
||||
{
|
||||
@@ -119,9 +127,104 @@ namespace EonaCat.Logger.Managers
|
||||
logger.Log(logLevel, message);
|
||||
}
|
||||
|
||||
internal static void SendToSysLogServers(LoggerSettings settings, string message)
|
||||
public static async Task SendToSplunkServersAsync(LoggerSettings settings, string logType, string message, bool sendToSplunkServer)
|
||||
{
|
||||
if (settings == null || !settings.SendToSyslogServers || string.IsNullOrWhiteSpace(message))
|
||||
if (settings == null || !sendToSplunkServer || string.IsNullOrWhiteSpace(message))
|
||||
return;
|
||||
|
||||
if (settings.SplunkServers == null)
|
||||
{
|
||||
settings.SplunkServers = new List<SplunkServer.SplunkServer>();
|
||||
}
|
||||
|
||||
foreach (var splunkServer in settings.SplunkServers)
|
||||
{
|
||||
if (!splunkServer.HasHecUrl)
|
||||
{
|
||||
Console.WriteLine("Splunk server HecUrl not specified, skipping splunkServer");
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!splunkServer.HasHecToken)
|
||||
{
|
||||
Console.WriteLine($"Splunk server HecToken not specified, skipping splunkServer '{splunkServer.SplunkHecUrl}'");
|
||||
continue;
|
||||
}
|
||||
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
using (var httpClient = new HttpClient())
|
||||
{
|
||||
var payload = new
|
||||
{
|
||||
log_message = message,
|
||||
sourcetype = logType
|
||||
};
|
||||
|
||||
var jsonPayload = JsonHelper.ToJson(payload);
|
||||
var content = new StringContent(jsonPayload, Encoding.UTF8, "application/json");
|
||||
|
||||
httpClient.DefaultRequestHeaders.Add("Authorization", $"Splunk {splunkServer.SplunkHecToken}");
|
||||
|
||||
var response = await httpClient.PostAsync(splunkServer.SplunkHecUrl, content);
|
||||
|
||||
if (!response.IsSuccessStatusCode)
|
||||
{
|
||||
Console.WriteLine($"Failed to send log to Splunk '{splunkServer.SplunkHecUrl}'. Status code: {response.StatusCode}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine($"Error while logging to Splunk server '{splunkServer.SplunkHecUrl}': {exception.Message}");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
internal static async Task SendToGrayLogServersAsync(LoggerSettings settings, string message, ELogType logLevel, string facility, string source, bool sendToGrayLogServer, string version = "1.1")
|
||||
{
|
||||
if (settings == null || !sendToGrayLogServer || string.IsNullOrWhiteSpace(message))
|
||||
return;
|
||||
|
||||
if (settings.GrayLogServers == null || !settings.GrayLogServers.Any())
|
||||
{
|
||||
settings.GrayLogServers = new List<GrayLogServer> { new GrayLogServer("127.0.0.1", 12201) };
|
||||
}
|
||||
|
||||
foreach (var grayLogServer in settings.GrayLogServers)
|
||||
{
|
||||
await Task.Run(async () =>
|
||||
{
|
||||
try
|
||||
{
|
||||
var gelfMessage = new
|
||||
{
|
||||
version,
|
||||
host = Environment.MachineName,
|
||||
short_message = message,
|
||||
level = logLevel.ToGrayLogLevel(),
|
||||
facility,
|
||||
source,
|
||||
timestamp = DateTime.UtcNow.ToUnixTimestamp(),
|
||||
};
|
||||
|
||||
var messageBytes = Encoding.UTF8.GetBytes(JsonHelper.ToJson(gelfMessage));
|
||||
await grayLogServer.Udp.SendAsync(messageBytes, messageBytes.Length, new IPEndPoint(IPAddress.Parse(grayLogServer.Hostname), grayLogServer.Port));
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine($"Error while logging to GrayLog server '{grayLogServer.Hostname}': {exception.Message}");
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
internal static async Task SendToSysLogServersAsync(LoggerSettings settings, string message, bool sendToSyslogServers)
|
||||
{
|
||||
if (settings == null || !sendToSyslogServers || string.IsNullOrWhiteSpace(message))
|
||||
return;
|
||||
|
||||
if (settings.SysLogServers == null || !settings.SysLogServers.Any())
|
||||
@@ -133,28 +236,36 @@ namespace EonaCat.Logger.Managers
|
||||
|
||||
foreach (SyslogServer server in settings.SysLogServers)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(server.Hostname))
|
||||
{
|
||||
Console.WriteLine("Server hostname not specified, skipping syslog server");
|
||||
continue;
|
||||
}
|
||||
if (server.Port < 0)
|
||||
{
|
||||
Console.WriteLine("Server port must be zero or greater, skipping syslog server");
|
||||
continue;
|
||||
}
|
||||
|
||||
lock (server.SendLock)
|
||||
await Task.Run(() =>
|
||||
{
|
||||
try
|
||||
{
|
||||
server.Udp.Send(data, data.Length);
|
||||
if (string.IsNullOrWhiteSpace(server.Hostname))
|
||||
{
|
||||
Console.WriteLine("Server hostname not specified, skipping SysLog Server");
|
||||
return;
|
||||
}
|
||||
|
||||
if (server.Port < 0)
|
||||
{
|
||||
Console.WriteLine("Server port must be zero or greater, skipping SysLog Server");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
server.Udp.Send(data, data.Length);
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
Console.WriteLine($"Error while logging to SysLog Server '{server.Hostname}': {exception.Message}");
|
||||
}
|
||||
}
|
||||
catch
|
||||
catch (Exception exception)
|
||||
{
|
||||
// Do nothing
|
||||
Console.WriteLine($"Error while logging to SysLog Server '{server.Hostname}': {exception.Message}");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user