我如何在我的 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 */);
我在基础的静态构造函数中使用了以下内容 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 */);