【问题标题】:Why doesn't NuGet package NLog work for .NET Core?为什么 NuGet 包 NLog 不适用于 .NET Core?
【发布时间】:2019-01-17 09:40:55
【问题描述】:

以下步骤已完成。

  1. 创建一个新的 .NET Core 控制台项目(C# .NET Core 2.1)

  2. 添加NuGet包NLog,NLog.Config(目前是V4.5.8)

  3. 在Program类中添加记录器字段。

     static Logger logger = LogManager.GetCurrentClassLogger();
    
  4. 在static void Main(string[] args) 中添加logger.Info("Test NLog");。

但是,为什么运行程序不会打印“Test NLog”?

【问题讨论】:

    标签: c# .net-core nlog


    【解决方案1】:

    确保不使用NLog.config NuGet 包。 It is deprecated 并且不应该用于新项目(在 NuGet 包的描述中也说过)。

    它具有在应用程序部署上重置实际 Nlog.config 的不良副作用。当 Microsoft 决定重新设计 NuGet 包格式时,NuGet 包损坏了。

    另请参阅:Getting started with .NET Core 2 Console application

    【讨论】:

      【解决方案2】:

      自 NLog 4.5 起,NLog 完全支持 .NET Core 1 和 2

      问题可能是 nuget 的问题,即 nlog.config 未与 NLog.Config 包一起安装。

      您应该检查您的 nlog.config(并部署它)。如果它不存在,则创建它。

      我建议阅读:

      但是,运行程序不会打印“Test NLog”?

      您期望输出在哪里?检查你的 nlog.config 也为这个

      【讨论】:

        【解决方案3】:

        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">
        
            <targets>
                <target name="logfile" xsi:type="File" fileName="file.txt" />
                <target name="logconsole" xsi:type="Console" />
            </targets>
        
            <rules>
                <logger name="*" minlevel="Info" writeTo="logconsole" />
                <logger name="*" minlevel="Debug" writeTo="logfile" />
            </rules>
        </nlog>
        

        确保将以下内容添加到您的 .csproj 文件中:

        <ItemGroup>
          <None Update="nlog.config" CopyToOutputDirectory="PreserveNewest" />
        </ItemGroup>
        

        确保类型是 None 而不是 Content,如 ASP.NET 项目所示。控制台应用程序不会复制 Content 文件。

        另外,请确保配置文件的第一行是&lt;?xml ... 元素。这是一个晦涩难懂的问题,但如果它不在第一行,NLog 将无法解析文件。

        当所有其他方法都失败时,请参阅出色的故障排除指南:https://github.com/NLog/NLog/wiki/Logging-troubleshooting

        【讨论】:

          【解决方案4】:

          您可能有错误的版本。 NuGet 页面 (NLog) 提到了这一点:

          支持的平台:

          对于 ASP.NET Core,请检查:NLog.Web.AspNetCore

          工作 .NET Core 示例:

          文件 Program.cs

          public class Program
          {
              public static void Main(string[] args)
              {
                  // NLog: setup the logger first to catch all errors
                  var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
                  try
                  {
                      BuildWebHost(args).Run();
                  }
                  catch (Exception ex)
                  {
                      //NLog: catch setup errors
                      logger.Error(ex, "Stopped program because of exception");
                      throw;
                  }
                  finally
                  {
                      // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
                      NLog.LogManager.Shutdown();
                  }
              }
          
              public static IWebHost BuildWebHost(string[] args) =>
                  WebHost.CreateDefaultBuilder(args)
                      .UseStartup<Startup>()
                      .ConfigureLogging(logging =>
                      {
                          logging.ClearProviders();
                          logging.SetMinimumLevel(LogLevel.Trace);
                      })
                      .UseNLog()  // NLog: setup NLog for Dependency injection
                      .Build();
          }
          

          文件 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"
                autoReload="true"
                internalLogLevel="info"
                internalLogFile="c:\temp\internal-nlog.txt">
          
            <!-- Enable ASP.NET Core layout renderers -->
            <extensions>
              <add assembly="NLog.Web.AspNetCore"/>
            </extensions>
          
            <!-- The targets to write to -->
            <targets>
              <!-- Write logs to a file  -->
              <target xsi:type="File" name="allfile" fileName="c:\temp\nlog-all-${shortdate}.log"
                      layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}" />
          
              <!-- Another file log, but only own logs. It uses some ASP.NET core renderers -->
              <target xsi:type="File" name="ownFile-web" fileName="c:\temp\nlog-own-${shortdate}.log"
                      layout="${longdate}|${event-properties:item=EventId_Id}|${uppercase:${level}}|${logger}|${message} ${exception:format=tostring}|url: ${aspnet-request-url}|action: ${aspnet-mvc-action}" />
          
            </targets>
          
            <!-- Rules to map from logger name to target -->
            <rules>
              <!-- All logs, including from Microsoft -->
              <logger name="*" minlevel="Trace" writeTo="allfile" />
          
              <!-- Skip non-critical Microsoft logs and so log only own logs -->
              <logger name="Microsoft.*" maxLevel="Info" final="true" />
              <!-- BlackHole without writeTo -->
              <logger name="*" minlevel="Trace" writeTo="ownFile-web" />
            </rules>
          </nlog>
          

          【讨论】:

          • 既然支持 .Net 标准 1.3+,是否应该支持 .Net core 2.1?
          • 我想是这样,但我没有尝试过 2.1,也找不到任何明确提到大于 2.0 的文档。
          • 我尝试将项目更改为 .Net core 2.0 也没有成功。
          • 我有一个使用 .Net Core 2.0 的小型测试项目,它可以工作。我正在使用 NLog.Web.AspNetCore 4.5.4,带有 var logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();在 Program.cs 中
          • 我添加了NLog.Web.AspNetCore并删除了Nlog,但它仍然无法在我的机器上运行。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-06-30
          • 1970-01-01
          • 2019-10-25
          • 1970-01-01
          • 2018-07-06
          • 2017-02-24
          • 2018-10-22
          相关资源
          最近更新 更多