NLog对.Net核心不起作用?

时间:2018-08-09 20:22:55

标签: c# .net-core nlog

完成以下步骤。

  1. 创建一个新的.Net核心控制台项目(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”吗?

4 个答案:

答案 0 :(得分:1)

从NLog 4.5开始,NLog完全支持.NET Core 1和2。

问题可能是nuget的问题,nlog.config没有随NLog.Config软件包一起安装。

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

我建议阅读:

  

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

您期望在哪里输出?还要检查您的nlog.config

答案 1 :(得分:1)

确保不要使用NLog.config-nuget-package。它是deprecated,不应用于新项目(也在nuget-package的说明中说)。

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

另请参阅:https://github.com/NLog/NLog/wiki/Getting-started-with-.NET-Core-2---Console-application

答案 2 :(得分:0)

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,而不是ASPNET项目所示的Content。控制台应用程序不会复制Content文件。

此外,请确保配置文件的第一行是<?xml ...元素。这是一个晦涩的问题,但是如果不在第一行,NLog将无法解析该文件。

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

答案 3 :(得分:-1)

您可能使用了错误的版本。 nuget页面(https://www.nuget.org/packages/NLog)提到了这一点:

支持的平台:

  • .NET Framework 3.5、4、4.5、4.6和4.7
  • .NET Standard 1.3+和2.0 +;
  • .NET Framework 4客户端配置文件
  • Xamarin Android,Xamarin iOs
  • UWP
  • Windows Phone 8
  • Silverlight 4和5
  • Mono 4

对于ASP.NET Core,请检查:https://www.nuget.org/packages/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 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, only own logs. 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>