如何在我的基类中创建一个必须在类中使用某些内容的更丰富的记录器?

时间:2018-05-09 19:04:39

标签: serilog

我在基类

的静态构造函数中使用了以下内容
    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这样的容器,所以我不想创建记录器的包装器。

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

还有其他建议吗?

1 个答案:

答案 0 :(得分: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 */);