您好我尝试使用NLog在App Domain上进行log expcetion。它是Caliburn Micro的WPF应用程序。
在MEF bootstraper中我有这段代码:
static readonly ILog Log = LogManager.GetLog(typeof(NLogLogger));
#region Constructors
public MefBootStrapper()
: base()
{
_msgBox = new MessageBoxes();
_doHandle = true;
}
static MefBootStrapper()
{
LogManager.GetLog = type => new NLogLogger(type);
}
#endregion
#region Exception handling on App Domain
protected override void OnUnhandledException(object sender,
System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
if (_doHandle)
{
Log.Error(e.Exception.InnerException);
_msgBox.ShowException(e.Exception.InnerException);
e.Handled = true;
}
else
{
Log.Error(e.Exception.InnerException);
_msgBox.ShowException(e.Exception);
e.Handled = false;
}
}
#endregion
当我运行app并从视图模块类中抛出异常时,它会显示消息框,但是异常不会记录到文件中。
我在视图模型调用中尝试记录异常:
类似这样的东西:Log.Error(new Exception(“4”));
这项工作,但是如果我在OnUnhandleException方法中尝试记录异常,它就不会发生故障。为什么呢?
答案 0 :(得分:0)
您的问题是静态字段Log
在静态构造函数运行之前被初始化(Static field initialization)。因此,您的Log
字段将使用默认的Caliburn Nulloger初始化而非您的NLogLogger。您应该将Log字段初始化移动到静态构造函数中。
private static readonly ILog Log;
static MefBootStrapper()
{
LogManager.GetLog = type => new NLogLogger(type);
Log = LogManager.GetLog(typeof(NLogLogger));
}