我如何在我的 baseclass 中创建一个带有 enricher 的记录器,它必须在 class 中使用一些东西?

How can I create the logger with an enricher in my baseclass that has to use something in the class?

我在基础的静态构造函数中使用了以下内容 class

    static ApplicationBase()
    {
        Log.Logger = new LoggerConfiguration()
            .Enrich.FromLogContext()
            .Enrich.WithMachineName()
            .Enrich.WithThreadId()
            .Enrich.FromLogContext()
            .MinimumLevel.Debug()
            .WriteTo.Async(a => a.RollingFile(
                new RenderedCompactJsonFormatter(),
                @"c:\logs\log-{Date}.txt", fileSizeLimitBytes: 4194304)) 
            .CreateLogger();
    }

现在我需要附加一个我们自己的自定义增强器。 enricher 需要一个函数,该函数必须使用实际应用程序的修饰符 class。

例如,我需要做

    .Enrich.WithStoreData(()=>GetStoreData) 

好吧,它不一定是函数,最重要的是,调用 GetStoreData 是使用在实际 child 应用程序 class 中实例化的 object(而且我无法更改 object) 的生命周期,因此我无法从静态构造函数访问 object。

这意味着我必须将记录器的创建移到普通的基本构造函数中。因为它有很多children,我如何确保记录器创建只执行一次?这意味着我必须应用锁并检查是否已经创建了记录器。那真的很难看。

而且我没有使用像 autofac 这样的任何容器,所以我不想创建记录器的包装器。

至此,我只能想到在基础构造函数中创建记录器的想法,并用锁保护它。

还有其他建议吗?

您只能在配置 Serilog 时使用扩充,如果您在基础 class 中配置静态记录器,则您无法在以后 运行 时更改扩充。

但是您可以在 运行 时使用 上下文记录器 来向您的记录器添加额外的属性:Serilog Context and Correlation

添加日志上下文

// Log.Logger is initialized in your static base 
var StudentLogger = Log.Logger.ForContext<Student>();
StudentLogger.Error(/* log message */);

添加相关性:

// Log.Logger is initialized in your static base 
var orderId = "some value";
var corrLog = Log.Logger.ForContext("orderId", orderId)
corrLog.Error(/* log message */);