我正在尝试使用c#在我的日志中添加一些自定义字段。当我了解所有领域时,我能够做到这一点。
现在,在一个场景中,我不知道字段的数量。例如。我必须添加对象的参数,并且对象的数量将在运行时继续更改,我需要根据对象的数量添加字段。
是否可以在log4net中进行任何调整来完成此任务,这样每当有新的Object时,就会创建新的字段。
我不确定如何在log4net的配置文件中处理这个问题。
答案 0 :(得分:1)
您可以在custom property中为log4net添加对象的属性,并在格式中记录属性的内容:
例如在您的代码中:
log4net.ThreadContext.Properties[ "myObjectProperties" ] = obj.prop1 + " " obj.prop2; // + ...;
并在配置中:
<conversionPattern value="%logger (%property{myObjectProperties}) [%level]- %message%newline" />
您不能拥有可随时配置的模式;您可以拥有多个匹配不同对象的模式,但这不容易管理。
编辑:嗯,你可以有一个运行时可配置的模式,但不是本机的:)但是你可能有一个能够从上述属性加载的模式第二次编辑:如果您需要多达4000个属性,为什么不考虑将所有这些属性作为消息本身(log.Info(myObject.ToString())
)的一部分推送,或者创建一个能够处理的属性的自定义appender特定的处理界面:
public interface IHaveManyFieldsToLog
{
public string[] GetAllPropertyValues()
}
public class ManyFieldsToLogAppender: SkeletonAppender
{
// pseudocode, I don't have the IDE at the moment
public override AppendLog(LogEvent event)
{
if (event.Parameter[0] as IHaveManyFieldsToLog != null)
{
var values = (event.Parameter[0] as IHaveManyFieldsToLog).GetAllPropertyValues();
// concat all values and push it to the log
}
}
}