簡體   English   中英

為什么 NuGet 包 NLog 不適用於 .NET Core?

[英]Why doesn't NuGet package NLog work for .NET Core?

完成以下步驟。

  1. 創建一個新的 .NET Core 控制台項目 (C# .NET Core 2.1)

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

  3. Program類中添加記錄器字段。

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

但是,為什么運行程序不會打印“Test NLog”?

確保不要使用NLog.config NuGet 包。 已棄用,不應用於新項目(NuGet 包的說明中也有說明)。

它具有在應用程序部署時重置實際 Nlog.config 的不良副作用。 當 Microsoft 決定重新設計 NuGet 包格式時,NuGet 包就損壞了。

另請參閱: .NET Core 2 控制台應用程序入門

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

該問題可能是 nuget 的問題,即 nlog.config 未與 NLog.Config 包一起安裝。

您應該檢查您的 nlog.config(並部署它)。 如果它不存在,則創建它。

我建議閱讀:

但是,運行程序會不會打印“Test NLog”?

你期望輸出在哪里? 也為此檢查您的 nlog.config

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文件。

另外,請確保配置文件的第一行是<?xml ...元素。 這是一個晦澀的問題,但如果它不在第一行,NLog 將無法解析文件。

當所有其他方法都失敗時,請參閱出色的故障排除指南: https : //github.com/NLog/NLog/wiki/Logging-troubleshooting

你可能有錯誤的版本。 NuGet 頁面 ( NLog ) 提到了這一點:

支持的平台:

對於 ASP.NET Core,請檢查: NLog.Web.AspNetCore

工作 .NET Core 示例:

文件程序.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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM