NLog GetCurrentClassLogger()抛出TypeInitializationException

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLog GetCurrentClassLogger()抛出TypeInitializationException相关的知识,希望对你有一定的参考价值。

我正在移植已经运行了几年的代码,从运行Windows 7的机器到Windows 10.该项目是一个使用.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:	emp
log-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.Config相同。

不知道如何继续或确定内部异常。

答案

如果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种可能的解决方

Using lazy

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

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

Create the logger in the main()

class Program
{
    private static Logger logger;

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

Create a local logger

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

以上是关于NLog GetCurrentClassLogger()抛出TypeInitializationException的主要内容,如果未能解决你的问题,请参考以下文章

NLog日志记录

NLog写入Mongo日志配置

Nlog.config - 只读

NLog的介绍使用

NLog学习

NLOG配置