如何在我的实现 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)。一条消息 - 一条日志,示例:
- 消息:“请求开始 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 最佳实践。
我有一个单独的微服务,它从另一个微服务获取 HTTP 消息 (JSON),使用 Serilog 记录它们(消息)并将它们发送到 graylog (GELF)。一条消息 - 一条日志,示例:
- 消息:“请求开始 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 最佳实践。