You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PLT-PDA/Admin.Core.Serilog.Es/NetworkLoggerConfigurationE...

100 lines
3.2 KiB
C#

using System;
using System.Linq;
using System.Net;
using Serilog;
using Serilog.Configuration;
using Serilog.Debugging;
using Serilog.Events;
using Serilog.Formatting;
namespace Admin.Core.Serilog.Es
{
/// <summary>
/// Extends Serilog configuration to write events to the network.
/// </summary>
public static class NetworkLoggerConfigurationExtensions
{
private static string TcpAddressHost = "";
private static int TcpAddressProt = 0;
/// <summary>
/// 获得tcpAddress
/// </summary>
private static void GetTcpAddress()
{
// 读取相关配置
var logConfigRootDTOInfo = JsonConfigUtils.GetAppSettings<LogConfigRootDTO>(AppSettingsFileNameConfig.AppSettingsFileName, "LogFiedOutPutConfigs");
if (logConfigRootDTOInfo == null)
{
return;
}
TcpAddressHost = logConfigRootDTOInfo.tcpAddressHost;
TcpAddressProt = logConfigRootDTOInfo.tcpAddressPort;
}
public static LoggerConfiguration TCPSink(
this LoggerSinkConfiguration loggerConfiguration,
ITextFormatter textFormatter = null,
LogEventLevel restrictedToMinimumLevel = LevelAlias.Minimum)
{
GetTcpAddress();
if (!string.IsNullOrEmpty(TcpAddressHost))
{
var sink = new TCPSink(BuildUri($"tcp://{TcpAddressHost}:{TcpAddressProt}"), textFormatter ?? new LogstashJsonFormatter());
return loggerConfiguration.Sink(sink, restrictedToMinimumLevel);
}
else {
return new LoggerConfiguration();
}
}
private static IPAddress ResolveAddress(string uri)
{
// Check if it is IP address
IPAddress address;
if (IPAddress.TryParse(uri, out address))
return address;
address = ResolveIP(uri);
if (address != null)
return address;
SelfLog.WriteLine("Unable to determine the destination IP-Address");
return IPAddress.Loopback;
}
private static IPAddress ResolveIP(string uri)
{
try
{
var ipHostEntry = Dns.GetHostEntryAsync(uri).Result;
if (!ipHostEntry.AddressList.Any())
return null;
return ipHostEntry.AddressList.First();
}
catch (Exception)
{
SelfLog.WriteLine("Could not resolve " + uri);
return null;
}
}
private static Uri BuildUri(string s)
{
Uri uri;
try
{
uri = new Uri(s);
}
catch (UriFormatException ex)
{
throw new ArgumentNullException("Uri should be in the format tcp://server:port", ex);
}
if (uri.Port == 0)
throw new UriFormatException("Uri port cannot be 0");
if (!(uri.Scheme.ToLower() == "tcp" || uri.Scheme.ToLower() == "tls"))
throw new UriFormatException("Uri scheme must be tcp or tls");
return uri;
}
}
}