在c#中动态添加使用Log4Net的自定义字段

时间:2014-10-20 10:20:19

标签: c# log4net log4net-configuration log4net-appender

我正在尝试使用c#在我的日志中添加一些自定义字段。当我了解所有领域时,我能够做到这一点。

现在,在一个场景中,我不知道字段的数量。例如。我必须添加对象的参数,并且对象的数量将在运行时继续更改,我需要根据对象的数量添加字段。

是否可以在log4net中进行任何调整来完成此任务,这样每当有新的Object时,就会创建新的字段。

我不确定如何在log4net的配置文件中处理这个问题。

1 个答案:

答案 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
         }
    }
}