rabbitmq 如何将Serilog数据发送到日志服务?

sg3maiej  于 2022-11-08  发布在  RabbitMQ
关注(0)|答案(2)|浏览(269)

我需要通过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中,并且仍然保留结构日志记录,而不会丢失任何数据?

k4aesqcs

k4aesqcs1#

经过一些研究,我发现Serilog.Formatting.Compact NuGet可以将Serilog LogEvent转换为一个紧凑的JSON字符串。然后,这个JSON字符串可以用Serilog-formatting-compact-reader NuGET读回Serilog LogEvent。经过一些测试,我可以得出结论,这工作得很好。
可能有JSON杀菌器不能处理的类型,但我还没有找到。

wwwo4jvm

wwwo4jvm2#

尝试看看这个项目,这正是你正在寻找:log server
您还可以在这里找到RabbitMQ接收器。
在我的项目中,您会发现以下内容:
1.服务器作为RabbitMQ消息的简单使用者
This is the LogEventHandler,它由来自RabbitMQ队列的每个新消息触发。

  1. Serilog.Sinks.RabbitMQ作为消息的发布者
    RabbitMQ接收器中消息发布的This is the core
    在我的例子中,我不使用json格式,但我使用protobuf二进制序列化,这是更紧凑。
    This is README,您可以在其中找到有关如何使用此日志记录系统的更多详细信息。

相关问题