我需要通过RabbitMQ通道将Serilog日志数据从服务器A发送到服务器B。为此,我在服务器A上创建了一个发送数据的serilog自定义接收器。问题是它应该如何发送此数据,以便服务器B可以轻松地使用Serilog将其重新记录到外部日志服务,并保持结构日志完整。
服务器A上的日志代码可能如下所示:
var position = new { Latitude = 25, Longitude = 134 };
var elapsedMs = 34;
log.Information("Processed {@Position} in {Elapsed:000} ms.", position, elapsedMs);
然后,Serilog将其打包到LogEvent对象中,然后发送到接收器:
我简单的Flume大概是这样的:
public class MySink : ILogEventSink
{
private readonly IFormatProvider _formatProvider;
public MySink(IFormatProvider formatProvider)
{
_formatProvider = formatProvider;
}
public void Emit(LogEvent logEvent)
{
//Sending logEvent over MQ
}
}
如何将此LogEvent发送到服务器b,在服务器b中,我可以将其重新记录到Serilog中,并且仍然保留结构日志记录,而不会丢失任何数据?
2条答案
按热度按时间k4aesqcs1#
经过一些研究,我发现Serilog.Formatting.Compact NuGet可以将Serilog LogEvent转换为一个紧凑的JSON字符串。然后,这个JSON字符串可以用Serilog-formatting-compact-reader NuGET读回Serilog LogEvent。经过一些测试,我可以得出结论,这工作得很好。
可能有JSON杀菌器不能处理的类型,但我还没有找到。
wwwo4jvm2#
尝试看看这个项目,这正是你正在寻找:log server
您还可以在这里找到RabbitMQ接收器。
在我的项目中,您会发现以下内容:
1.服务器作为RabbitMQ消息的简单使用者
This is the LogEventHandler,它由来自RabbitMQ队列的每个新消息触发。
RabbitMQ接收器中消息发布的This is the core。
在我的例子中,我不使用json格式,但我使用protobuf二进制序列化,这是更紧凑。
This is README,您可以在其中找到有关如何使用此日志记录系统的更多详细信息。