Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging Serilog:请求Id实现_Logging_Asp.net Core_Serilog_Asp.net Core Logging - Fatal编程技术网

Logging Serilog:请求Id实现

Logging Serilog:请求Id实现,logging,asp.net-core,serilog,asp.net-core-logging,Logging,Asp.net Core,Serilog,Asp.net Core Logging,最近,我将Serilog配置为与ASP.NET Core 2 MVC应用程序配合使用,下一个任务是在系统的每一层上跟踪web应用程序的传入请求。因此,基本上,我们希望将一些令牌(如Serilog生成的RequestId)传播到应用程序的较低层 “Serilog”:{ “使用”:[“Serilog.Sinks.Console”,“Serilog.Sinks.RollingFile”], “最低级别”:{ “默认值”:“调试”, “覆盖”:{ “Microsoft”:“警告” } }, “书面形式”

最近,我将Serilog配置为与ASP.NET Core 2 MVC应用程序配合使用,下一个任务是在系统的每一层上跟踪web应用程序的传入请求。因此,基本上,我们希望将一些令牌(如Serilog生成的
RequestId
)传播到应用程序的较低层

“Serilog”:{
“使用”:[“Serilog.Sinks.Console”,“Serilog.Sinks.RollingFile”],
“最低级别”:{
“默认值”:“调试”,
“覆盖”:{
“Microsoft”:“警告”
}
},
“书面形式”:[
{
“名称”:“滚动文件”,
“Args”:{
“pathFormat”:“log-{Hour}.txt”,
“fileSizeLimitBytes”:“”,
“RetainedEleCountLimit”:“,
“outputTemplate:“{时间戳:yyyy-MM-dd-HH:MM:ss.fff-zzz}[{Application}][{Level}][{RequestId}]-{Message}{NewLine}{Exception}”
}
}
],
“丰富”:[“FromLogContext”、“WithMachineName”、“WithThreadId”],
“财产”:{
“应用程序”:“多层RAPP”
}
},
在日志中,我们有很好的输入,比如

2018-01-19 14:06:01.165+00:00[App][Warning][0HLAV6PIMA9M0:00000001]-访问过期会话,键:“6e7f3ab5-db62-335d-1bc7-6824e5b918f5”

但我的问题是,Serilog中
RequestId
enricher的实现在哪里?老实说,我找不到它。

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


出于日志记录的目的,返回到
HttpContext
不是一个好办法。
Microsoft.Extensions.Logging
abstractions支持为该范围内应用的记录器提供附加信息

默认情况下,ASP.NET Core会打开两个日志记录作用域。其中之一是打开的(如果至少启用了关键日志记录)

记录者可以通过实现来访问信息,该方法在每个请求开始时将
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;
        }
    }
}
string requestId=null;
if(状态为IEnumerable属性)
{
foreach(属性中的var属性)
{
if(property.Key==“RequestId”)
{
requestId=property.Value作为字符串;
}
}
}

Serilog,但存储所有属性。这就是为什么您找不到对
RequestId
的显式引用,但当您指定要包含它的日志字符串格式时,它仍然存在。

“出于日志记录的目的,返回到HttpContext并不是解决“如果要记录会话ID怎么办?”?我相信你必须从HttpContext中得到它。@dcp同样的东西;不要检索HttpContext来只记录所需的信息,而是通过记录作用域公开信息。
RequestId
由两个默认日志作用域之一公开,但您始终可以添加自己的作用域来公开其他值,如会话id。