2014-10-20 56 views
0

我想在使用c#的日志中添加一些自定义字段。当我知道所有的领域时,我能够做到这一点。在c中动态添加使用Log4Net的自定义字段#

现在,在一种情况下,我不知道字段的数量。例如。我必须添加对象的参数,并且在运行期间对象的数量会不断变化,我需要根据对象的数量添加字段。

是否有任何调整可以在log4net完成这一点,所以每当有新的对象创建新的字段。

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

回答

1

您可以在custom property为log4net的添加对象的属性和日志属性的内容在您的格式:

例如,在你的代码:

log4net.ThreadContext.Properties[ "myObjectProperties" ] = obj.prop1 + " " obj.prop2; // + ...; 

,并在配置:

<conversionPattern value="%logger (%property{myObjectProperties}) [%level]- %message%newline" /> 

您不能拥有一个即时可配置的模式;你可以有多种模式来匹配不同的对象,但这不会很容易管理。

编辑:好了,你可以有一个运行时配置的模式,但不原生地:)不过你也许可以有一个模式是能够从上述性能的加载

2日编辑:如果有多达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 
     } 
    } 
} 
+0

确定,但其匹配我想我的要求。它就像我想要添加5000个名称为动态的值,并在应用程序运行时设置。在log4net.config中,我们通常使用这些名称,但有什么办法可以将这些动态设置为5000个值不可行 – NitinG 2014-10-28 05:14:23

+0

如果值来自对象,则可能需要重写ToString方法(或其他常用方法,例如来自接口),它将转储每种类型对象的特定值。记录方法输出,或者创建一个自定义appender,以自定义的方式处理这些对象。见第二编辑 – samy 2014-10-28 07:48:45

+0

非常感谢。我已经覆盖了PatternLayout类并相应地推送了所有这些属性和值。在开始时看起来很体面,但让我们看看它是如何移动的,因为我需要在其中实施复杂的东西。 – NitinG 2014-10-28 08:16:11