【问题标题】:How to unique identify each request in a ASP.NET Core 2 application (for logging)如何唯一标识 ASP.NET Core 2 应用程序中的每个请求(用于日志记录)
【发布时间】:2018-10-20 03:05:49
【问题描述】:

在 ASP.NET Core 2 应用程序中,我需要每个请求的唯一标识符(例如 Guid),以便我可以在每个日志中包含该 ID 并了解每个请求的日志序列。

我自己写这个并不难,但我想知道是否有我可以使用的内置功能或实现这一点的 ASP.NET Core 2 方式。

【问题讨论】:

    标签: asp.net-core asp.net-core-2.0


    【解决方案1】:

    ASP.NET Core 也有 HttpContext.TraceIdentifier 唯一标识当前请求。

    它是由 Kestrel 为每个传入请求生成的,因此不适用于关联对另一个服务的调用,但适用于将单个请求的日志关联在一起,或关联可能显示的错误消息具有相应日志的用户。

    【讨论】:

    • 据我了解,它不是唯一的,是吗?它是顺序的,并在服务启动时间开始,因此如果两个请求来自同一服务的不同实例,则它们可能具有相同的 id。
    【解决方案2】:

    您可以使用System.Diagnostics.Activity 类(source)。来自Activity User Guide

    Activity.Id 用作 HTTP Correlation Protocol 方面的分层请求 ID

    这例如被Microsoft/ApplicationInsights-aspnetcore 用于应用监控。

    【讨论】:

    • 有没有示例如何使用? Activity.Current 在控制器内为空
    • @Giorgi 我认为,如果传入请求中没有 Correlation-Id,则在请求开始时分配 Correlation-Id 是程序员的责任(请记住,它主要用于反向 -代理)。
    • 嗨。您能否更新一些指向此(非常好的)答案的断开链接?谢谢。
    • 如果您使用的 ApplicationInsights 将自动填充 System.Diagnostics.Activity.Current,那么您可以使用 System.Diagnostics.Activity.Current?.Id.RootId,并且还可以与您的 ApplicationInsights 日志相关联。 (参考:github.com/Microsoft/ApplicationInsights-aspnetcore/issues/504
    【解决方案3】:

    听起来您正在寻找correlation id。也许Correlation ID Middleware 会有所帮助?

    【讨论】:

    • 这个线程安全吗?我粗略地看了一眼代码,看起来相关 id 存储在上下文中。我认为任何并行操作都会失去对此的访问权限。
    猜你喜欢
    • 2012-12-31
    • 2023-04-08
    • 1970-01-01
    • 2022-11-30
    • 2016-05-04
    • 1970-01-01
    • 2014-07-10
    • 2018-10-27
    • 2021-12-16
    相关资源
    最近更新 更多