WPF-Caliburn.Micro-NLog обрабатывает исключение в домене приложения - PullRequest
1 голос
/ 15 октября 2011

Привет. Я пытаюсь удалить журнал в App Domain с помощью NLog.Это приложение WPF с Caliburn Micro.

В загрузчике 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, он не работает.Почему?

1 Ответ

0 голосов
/ 15 октября 2011

Ваша проблема в том, что статическое поле Log инициализируется до запуска статического конструктора, см. ( Инициализация статического поля) .Таким образом, у вас будет ваше поле Log с инициализированным Caliburn Nulloger вместо вашего NLogLogger.Вы должны переместить инициализацию поля Log в ваш статический конструктор.

private static readonly ILog Log;

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