我在基类
的静态构造函数中使用了以下内容 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这样的容器,所以我不想创建记录器的包装器。
此时,我只能想到在基础构造函数中创建记录器的想法,并用锁来保护它。
还有其他建议吗?
答案 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 */);