【问题标题】:Serilog: Request Id implementationSerilog:请求 ID 实现
【发布时间】:2018-02-05 15:15:02
【问题描述】:

最近我已将 Serilog 配置为与 ASP.NET Core 2 MVC 应用程序配合使用,下一个任务是在系统的每一层上跟踪对 Web 应用程序的传入请求。所以基本上,我们想要传播一些令牌(比如由 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 浓缩器的实现在哪里?老实说,我找不到它。

【问题讨论】:

    标签: logging asp.net-core serilog asp.net-core-logging


    【解决方案1】:

    在 ASP.NET Core 中,一些记录器暴露的RequestIdHttpContext 上的TraceIdentifier 的值。此属性可在整个应用程序中用于识别当前请求。

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

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

    记录器可以通过实现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 的显式引用,但是当您指定要包含它的日志记录字符串格式时它仍然存在。

    【讨论】:

    • "出于记录目的,回退到 HttpContext 不是可行的方法" 如果您想记录会话 ID,该怎么办?我相信你必须从 HttpContext 中得到它。
    • @dcp 同样的事情;不要检索 HttpContext 来仅记录您需要的信息,而是通过记录范围公开信息。 RequestId 由两个默认日志记录范围之一公开,但您始终可以添加自己的范围以公开其他值,例如会话 ID。
    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 2021-09-30
    • 2019-03-30
    • 2016-11-24
    相关资源
    最近更新 更多