WPF-Caliburn.Micro-NLog 处理应用程序域上的异常

发布于 2024-12-10 05:05:42 字数 1129 浏览 0 评论 0 原文

您好,我尝试使用 NLog 在应用程序域上记录expcetion。它是带有 Caliburn Micro 的 WPF 应用程序。

在 MEF 引导程序中,我有以下代码:

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

当我运行应用程序并从视图模型类抛出异常时,它会显示消息框,但异常不会记录到文件中。

我尝试在视图模型调用中记录异常:

如下所示: Log.Error(new Exception("4"));

这项工作有效,但是如果我尝试在 OnUnhandleException 方法中记录异常,它不会工作。为什么?

Hi I try log expcetion on App Domain with NLog. It is WPF app with Caliburn Micro.

In MEF bootstraper I have this code:

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

When I run app and throw exception from view modle class it show message box that is ok but exception is not logged to file.

I try log exception in view model calls:

something like this: Log.Error(new Exception("4"));

This work, but If i try log exception in OnUnhandleException method it doesnt wokr. Why?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

じ违心 2024-12-17 05:05:42

您的问题是静态字段 Log 在静态构造函数运行之前被初始化,请参阅(静态字段初始化)。因此,您的 Log 字段将初始化默认的 Caliburn Nulloger,而不是 NLogLogger。您应该将 Log 字段初始化移至静态构造函数中。

private static readonly ILog Log;

static MefBootStrapper()
{
    LogManager.GetLog = type => new NLogLogger(type);
    Log = LogManager.GetLog(typeof(NLogLogger));
}

Your problem is that the static field Log gets initialized before your static constructor runs see (Static field initialization). So you will have your Log field with the default Caliburn Nulloger initialized instead of your NLogLogger. You should move the Log field initialization into your static constructor.

private static readonly ILog Log;

static MefBootStrapper()
{
    LogManager.GetLog = type => new NLogLogger(type);
    Log = LogManager.GetLog(typeof(NLogLogger));
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文