【问题标题】:Dynamic Logger per Type in Log4NetLog4Net 中每种类型的动态记录器
【发布时间】:2012-10-04 23:22:56
【问题描述】:

我在 ASP.NET MVC 网站中使用(可能滥用)log4net。我希望每个班级有一个记录器(which the docs suggest),但似乎我需要为每个班级预先配置一个记录器。

是吗?我需要预定义每个记录器吗?

我正在追加到 SqlServer 并且可以在架构中看到名为 Logger 的列。似乎在该字段中放置我想要的任何内容应该很容易,但我能找到的唯一动态记录器创建是here。我错过了什么吗?

【问题讨论】:

    标签: c# asp.net-mvc log4net


    【解决方案1】:

    您不需要预先定义每个记录器。相反,传统的方法是使用标准模式的 log4net 记录器,在消费类中使用反射来通过Type 声明记录器。只需将此属性转储到每个类中即可:

    private static log4net.ILog _logger;
    private static log4net.ILog Logger
    {
        get
        {
            if( _logger == null )
            {
                Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
                _logger = log4net.LogManager.GetLogger( type );
            }
            return _logger;
        }
    }
    

    【讨论】:

    • 这个答案(及其他)解释了它。让我失望的是 log4net 示例,其中数十个记录器预先配置为 XML。最重要的是,我的日志没有写入,所以这让我觉得我需要一个预配置的记录器,但我很高兴地说这是错误的。谢谢大家
    【解决方案2】:

    当您说每个类 1 个记录器时,您指的是用于创建日志消息的编程 ILog。这些实际上确实需要预定义,但它与 Metro Smurf 提供的方法一样简单,如果您不关心定义可能不会使用的 ILog,它甚至更简单:

    private static ILog logger = 
       LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    

    这两种方法都可以配置记录器。反射用于获取当前方法的类名,然后将其用作记录器名称,因此将方法称为“动态”。这也可以这样编码(但是每个类中的代码会有所不同,并且反射方法可以很容易地作为sn-p来做)。

    private static ILog logger = LogManager.GetLogger(typeof(MyCurrentClass));
    

    根据您关于“随心所欲”的评论,您也可以在创建 ILog 实例时非常轻松地做到这一点(请原谅双关语)。

    private static ILog logger = LogManager.GetLogger("whatever I want");
    

    您包含的链接不仅创建了一个 ILog 记录器,而且还创建了一个附加程序来与之配套。我不认为这是一个好习惯,因为附加程序可以在运行时在 web.config 或 app.config 中更轻松地配置,并且通常不需要超过一两个附加程序,以及所有记录器输出去appenders。

    【讨论】:

      【解决方案3】:

      这里的“动态”方面是什么?您确实需要实例化一个记录器才能使用它,就像您必须实例化一个数据库连接才能使用它一样。剩下的只是命名问题。

      Log4net 可以通过软件组件轻松命名记录器。这个可以 通过在每个类中静态实例化一个记录器来完成, 记录器名称等于类的完全限定名称。 这是定义记录器的一种有用且直接的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-24
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多