.NET Standard 2.0 日志记录 NLOG 给出 System.TypeInitializationException
.NET Standard 2.0 logging NLOG gives System.TypeInitializationException
我做了 2 个项目来在 .NET Framework 4.6.1 标准控制台应用程序和 .NET Standard 2.0 库上测试 NLog。我的意图是将尽可能多的代码移植到 .NET Standard 2.0 以实现未来的多平台兼容性。
两者共享相同的代码,但 .NET Standard 版本会产生异常。
这是代码
Console.WriteLine("Writing log");
Logger _errorLog = LogManager.GetLogger("ErrorsLogger");
Logger _tradesLog = LogManager.GetLogger("TradesLogger");
_errorLog.Error("This is the log message!!!");
Console.WriteLine("End log");
Console.Read();
这是App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="ErrorsLogger" xsi:type="File" fileName="ErrorsLog.txt" />
<target name="TradesLogger" xsi:type="File" fileName="TradesLog.txt" />
</targets>
<rules>
<logger name="ErrorsLogger" minlevel="Info" writeTo="ErrorsLogger" />
<logger name="TradesLogger" minlevel="Info" writeTo="TradesLogger" />
</rules>
</nlog>
</configuration>
我在 .NET 4.6.1 控制台应用程序中得到了日志,并生成了预期的日志文件,其中包含日志消息。
如果我通过某些 Microsoft 单元测试项目 运行 .NET Standard 2.0 库,当它尝试调用 _errorLog.GetLogger
时出现此异常
UnitTestProject.UnitTest1.TestMethod1 threw exception:
System.TypeInitializationException: The type initializer for
'NLog.LogManager' threw an exception. --->
System.TypeInitializationException: The type initializer for
'NLog.LogFactory' threw an exception. --->
System.MissingMethodException: Method not found:
'System.AppDomainSetup System.AppDomain.get_SetupInformation()'.
编辑:
Nuget NLOG Version: 4.4.12
非静态方法抛出的异常:
关于获取更好异常的非静态方法:
在GetLogger("X")层抛出异常,这是一个非静态构造函数。初始化例程甚至在尝试记录某些内容之前就崩溃了。
此外,我在错误列表中收到警告(黄色感叹号):
Warning The 'configuration' element is not declared.
添加内部日志记录不会产生任何输出。这是我使用的配置,从他们的 Internal logging guide:
开始
InternalLogger.LogLevel = LogLevel.Trace;
InternalLogger.LogFile = @"C:\temp\int.txt";
InternalLogger.LogToConsole = true;
InternalLogger.LogToConsoleError = true;
InternalLogger.LogWriter = new StringWriter(new StringBuilder());
InternalLogger.LogToTrace = true;
LogManager.ThrowConfigExceptions = true;
LogManager.ThrowExceptions = true;
Logger logger = LogManager.GetLogger("foo");
我是管理员,Visual Studio 2017 是以管理员身份启动的,我有权在 C:\temp ad 中写入,.NET 4.6.1 控制台应用程序能够在该文件夹中写入,它位于同一个项目。
内部日志文件为空,单元测试项目运行测试成功。
我不知道发生了什么。现在没有错误抛出。
欢迎提出调试问题的任何建议。
GitHub 上的一个 ISSUE 已经打开。
HERE是我给大家做的一个测试方案(密码:logging123)。现在我已经更新到 Nlog 4.5,您将看到 .NET 框架解决方案在尝试获取旧版本的 Nlog(我从未引用过)时抛出错误,并且 .NET Core 单元测试解决方案有效但无效产生任何文件。
虽然我是 运行 .NET 4.7,但我遇到了同样的问题。我将我的 NLog 包从 4.4.12 更新到 4.5.0-rc04 并且它有效。了解它的预发布版本后,您可能需要谨慎对待将其放在实时环境中。
您的压缩解决方案受密码保护,所以现在这只是我的猜测,但看起来您正在使用 app.config 来保存 nlog.config。
很确定 app.config 没有被 NetCoreApps 使用。尝试将您的 Nlog-config 放在一个名为 nlog.config
的单独文件中,并确保它是 Copy Always
(在 Visual Studio 文件属性中)。
我做了 2 个项目来在 .NET Framework 4.6.1 标准控制台应用程序和 .NET Standard 2.0 库上测试 NLog。我的意图是将尽可能多的代码移植到 .NET Standard 2.0 以实现未来的多平台兼容性。
两者共享相同的代码,但 .NET Standard 版本会产生异常。
这是代码
Console.WriteLine("Writing log");
Logger _errorLog = LogManager.GetLogger("ErrorsLogger");
Logger _tradesLog = LogManager.GetLogger("TradesLogger");
_errorLog.Error("This is the log message!!!");
Console.WriteLine("End log");
Console.Read();
这是App.Config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<target name="ErrorsLogger" xsi:type="File" fileName="ErrorsLog.txt" />
<target name="TradesLogger" xsi:type="File" fileName="TradesLog.txt" />
</targets>
<rules>
<logger name="ErrorsLogger" minlevel="Info" writeTo="ErrorsLogger" />
<logger name="TradesLogger" minlevel="Info" writeTo="TradesLogger" />
</rules>
</nlog>
</configuration>
我在 .NET 4.6.1 控制台应用程序中得到了日志,并生成了预期的日志文件,其中包含日志消息。
如果我通过某些 Microsoft 单元测试项目 运行 .NET Standard 2.0 库,当它尝试调用 _errorLog.GetLogger
时出现此异常UnitTestProject.UnitTest1.TestMethod1 threw exception: System.TypeInitializationException: The type initializer for 'NLog.LogManager' threw an exception. ---> System.TypeInitializationException: The type initializer for 'NLog.LogFactory' threw an exception. ---> System.MissingMethodException: Method not found: 'System.AppDomainSetup System.AppDomain.get_SetupInformation()'.
编辑: Nuget NLOG Version: 4.4.12
非静态方法抛出的异常:
关于获取更好异常的非静态方法:
在GetLogger("X")层抛出异常,这是一个非静态构造函数。初始化例程甚至在尝试记录某些内容之前就崩溃了。
此外,我在错误列表中收到警告(黄色感叹号):
Warning The 'configuration' element is not declared.
添加内部日志记录不会产生任何输出。这是我使用的配置,从他们的 Internal logging guide:
开始 InternalLogger.LogLevel = LogLevel.Trace;
InternalLogger.LogFile = @"C:\temp\int.txt";
InternalLogger.LogToConsole = true;
InternalLogger.LogToConsoleError = true;
InternalLogger.LogWriter = new StringWriter(new StringBuilder());
InternalLogger.LogToTrace = true;
LogManager.ThrowConfigExceptions = true;
LogManager.ThrowExceptions = true;
Logger logger = LogManager.GetLogger("foo");
我是管理员,Visual Studio 2017 是以管理员身份启动的,我有权在 C:\temp ad 中写入,.NET 4.6.1 控制台应用程序能够在该文件夹中写入,它位于同一个项目。
内部日志文件为空,单元测试项目运行测试成功。
我不知道发生了什么。现在没有错误抛出。
欢迎提出调试问题的任何建议。
GitHub 上的一个 ISSUE 已经打开。
HERE是我给大家做的一个测试方案(密码:logging123)。现在我已经更新到 Nlog 4.5,您将看到 .NET 框架解决方案在尝试获取旧版本的 Nlog(我从未引用过)时抛出错误,并且 .NET Core 单元测试解决方案有效但无效产生任何文件。
虽然我是 运行 .NET 4.7,但我遇到了同样的问题。我将我的 NLog 包从 4.4.12 更新到 4.5.0-rc04 并且它有效。了解它的预发布版本后,您可能需要谨慎对待将其放在实时环境中。
您的压缩解决方案受密码保护,所以现在这只是我的猜测,但看起来您正在使用 app.config 来保存 nlog.config。
很确定 app.config 没有被 NetCoreApps 使用。尝试将您的 Nlog-config 放在一个名为 nlog.config
的单独文件中,并确保它是 Copy Always
(在 Visual Studio 文件属性中)。