我开始使用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
}
}
这将允许我调用记录器
答案 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)
使用一个全局实例的几个案例反对。通过每个班级使用一个记录器,您可以获得:
答案 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.
肯特的答案仍然是公认的答案,但我认为我会传授我学到的东西。