Serilog 全局范围

问题描述 投票:0回答:1

背景:

  • 我使用 Serilog 作为
    Microsoft.Extensions.Logging
    的“后端”。
  • 我有一个
    class T
    通过 DI 接收
    ILogger<T>
  • T
    在多种
    async
    方法中执行各种活动(例如
    M1Async
    M2Async
    )并大量记录日志。
  • 需要记录从
    T
    发出的每条消息的“全局状态”。
  • 这种状态的大部分是不变的,只有少数属性会不时改变。
  • T
    与应用程序中的其他类共享 Serilog 配置,因此仅应用于
    T
    的自定义丰富器有点不切实际。
  • 所以我决定使用
    logger.BeginScope()
    来创建全局状态,每次它发生变化时,我(处理旧的并)重新创建它。
  • T
    的方法的角度来看,状态是全局的(仅驻留在私有 r/w 成员中)。

让我们有以下场景:

  • 创建了
    T
    的实例,构建了
    loggerScope
    (如
    logger.BeginScope()
    )。
  • M1Async
    被调用,记录一些内容(发出预期的
    loggerScope
    的内容)。
  • M1Async
    检测状态更改并使用新内容重新创建
    loggerScope
    并退出。
  • M2Async
    被调用,记录一些内容(发出意想不到的原始
    loggerScope
    的内容,而不是
    M2Async
    准备的内容)。

全局状态背后的整个想法是:

  • 只有很少的
    loggerScope
    娱乐。
  • 可读代码。

问题:

  1. 范围以这种方式修改回来有什么原因吗?
  2. 有什么方法可以防止它(配置、属性、黑客,等等)吗?
c# .net serilog
1个回答
0
投票

根据 Serilog 来源,看起来

CurrentScope
被声明为
AsyncLocal
,这意味着上述行为是有意的,并且没有代码可以避免它。

© www.soinside.com 2019 - 2024. All rights reserved.