【问题标题】:.NET Standard 2.0 logging NLOG gives System.TypeInitializationException.NET Standard 2.0 日志记录 NLOG 给出 System.TypeInitializationException
【发布时间】:2018-01-17 21:00:49
【问题描述】:

我做了 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 抛出异常: System.TypeInitializationException:类型初始化程序 'NLog.LogManager' 抛出异常。 ---> System.TypeInitializationException:类型初始化程序 'NLog.LogFactory' 抛出异常。 ---> System.MissingMethodException:找不到方法: 'System.AppDomainSetup System.AppDomain.get_SetupInformation()'。

编辑: Nuget NLOG Version: 4.4.12

在非静态方法中抛出异常:

关于获取更好异常的非静态方法:

异常在GetLogger("X") 级别抛出,这是一个非静态构造函数。初始化例程甚至在尝试记录之前就崩溃了。

此外,我在错误列表中得到一个警告(黄色感叹号):

警告未声明“配置”元素。

添加内部日志不会产生任何输出。这是我用过的配置,从他们的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 中写入,而 .NET 4.6.1 控制台应用程序能够在该文件夹中写入,并且它在同一个项目中。

内部日志文件为空,单元测试项目运行测试成功。

我不知道发生了什么。现在没有抛出错误。

欢迎任何调试问题的建议。

GitHub 上的ISSUE 已打开。

HERE 是我为您展示的测试解决方案(密码:logging123)。现在我已更新到 Nlog 4.5,您将看到 .NET 框架解决方案在尝试获取旧版本的 Nlog(我从未引用过)时抛出错误,并且 .NET Core 单元测试解决方案有效但没有生成任何文件。

【问题讨论】:

  • 似乎有体面问题。请列出所有的 nlog (nuget) 版本
  • 如果你封装对logmanager的调用是一个非静态方法,你可能会得到一个更好的内部异常
  • @Julian 添加了。关于非静态,请阅读更多详细信息
  • 在 4.5 版中添加了对 .netstandard 1.5 和 2.0 的支持,目前处于测试阶段。
  • @HansPassant 我喜欢你如何将我指向正确的方向,而 Julian 的实际管理员甚至没有给我任何暗示。愚蠢的我无法单独找到该信息。

标签: nlog .net-standard-2.0 typeinitializeexception


【解决方案1】:

虽然我运行的是 .NET 4.7,但我遇到了同样的问题。我将我的 NLog 包从 4.4.12 更新到 4.5.0-rc04 并且它工作正常。不过,了解它的预发布版本后,您可能需要注意将其置于实际环境中。

【讨论】:

  • 所以你必须从网站上拿走它?它在 NuGet 上不可用
  • 没有。按照链接。它会带你到 NuGet 网站和特定的包本身。从那里您可以复制包管理器的说明。
  • 现在它不会抛出异常,但它不会写入任何文件。我在github.com/nlog/nlog/wiki/Logging-troubleshooting 进行了故障排除,但无济于事。该死.... :(
【解决方案2】:

您的压缩解决方案受密码保护,所以现在只是我的猜测,但看起来您正在使用 app.config 来保存 nlog.config。

很确定 NetCoreApps 没有使用 app.config。尝试将您的 Nlog-config 放在一个名为 nlog.config 的单独文件中,并确保它是 Copy Always(在 Visual Studio 文件属性中)。

【讨论】:

  • 正如我所说,我很愚蠢,添加了密码。密码正在记录123
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
  • 2018-01-28
  • 2018-03-24
  • 2017-05-22
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多