使用NLOG时无法解析服务时缺少详细信息

我刚刚在AspNetCore3.1中遇到一个通用错误。该错误仅显示为:

  

2019-12-11 21:52:46.6862 microsoft.AspNetCore.Server.Kestrel   连接ID“ 0HLRUMQV9RNJI”,请求ID“ 0HLRUMQV9RNJI:00000001”:   应用程序引发了未处理的异常。

经过一番痛苦之后,我发现这是因为我错过了一项服务的注册:

    public void ConfigureServices(IServiceCollection services)
    {
        // This service was missing
        services.AddTransient<IThingService,ThingService>();
        services.AddControllers();
    }

所以,现在,我正在寻找一个原因,为什么我没有得到有关问题所在的任何详细信息。我从Visual Studio模板创建了一个新的Core 3.1应用程序。我安装了NLog.Web.AspNetCore并添加了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"
      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
      autoReload="true"
      throwExceptions="true"
      internalLogLevel="Off" internalLogFile="c:\temp\logs\nlog-internal.log">

    <extensions>
        <add assembly="NLog.Web.AspNetCore"/>
    </extensions>

    <targets async="true">


        <target xsi:type="ColoredConsole" name="c" layout="${longdate} ${logger} ${message}" />


    </targets>

    <rules>

        <logger name="*" minlevel="Trace" writeTo="c" />


    </rules>
</nlog>

AppSettings:

{
// I removed the logging section completely so that NLOG can control log levels
  "AllowedHosts": "*"
}

我还将以下代码添加到program.cs

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseIISIntegration()
                    .ConfigureLogging((hostingContext,loggingBuilder) =>
                    {
                        loggingBuilder.ClearProviders();
                        loggingBuilder.SetMinimumLevel(microsoft.Extensions.Logging.LogLevel.Trace);
                    })
                    .UseStartup<Startup>()
                    .UseNLog();
            });
}

因此,我删除了IThingService的注册,并开始收到相同的通用无用错误:

  

“ 2019-12-11 21:52:46.6862 microsoft.AspNetCore.Server.Kestrel   连接ID“ 0HLRUMQV9RNJI”,请求ID“ 0HLRUMQV9RNJI:00000001”:   应用程序引发了未处理的异常。”

经过一番修补,我发现我在program.cs中注释掉了这一行“ loggingBuilder.ClearProviders();”。我开始收到实际有用的错误消息:

  

System.InvalidOperationException:无法解析类型的服务   尝试尝试“ WebApplication3.Controllers.IThingService”   激活“ WebApplication3.Controllers.WeatherForecastController”。

但是,不是NLog进行日志记录,而是默认的Core 3日志记录。

有关NLog的设置说明,请参见:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3

那么,现在问这个问题,为什么ClearProviders()使nlog起作用,却丢失了错误消息中的详细信息?似乎只有日志会在管道中发生,而不是在控制器/域级别。

leinzen 回答:使用NLOG时无法解析服务时缺少详细信息

我认为您要寻找的特殊细节是${exception:format=tostring}。您当前的布局是这样:

<target xsi:type="ColoredConsole" name="c" layout="${longdate} ${logger} ${message}" />

尝试更改为:

<target xsi:type="ColoredConsole" name="c" layout="${longdate} ${logger} ${message}${exception:format=tostring}" />

您还可以考虑在布局中添加${level}(除非着色足够)。

本文链接:https://www.f2er.com/2937022.html

大家都在问