如何在我的实现 ILogger 中获取请求的唯一 ID(如来自 Serilog 的 requestid)?

How do I get the unique id (like requestid from Serilog) of a request in my implementation ILogger?

我有一个单独的微服务,它从另一个微服务获取 HTTP 消息 (JSON),使用 Serilog 记录它们(消息)并将它们发送到 graylog (GELF)。一条消息 - 一条日志,示例:

  1. 消息:“请求开始 HTTP/1.1 GET http://localhost:44312/api/home” 来自:“WebApplication,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null” 2)消息:“记录示例文本消息!!!” 来自:“WebApplication,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null” ....

我想为每条将从其他微服务发送的消息添加一个“请求 ID”字段,而无需在其他微服务中使用 Serilog。如何在 MyLogger class 中获取它?

第一条和第二条消息 - 是相同的请求,但我的“logging-microservce”将它们作为两条不同的消息获取,并且此服务中的 serilog((“logging-microservce”)将它们作为另外两个不同的请求处理请求 ID.

public class MyLogger : ILogger
{
    public MyLogger()
    {
    }

    public IDisposable BeginScope<TState>(TState state)
    {
        return null;
    }

    public bool IsEnabled(LogLevel logLevel)
    {
        return true;
    }

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
    {
        var message = formatter(state, exception);

        if (exception != null)
        {
            message = $"{exception.GetType()}: {exception.Message}";
        }

        var logMessageModel = new LogMessageModel(logLevel, message, **REQUEST_ID???????,** Assembly.GetEntryAssembly().FullName, exception?.StackTrace);
        string selectionString = JsonConvert.SerializeObject(logMessageModel);

        using (var client = new HttpClient())
        {
            StringContent stringContent = new StringContent(selectionString, Encoding.UTF8, "application/json");
            client.PostAsync($"https://localhost:44353/api/logging", stringContent).GetAwaiter().GetResult();
        }
    }
}

我的日志服务中的 Serilog 配置:

{
  "Serilog": {
    "Using": [ "Serilog.Sinks.Graylog", "Serilog.Sinks.Console" ],
    "MinimumLevel": {
      "Default": "Error",
      "Override": {
        "LoggingExample.Handler": "Information"
      }
    },
    "WriteTo": [
      {
        "Name": "Graylog",
        "Args": {
          "hostnameOrAddress": "127.0.0.1",
          "port": "1514",
          "transportType": "Tcp"
        }
      }
    ],
    "Properties": {
      "Application": "Centralized logging application"
    }
  },
  "AllowedHosts": "*"
}

.NET 核心 2.2

您应该使用 Correlation Id 来跟踪您的请求。 关联 ID,也称为传输 ID,是附加到允许引用特定事务或事件链的请求和消息的唯一标识符值。关联 ID 定义为 non-standard HTTP header 并且是 Java 消息服务 (JMS) 的一部分。

这里有一个 link 的 Serilog 最佳实践。

https://benfoster.io/blog/serilog-best-practices/