使用 NLOG 时无法解析服务时缺少详细信息
Missing Details when Unable to resolve service when using NLOG
我刚刚解决了 AspNetCore3.1 中的一般错误。错误只是这样写的:
2019-12-11 21:52:46.6862 Microsoft.AspNetCore.Server.Kestrel
Connection id "0HLRUMQV9RNJI", Request id "0HLRUMQV9RNJI:00000001": An
unhandled exception was thrown by the application.
好不容易才发现是因为漏注册了一个服务:
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>
应用程序设置:
{
// 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
Connection id "0HLRUMQV9RNJI", Request id "0HLRUMQV9RNJI:00000001": An
unhandled exception was thrown by the application."
经过一些修改,我发现我注释掉了 program.cs 中的行,"loggingBuilder.ClearProviders();" 我开始收到实际有用的错误消息:
System.InvalidOperationException: Unable to resolve service for type
'WebApplication3.Controllers.IThingService' while attempting to
activate 'WebApplication3.Controllers.WeatherForecastController'.
但是,不是 NLog 在进行日志记录,而是默认的 Core 3 日志记录。
可在此处找到 NLog 的设置说明:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3
那么,现在问题来了,为什么 ClearProviders() 使 nlog 工作,但在我的错误消息中丢失了详细信息?似乎只有在管道中发生的日志,而不是 controller/domain 级别的日志。
我认为您正在寻找的特殊细节是 ${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}
(除非着色就足够了)。
我刚刚解决了 AspNetCore3.1 中的一般错误。错误只是这样写的:
2019-12-11 21:52:46.6862 Microsoft.AspNetCore.Server.Kestrel Connection id "0HLRUMQV9RNJI", Request id "0HLRUMQV9RNJI:00000001": An unhandled exception was thrown by the application.
好不容易才发现是因为漏注册了一个服务:
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>
应用程序设置:
{
// 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 Connection id "0HLRUMQV9RNJI", Request id "0HLRUMQV9RNJI:00000001": An unhandled exception was thrown by the application."
经过一些修改,我发现我注释掉了 program.cs 中的行,"loggingBuilder.ClearProviders();" 我开始收到实际有用的错误消息:
System.InvalidOperationException: Unable to resolve service for type 'WebApplication3.Controllers.IThingService' while attempting to activate 'WebApplication3.Controllers.WeatherForecastController'.
但是,不是 NLog 在进行日志记录,而是默认的 Core 3 日志记录。
可在此处找到 NLog 的设置说明:https://github.com/NLog/NLog/wiki/Getting-started-with-ASP.NET-Core-3
那么,现在问题来了,为什么 ClearProviders() 使 nlog 工作,但在我的错误消息中丢失了详细信息?似乎只有在管道中发生的日志,而不是 controller/domain 级别的日志。
我认为您正在寻找的特殊细节是 ${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}
(除非着色就足够了)。