我正在尝试使用 c# 在我的日志中添加一些自定义字段。当我了解所有领域时,我能够做到这一点。
现在,在一种情况下,我不知道字段的数量。例如,我必须添加对象的参数,并且对象的数量将在运行时不断变化,我需要根据对象的数量添加字段。
是否可以在 log4net 中进行任何调整来完成此操作,因此每当有新对象时,都会创建新字段。
我主要不确定如何在 log4net 的配置文件中处理这个问题。
我正在尝试使用 c# 在我的日志中添加一些自定义字段。当我了解所有领域时,我能够做到这一点。
现在,在一种情况下,我不知道字段的数量。例如,我必须添加对象的参数,并且对象的数量将在运行时不断变化,我需要根据对象的数量添加字段。
是否可以在 log4net 中进行任何调整来完成此操作,因此每当有新对象时,都会创建新字段。
我主要不确定如何在 log4net 的配置文件中处理这个问题。
您可以在log4net的自定义属性中添加对象的属性,并以您的格式记录属性的内容:
例如在您的代码中:
log4net.ThreadContext.Properties[ "myObjectProperties" ] = obj.prop1 + " " obj.prop2; // + ...;
并在配置中:
<conversionPattern value="%logger (%property{myObjectProperties}) [%level]- %message%newline" />
您不能拥有可即时配置的模式;你可以有多个模式来匹配不同的对象,但这不是很容易管理。
编辑:嗯,你可以有一个运行时可配置的模式,但不是本机的:) 但是你可能有一个能够从上述属性加载的模式
第二次编辑:如果您需要多达 4000 个属性,为什么不考虑将所有这些属性作为消息本身的一部分推送(log.Info(myObject.ToString())
)或创建一个能够处理特定接口来处理的自定义附加程序:
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
}
}
}