elasticsearch,serilog,C#,elasticsearch,Serilog" /> elasticsearch,serilog,C#,elasticsearch,Serilog" />

C# Serilog属性解构不会';你不能始终如一地工作吗?

C# Serilog属性解构不会';你不能始终如一地工作吗?,c#,elasticsearch,serilog,C#,elasticsearch,Serilog,我试图用一个对象来丰富我的Serilog日志上下文,并让它的属性在Elasticsearch中显示为解构的。当我使用LogContext.PushProperty时,这可以正常工作: var conductorContext=new { WorkflowInstanceId, task.TaskId, TaskName=task.WorkflowTask.Name, 任务类型, task.InputData }; 使用(LogContext.PushProperty(“ConductorCont

我试图用一个对象来丰富我的Serilog日志上下文,并让它的属性在Elasticsearch中显示为解构的。当我使用
LogContext.PushProperty
时,这可以正常工作:

var conductorContext=new
{
WorkflowInstanceId,
task.TaskId,
TaskName=task.WorkflowTask.Name,
任务类型,
task.InputData
};
使用(LogContext.PushProperty(“ConductorContext”,ConductorContext,DestructureObject:true))
ConductorContext
对象被整齐地分解,其属性可在Elasticsearch中单独访问:

“字段”:{
“ConductorContext”:{
“工作流实例ID”:“8dca7ebd-4b68-4389-ab98-136bbdf11484”,
“TaskId”:“29cef277-dc33-45a6-8b07-65a4de327f49”,
“任务名称”:“LoadAangrijpOmsDataTask”,
“任务类型”:“LoadAangrijpOmsDataTask”,
“InputData”:空
}
}
但是,当我使用带属性的
时(我想添加一个全局对象),如下所示(在我的
Program.cs:Main
方法中):

Log.Logger=new LoggerConfiguration()
.Enrich.WithProperty(“NomadContext”),新
{
AllocationId=Environment.GetEnvironmentVariable(“NOMAD\u ALLOC\u ID”),
AllocationName=Environment.GetEnvironmentVariable(“NOMAD\u ALLOC\u NAME”),
JobId=Environment.GetEnvironmentVariable(“NOMAD\u JOB\u ID”),
JobName=Environment.GetEnvironmentVariable(“NOMAD_JOB_NAME”),
GroupName=Environment.GetEnvironmentVariable(“NOMAD\u GROUP\u NAME”),
TaskName=Environment.GetEnvironmentVariable(“NOMAD_TASK_NAME”)
},DestructureObject:true)
NomadContext
在Elasticsearch中显示为字符串:

“字段”:{
“NomadContext:“{AllocationId=293dd620-955c-7f8d-b6b5-9a36546bd29d,AllocationName=da_pub_worker.group_da_pub_worker[1],JobId=,JobName=da_pub_worker,GroupName=group_da_pub__worker,TaskName=task_da_pub_worker}”
}
我不明白为什么第一个有效,而第二个无效。我错过了什么


我正在使用Serilog.Sinks.Elasticsearch包。

问题不在Serilog或Serilog.Sinks.Elasticsearch包中,而是在我的麋鹿堆栈本身的配置中


删除并重新创建我的索引使NomadContext被正确地解构。

当网络库中的对象有多个指向该对象的父链接时,直到所有链接都断开,该对象才会被释放。当在使用块中时,对象在退出该块时会被自动释放。因此,看起来您的情况是2因此您必须将调用放到LoggerConfiguration()中方法将其释放。@jdweng谢谢,但我不确定您的评论是否相关。我不寻找要释放的对象。从功能上说,日志记录可以正常工作,但我的问题是NomadContext的结构不正确。我将更新我的问题,以显示如何使用LoggerConfiguration。原因如下:st method is Disposition是指代码位于using块内。正如我所说,using块内的任何内容在退出块时都会被释放。第二个方法没有using块,因此它不会被释放。Hi Erik-我对此进行了测试,
NomadContext
为我提供了结构化数据(使用
WriteTo.Console)(new JsonFormatter())
)-您正在使用哪个接收器/您如何确定输出的格式?您好@NicholasBlumhardt,我很抱歉。我正在使用Elasticsearch和Serilog.Sinks.Elasticsearch包。显然,问题可能很容易出现在后者。我已经在问题中添加了额外的信息。