NLog GetCurrentClassLogger()抛出TypeInitializationException
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NLog GetCurrentClassLogger()抛出TypeInitializationException相关的知识,希望对你有一定的参考价值。
我正在移植已经运行了几年的代码,从运行Windows 7的机器到Windows 10.该项目是一个使用.NET Framework 4.5.2和NLog 4.4.12的类库。重新编译后,应用程序在构造函数中抛出TypeInitializationException。
尝试以下方法:
- 注释掉NLog代码 - 成功。
- 将NLog升级到4.6.2 - 失败。
- 创建了一个测试控制台应用程序,以验证NLog是否已正确安装 - 成功。
- 试图剥离NLog.config只是控制台目标/规则 - 失败。
- 逐步重建类 - 在引入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的主要内容,如果未能解决你的问题,请参考以下文章