如何将Serilog数据发送到logservice?

How to send Serilog data to logservice?

我需要通过 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 对象中,然后发送到接收器:

我简单的水槽可能是这样的:

    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,在那里我可以将其重新登录到 Serilog 并仍然保留结构日志记录而不会丢失任何数据?

经过一番研究,我找到了 Serilog.Formatting.Compact NuGet that will translate the Serilog LogEvent to a compact JSON string. This JSON string can then be read back into a Serilog LogEvent with Serilog-formatting-compact-reader NuGET。经过一些测试后,我可以得出结论,这很好用。

可能有一些类型是 JSON 消毒器无法处理的,但我还没有找到。