NLog GetCurrentClassLogger()引发TypeInitializationException

时间:2019-04-10 19:25:14

标签: c# nlog

我正在将运行了几年的代码从运行Windows 7的计算机移植到Windows10。该项目是使用.NET Framework 4.5.2和NLog 4.4.12的类库。重新编译后,应用程序在构造函数中引发TypeInitializationException。

尝试了以下内容:

  1. 注释NLog代码-成功
  2. 将NLog升级到4.6.2-失败
  3. 创建了一个测试控制台应用程序以验证NLog是否已正确安装-成功
  4. 尝试将NLog.config剥离为仅控制台目标/规则-失败
  5. 逐步重建类-引入NLog初始化器后立即失败

引发异常(甚至不输入构造函数):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>

  • 与Test Console应用程序一起使用的NLog.Config相同,可以正常工作。

不知道如何进行或确定内部异常。

1 个答案:

答案 0 :(得分:0)

如果NLog中存在问题,例如错误的日志记录配置,NLog可能会引发异常。

如果在构造启动类型之前引发此异常,.NET将使用TypeInitializationException隐藏该异常(另请参见Better TypeInitializationException (innerException is also 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();
    }
}