【问题标题】:Serilog Indefinite Loop logging base classesSerilog 无限循环日志记录基类
【发布时间】:2022-01-23 07:15:06
【问题描述】:

如何避免使用我想要记录的 Serilog 接收器创建循环。 问题是基类“MyTcpServer”和“MyTcpClient”使用了 Serilog。 但由于 TcpSink 也使用相同的类,发送日志条目将无限循环。

如何防止这种情况发生?

Main()
{
  Serilog.Log.Logger = new LoggerConfiguration()
    .WriteTo.TcpSink() //this a TcpListener/Server listening on port 1234
    .WriteTo.Console()
    .CreateLogger();

  MyTcpServer AnotherServer = new MyTcpServer(4321);
}

public class MyTcpServer
{
   ///this class contains Log.Verbose|Debug|Error
   private List<MyTcpClient> clients;
}

public class MyTcpClient
{
   ///this class contains Log.Verbose|Debug|Error
}

public class TcpServerSink : ILogEventSink
{
  MyTcpServer server;
  public TcpServerSink(int port = 1234)
  {
     server = new MyTcpServer(1234);
  }
  public void Emit(LogEvent logevent)
  {
    string str = Newtonsoft.Json.JsonConvert.Serialize(logevent);
    server.Send(str);
  }
}

【问题讨论】:

  • 你这里有循环依赖... TcpServerSink 被 Serilog 使用,Serilog 被 TcpServerSink 使用。我认为您应该将 TcpServerSink 的日志推送到不同的位置。事件日志或 Serilog 中的单独接收器。

标签: c# serilog


【解决方案1】:

这里只有两个选项

  • TcpServerSink 中使用MyTcpServer,但不要登录到TcpServerSink
  • 不要在TcpServerSink 中使用MyTcpServer

对于第一个解决方案,使MyTcpServer 依赖于ILogger,而不是使用静态Log 依赖。通过这种方式,您可以传递您想要的任何记录器,或者只是禁用接收器中的记录:

server = new MyTcpServer(SilentLogger.Instance, 1234);

我个人更喜欢第二种解决方案。因为您应该只记录与您的应用程序逻辑相关的事件到 Serilog。 TcpServerSink 与应用程序逻辑无关。在其他 Serilog 接收器中使用的一种常见方法是使用静态 SelfLog 写入 someTextWriter。例如

SelfLog.Out = Console.Error;

然后你可以使用这个自日志来写一些关于你的水槽的信息。此外,您的水槽应该使用普通的TcpClient,而不是MyTcpServer。您可以查看Splunk TcpSink 示例。

【讨论】:

    【解决方案2】:

    一个值得考虑的选项是在 TCP 服务器中登录时使用Log.ForContext&lt;MyTcpServer&gt;()

    Log.ForContext<MyTcpServer>().Information("Hello!");
    

    并为 TCP 接收器过滤掉这些消息:

        // dotnet add package Serilog.Expressions
        .WriteTo.Conditional(
            "SourceContext not like 'MyNamespace.MyTcpServer%'",
            wt => wt.TcpSink())
        .WriteTo.Console()
    

    这样做的好处是可以将错误从 TCP 接收器传递到控制台,但缺点是如果您忘记在 TCP 服务器内使用上下文记录器,您仍然会堆栈溢出。

    【讨论】:

      猜你喜欢
      • 2020-08-10
      • 1970-01-01
      • 2016-04-22
      • 2018-04-14
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2020-02-11
      相关资源
      最近更新 更多