【问题标题】:How to send Serilog data to logservice?如何将 Serilog 数据发送到 logservice?
【发布时间】:2022-10-20 14:25:50
【问题描述】:

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

【问题讨论】:

  • ILogger.Write(LogEvent) 对您不起作用?
  • @Fildor,你的意思是什么?我怀疑自定义接收器必须以某种方式序列化 LogEvent,通过 MQ 将其​​发送到服务器 B,服务器 B 将反序列化 LogEvent,然后将其发布到 Serilog。真的那么容易吗?
  • 这就是我的意思 - 在 MQ 接收器中的 B 上。它可能这么容易,但我不是当然.我只是想知道为什么不应该工作,如果我们有 LogEvent 的重载?
  • 您不必问我们是否那么容易。去试试吧!如果它不起作用并且您无法弄清楚,请提供minimal reproducible example 并清楚地解释您的尝试不起作用的地方。

标签: c# logging rabbitmq serilog


【解决方案1】:

经过一番研究,我找到了Serilog.Formatting.Compact NuGet,它将 Serilog LogEvent 转换为紧凑的 JSON 字符串。然后可以使用Serilog-formatting-compact-reader NuGET 将这个 JSON 字符串读回到 Serilog LogEvent 中。经过一些测试,我可以得出结论,这很好用。

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

【讨论】:

    【解决方案2】:

    试着看看这个项目,它正是你想要的:log server

    您还可以在这里找到 RabbitMQ 接收器。 问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-15
      • 2014-05-19
      • 1970-01-01
      相关资源
      最近更新 更多