gpt4 book ai didi

logging - Serilog:请求 ID 实现

转载 作者:行者123 更新时间:2023-12-04 10:06:49 24 4
gpt4 key购买 nike

最近,我将 Serilog 配置为与 ASP.NET Core 2 MVC 应用程序配合使用,接下来的任务是在系统的每一层跟踪对 Web 应用程序的传入请求。所以基本上,我们想要传播一些 token (比如由 Serilog 生成的 RequestId 到应用程序的较低层)。

"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.RollingFile" ],
"MinimumLevel": {
"Default": "Debug",
"Override": {
"Microsoft": "Warning"
}
},
"WriteTo": [
{
"Name": "RollingFile",
"Args": {
"pathFormat": "log-{Hour}.txt",
"fileSizeLimitBytes": "",
"retainedFileCountLimit": "",
"outputTemplate": "{Timestamp:yyyy-MM-dd HH:mm:ss.fff zzz} [{Application}] [{Level}] [{RequestId}] - {Message}{NewLine}{Exception}"
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ],
"Properties": {
"Application": "MultilayerApp"
}
},

在日志中,我们有很好的输入,例如

2018-01-19 14:06:01.165 +00:00 [App] [Warning] [0HLAV6PIMA9M0:00000001] - Accessing expired session, Key:"6e7f3ab5-db62-335d-1bc7-6824e5b918f5"

但我的问题是 Serilog 中的哪里是 RequestId 的实现浓缩器?老实说我找不到它。

最佳答案

在 ASP.NET Core 中,RequestId一些记录器公开的值是 TraceIdentifier HttpContext .此属性可在整个应用程序中用于标识当前请求。

出于记录目的,回退到 HttpContext虽然不是要走的路。 Microsoft.Extensions.Logging抽象支持 logging scopes这是一种向适用于该范围内的记录器提供附加信息的方法。

默认情况下,ASP.NET Core 会打开两个日志记录范围。其中之一是 HostingLogScope 已打开 at the beginning of every request (如果至少启用了关键日志记录)。

记录器可以通过实现 BeginScope method 来访问信息。得到 HostingLogScope在每个请求开始时传递给它的对象,并简单地遍历该对象,直到找到该属性:

string requestId = null;
if (state is IEnumerable<KeyValuePair<string, object>> properties)
{
foreach (var property in properties)
{
if (property.Key == "RequestId")
{
requestId = property.Value as string;
}
}
}

Serilog does pretty much the same但存储所有属性 in the log event .这就是为什么您没有找到对 RequestId 的明确引用的原因。但是当您指定日志字符串格式以包含它时,它仍然存在。

关于logging - Serilog:请求 ID 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625624/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com