NLog GetCurrentClassLogger () создает исключение TypeInitializationException - PullRequest
0 голосов
/ 10 апреля 2019

Я портирую код, который работал уже несколько лет, с компьютера под управлением Windows 7 на Windows 10. Проект представляет собой библиотеку классов, которая использует .NET Framework 4.5.2 с NLog 4.4.12.После перекомпиляции приложение генерирует исключение TypeInitializationException в конструкторе.

Попробовал следующее:

  1. Закомментируйте код NLog - success .
  2. Обновлен NLog до 4.6.2 - fail .
  3. Создано тестовое консольное приложение для проверки правильности установки NLog - success .
  4. Попытка удаленияNLog.config только для консольной цели / правила - fail .
  5. Пошаговое перестроение класса - завершается неудачно сразу после введения NLog Intializer.

Выдает исключение (даже не входит в конструктор): private static NLog.Logger m_nLog = LogManager.GetCurrentClassLogger();

NLog.config:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd" 
    autoReload="true" 
    throwExceptions="true" 
    internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">

<targets>
    <target name="console" xsi:type="Console" 
        layout     = "${time} ${uppercase:${level}} ${message}" />

    <target name="logfile" xsi:type="File" 
        fileName   = "${basedir}/Logs/${shortdate}.log" 
        layout     = "${time} ${uppercase:${level}} ${message}" />
</targets>

<rules>
    <logger name="*" minlevel="Info"  writeTo="console" />
    <logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>

  • тот же NLog.Конфигурация используется с приложением Test Console, которое работает.

Не знаю, как поступить или определить внутреннее исключение.

1 Ответ

0 голосов
/ 12 апреля 2019

Если в NLog есть проблема, например, неправильная конфигурация ведения журнала, NLog может выдать исключение.

Если это исключение выбрасывается до создания типа запуска, .NET скрывает исключение с помощью TypeInitializationException (См. Также Лучшее TypeInitializationException (innerException также имеет значение null) ).

Например, в этом случае:

class Program
{
    // this throws a NLogConfigurationException because of bad config. (like invalid XML)
    // as this issue will be throw before Main() is called, you will get
    // a TypeInitializationException instead of a NLogConfigurationException
    private static Logger logger = LogManager.GetCurrentClassLogger();

    static void Main()
    {
        Console.WriteLine("Press any key");
        Console.ReadLine();
    }
}

Решения

3 возможных решения:

Использование ленивых

class Program
{
    private static Lazy<Logger> logger = new Lazy<Logger>(() => LogManager.GetCurrentClassLogger());

    static void Main()
    {
        Console.WriteLine("Press any key");
        Console.ReadLine();
    }
}

Создатьрегистратор в main ()

class Program
{
    private static Logger logger;

    static void Main()
    {
        logger = LogManager.GetCurrentClassLogger();
        Console.WriteLine("Press any key");
        Console.ReadLine();
    }
}

Создание локального регистратора

class Program
{
    static void Main()
    {
        private logger = LogManager.GetCurrentClassLogger();
        Console.WriteLine("Press any key");
        Console.ReadLine();
    }
}
...