如何在我的基类中创建一个必须在类中使用某些东西的记录器呢?

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

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

    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();
    }

现在我需要附加一个我们自己的自定义浓缩器。富集程序期望一个必须使用实际Application类的修饰符的函数。

例如,我需要这样做

    .Enrich.WithStoreData(()=>GetStoreData) 

好吧,它不一定是一个函数,底线是,GetStoreData的调用是使用在实际的子应用程序类中实例化的对象(我不能改变该对象的生命周期),所以我无法访问静态构造函数中的对象。

这意味着我必须将记录器创建移动到普通的基础构造函数。因为它有很多孩子,我怎样才能确保记录器创建只执行一次?这意味着我必须应用一个锁并检查是否已经创建了记录器。那太难看了。

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

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

还有其他建议吗?

serilog
1个回答
1
投票

您只能在配置Serilog时使用浓缩,如果要在基类中配置静态记录器,则以后不能在运行时更改浓缩。

但您可以在运行时使用上下文记录器向记录器添加其他属性: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 */);
© www.soinside.com 2019 - 2024. All rights reserved.