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

C# 使用NLOG时无法解析服务时缺少详细信息,c#,asp.net-core,nlog,asp.net-core-3.1,C#,Asp.net Core,Nlog,Asp.net Core 3.1,我刚刚解决了AspNetCore3.1中的一个常见错误。该错误的内容如下: 2019-12-11 21:52:46.6862 Microsoft.AspNetCore.Server.Kestrel 连接id“0HLRUMQV9RNJI”,请求id“0HLRUMQV9RNJI:00000001”:一个 应用程序引发了未处理的异常 在经历了很多痛苦之后,我发现这是因为我错过了一项服务的注册: public void ConfigureServices(IServiceCollection s

我刚刚解决了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();
    }
我还向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();
            });
}
公共类程序
{
公共静态void Main(字符串[]args)
{
CreateHostBuilder(args.Build().Run();
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.useisintegration()
.ConfigureLogging((hostingContext,loggingBuilder)=>
{
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
})
.UseStartup()
.UseNLog();
});
}
因此,我删除了iTingService的注册,并开始出现相同的通用、无用的错误:

“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.Controller.WeatherForecastController”

但是,不是NLog做日志记录,而是默认的Core3日志记录

NLog的设置说明可在此处找到:


那么,现在的问题是,为什么ClearProviders()使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}" />


您也可以考虑在布局中包含<代码> ${Leal} /Cuth>(除非着色足够)。如果删除<代码> UnEnLogy](<代码)>并添加<代码> > LoggBuudio.AddiLog[](/COD>)在“代码> >配置日志< /代码>底部,会导致无用的消息种类,“MyFas.ASPNETCARE.Serv.KestRead连接ID”会发生什么?0HLRUMQV9RNJI”,请求id“0HLRUMQV9RNJI:00000001”:应用程序引发了一个未经处理的异常。“但它确实来自NLog。哈哈哈,这太完美了。”。有时候最简单的答案是正确的。我从来没有想到要检查一下布局。先生,敬你一杯。

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