将C#params与serilog一起使用
刚开始使用Serilog+ElasticSearch,我想知道是否有一种优雅的方法可以在一个日志条目中记录将C#params与serilog一起使用,c#,elasticsearch,parameters,optional-parameters,serilog,C#,elasticsearch,Parameters,Optional Parameters,Serilog,刚开始使用Serilog+ElasticSearch,我想知道是否有一种优雅的方法可以在一个日志条目中记录params对象数组。到目前为止,我唯一能够管理它的方法是通过每个params进行循环,这会为每个参数创建一个单独的日志条目。有没有办法把它们合并成一个日志条目 谢谢 样本: public static void MethodEntry<T>(string methodName, params object[] parameters) { if (parameters.L
params
对象数组。到目前为止,我唯一能够管理它的方法是通过每个params
进行循环,这会为每个参数创建一个单独的日志条目。有没有办法把它们合并成一个日志条目
谢谢
样本:
public static void MethodEntry<T>(string methodName, params object[] parameters)
{
if (parameters.Length > 0)
foreach (var param in parameters) // Will create parameters.Length number of log entries
Log.ForContext(typeof(T)).Debug("Entering {MethodName} with {@Param}", methodName, param);
else
Log.ForContext(typeof(T)).Debug("Entering {MethodName}", methodName);
}
publicstaticvoidmethodentry(stringmethodname,params object[]参数)
{
如果(parameters.Length>0)
foreach(参数中的var param)//将创建参数。长度日志条目数
Debug(“用{@Param}输入{MethodName}”,MethodName,Param);
其他的
Debug(“输入{MethodName}”,MethodName);
}
编辑:
使用的水槽:
- 塞里洛格
- Serilog.Sinks.Elasticsearch(包括文件、周期性批处理和滚动文件接收器)
- 像Environment和ThreadId这样的两个Enricher
Log.Logger = new LoggerConfiguration()
.Destructure.ByTransforming<YOUR_SENDER_TYPE>(
r => new { firstValue = r.firstValue, secondValue = r.secondValue })
.WriteTo ....
Log.Logger=new LoggerConfiguration()
.通过转换来破坏结构(
r=>new{firstValue=r.firstValue,secondValue=r.secondValue})
.写。。。。
有关记录结构化数据的更多信息,请参见官方文档如果您知道发件人对象的特定类型,可以使用Serilog的以下功能来避免记录不需要的信息:
Log.Logger = new LoggerConfiguration()
.Destructure.ByTransforming<YOUR_SENDER_TYPE>(
r => new { firstValue = r.firstValue, secondValue = r.secondValue })
.WriteTo ....
Log.Logger=new LoggerConfiguration()
.通过转换来破坏结构(
r=>new{firstValue=r.firstValue,secondValue=r.secondValue})
.写。。。。
有关记录结构化数据的详细信息,请参见官方文档publicstaticvoidmethodentry(stringmethodname,params object[]parameters)
{
Log.ForContext()
.ForContext(“参数”,参数)
.Debug(“输入{MethodName}”,MethodName);
}
这应该满足您的要求。公共静态void MethodEntry(string methodName,params object[]parameters)
{
Log.ForContext()
.ForContext(“参数”,参数)
.Debug(“输入{MethodName}”,MethodName);
}
这应该可以满足您的要求。您是否尝试过记录参数?类似于以下内容:
Log.ForContext(typeof(T)).Debug(“使用{@Parameters}输入{MethodName}”,MethodName,Parameters)代码>?@SamvelPetrosov我确实尝试过,但它导致内存使用量急剧上升,直到崩溃时才写入日志项。您传递了多少个参数?@SamvelPetrosov在崩溃的情况下,它是2(这是一个事件,所以对象发送方和事件参数e
),您使用哪个接收器?请添加Serilog的初始配置您是否尝试过将参数记录到日志中?类似于以下内容:Log.ForContext(typeof(T)).Debug(“使用{@Parameters}输入{MethodName}”,MethodName,Parameters)代码>?@SamvelPetrosov我确实尝试过,但它导致内存使用量急剧上升,直到崩溃时才写入日志项。您传递了多少个参数?@SamvelPetrosov在崩溃的情况下,它是2(这是一个事件,所以对象发送方和事件参数e
),您使用哪个接收器?请添加SerilogInterest的初始配置!我唯一关心的是.NET事件中的发送者不总是一个通用的对象吗?然后覆盖将应用于所有对象
s,而不仅仅是发送方
一个……是的,这就是为什么我从“如果你知道具体类型”开始回答的原因。例如,当您作为发件人单击按钮时,有一个装箱的“button”对象,因此检查is button
将返回true。明白了,仍然Destructure
很高兴知道这一点,谢谢!如果没有关于事件发送者的具体答案,那么我将在一天内或一天内接受这个答案。很有趣!我唯一关心的是.NET事件中的发送者不总是一个通用的对象吗?然后覆盖将应用于所有对象
s,而不仅仅是发送方
一个……是的,这就是为什么我从“如果你知道具体类型”开始回答的原因。例如,当您作为发件人单击按钮时,有一个装箱的“button”对象,因此检查is button
将返回true。明白了,仍然Destructure
很高兴知道这一点,谢谢!如果没有针对事件发送方的特定答案,那么我将在一天或一天内接受此答案。我用以下对象尝试了这种方法:Dim testStr=“test”
&Dim testObj=New with{Key.Name=“test”,.Price=1.29}
。日志条目根本没有写入,没有崩溃或异常似乎只是跳过了调用。调用:\u logger.MethodEntry(NameOf(TestMethod)、testStr、testObj)
方法:log.ForContext(“参数”,参数)。调试(“输入{MethodName}”,MethodName)代码>其中参数
是参数对象[]参数
。有什么想法吗?我仍然对此有问题,有什么想法吗?您是否打开了Debug
级别的日志记录?有一件事需要检查。是的,我确实检查了一下,以确保我没有发疯。hahaI用以下对象尝试了这种方法:Dim testStr=“test”
&Dim testObj=New with{Key.Name=“test”,.Price=1.29}
。日志条目根本没有写入,没有崩溃或异常似乎只是跳过了调用。调用:\u logger.MethodEntry(NameOf(TestMethod)、testStr、testObj)
方法:log.ForContext(“参数”,参数)。调试(“输入{MethodName}”,MethodName)代码>其中参数
是参数对象[]参数
。有什么想法吗?我仍然对此有问题,有什么想法吗?您是否打开了Debug
级别的日志记录?有一件事要告诉切克