App对象中的Log4Net?

时间:2010-03-29 17:16:27

标签: wpf log4net

我开始使用Log4Net作为日志记录组件登录WPF桌面应用程序。这是我的问题:在一个简单的桌面应用程序中,有没有理由不将我的记录器实例化为App类(App.xaml.cs)的属性,就像这样?

public partial class App : Application
{
        private static readonly ILog p_Logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);

        public ILog Logger
        {
            get { return p_Logger; }
        }

        #endregion
    }
}

这将允许我调用记录器

3 个答案:

答案 0 :(得分:7)

有一个原因让人想起:因为App类的静态构造函数是将运行的代码的第一位,所以在配置log4net之前,您将实例化ILog实例。因此,您ILog实例将无法使用。一般来说,你会做这样的事情:

public partial class App : Application
{
    private static ILog log;

    static App()
    {
        XmlConfigurator.Configure();
        log = LogManager.GetLogger(typeof(App));
    }
}
顺便说一句,MethodBase生意让我感到畏缩。为什么不使用typeof(App)?无论如何,你不应该在没有验证的情况下复制/粘贴代码...... typeof(App)可以很好地使用重构工具......

答案 1 :(得分:3)

使用一个全局实例的几个案例反对。通过每个班级使用一个记录器,您可以获得:

  • 记录器层次结构的好处,自动遵循您的类结构。
  • 较小的耦合(您的类不再依赖App类)。

答案 2 :(得分:2)

我确实找到了在App对象中不使用全局记录器的原因。它运行正常,但是从每个将使用它的类中获取记录器是有利的 - 它使我的日志消息更短更容易编写。

所以我在每个将要记录的类中调用GetLogger(),并指定用于记录器的名称。例如,在我的OpenFile方法中,我可以得到这样的记录器:

// Get logger
var logger = LogManager.GetLogger("OpenFile"); 

这使我无法在我写的每条错误消息中输入类名。我仍然在App()构造函数中配置log4net,因为只需要执行一次。这给了我一条如下所示的日志消息:

2010-03-29 15:51:41,951 OpenFile [DEBUG]- Data file opened.

肯特的答案仍然是公认的答案,但我认为我会传授我学到的东西。