【问题标题】:Add Custom Fields using Log4Net dynamically in c#在 c# 中使用 Log4Net 动态添加自定义字段
【发布时间】:2014-10-20 10:20:18
【问题描述】:

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

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

是否可以在 log4net 中进行任何调整来完成此操作,所以每当有新对象时,都会创建新字段。

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

【问题讨论】:

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


    【解决方案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())) 或创建一个能够处理特定接口的自定义附加程序处理:

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

    【讨论】:

    • 好的,但我猜它符合我的要求。就像我想添加 5000 个名称是动态的并且将在应用程序运行时设置的值。在 log4net.config 中,我们通常会放置这些名称,但有什么方法可以动态放置它们,因为放置 5000 个值是不可行的
    • 如果值来自对象,您可能需要覆盖 ToString 方法(或其他一些常用方法,例如来自接口),该方法将转储每种对象类型的特定值。要么记录方法输出,要么创建一个以自定义方式处理这些对象的自定义附加程序。见第二次编辑
    • 非常感谢。我已经覆盖了 PatternLayout 类并相应地推送了所有这些属性和值。一开始它看起来不错,但让我们看看它是如何移动的,因为我需要在其中实现很多复杂的东西。
    猜你喜欢
    • 2012-08-21
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多