UDPSink 从配置读取配置并兼容官方
时间: 2024-02-25 09:53:00 浏览: 12
下面是一个示例,演示如何从配置文件中读取UDP Sink的配置,并且兼容官方的Sink配置:
```csharp
using System;
using System.Net;
using System.Net.Sockets;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;
public static class UdpSinkExtensions
{
public static LoggerConfiguration UdpSink(
this LoggerSinkConfiguration loggerConfiguration,
string host,
int port)
{
return loggerConfiguration.Sink(new UdpSink(host, port));
}
public static LoggerConfiguration UdpSink(
this LoggerSinkConfiguration loggerConfiguration,
IPEndPoint endPoint)
{
return loggerConfiguration.Sink(new UdpSink(endPoint));
}
public static LoggerConfiguration Udp(
this LoggerSinkConfiguration loggerConfiguration,
string host,
int port)
{
return UdpSink(loggerConfiguration, host, port);
}
public static LoggerConfiguration Udp(
this LoggerSinkConfiguration loggerConfiguration,
IPEndPoint endPoint)
{
return UdpSink(loggerConfiguration, endPoint);
}
}
public class UdpSink : ILogEventSink, IDisposable
{
private readonly UdpClient _client;
private readonly IPEndPoint _remoteEndPoint;
public UdpSink(string host, int port)
: this(new IPEndPoint(IPAddress.Parse(host), port))
{
}
public UdpSink(IPEndPoint endPoint)
{
_client = new UdpClient();
_remoteEndPoint = endPoint;
}
public void Emit(LogEvent logEvent)
{
var logMessage = logEvent.RenderMessage();
var logBytes = System.Text.Encoding.UTF8.GetBytes(logMessage);
_client.Send(logBytes, logBytes.Length, _remoteEndPoint);
}
public void Dispose()
{
_client?.Close();
}
}
```
这个示例中,我们定义了两个构造函数,一个接受主机和端口号,另一个接受一个`IPEndPoint`对象。然后,我们定义了`UdpSinkExtensions`类,提供了两个扩展方法,用于在Logger中添加UDP Sink。
接下来,我们可以在配置文件中添加UDP Sink的配置:
```json
{
"Serilog": {
"WriteTo": [
{
"Name": "Udp",
"Args": {
"host": "127.0.0.1",
"port": 514
}
}
]
}
}
```
或者,可以使用官方的Sink配置:
```json
{
"Serilog": {
"WriteTo": [
{
"Name": "UdpSink",
"Args": {
"host": "127.0.0.1",
"port": 514
}
}
]
}
}
```
这样,我们就可以从配置文件中读取UDP Sink的配置,并且兼容官方的Sink配置。