使用 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:templogsnlog-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>

应用设置:

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

我还在程序中添加了以下代码.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": 应用程序引发了未处理的异常。

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

系统无效操作异常: 无法解析类型的服务 "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 工作,但丢失了错误消息中的详细信息? 它似乎只是在管道中发生的日志,而不是在控制器/域级别。

我认为您正在寻找的特殊细节是${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}(除非着色就足够了(。

最新更新