Отсутствуют сведения, когда невозможно разрешить службу при использовании NLOG

Я только что закончил бороться с общей ошибкой в ​​AspNetCore3.1. Ошибка просто гласит:

2019-12-11 21:52:46.6862 Microsoft.AspNetCore.Server.Kestrel Идентификатор подключения «0HLRUMQV9RNJI», идентификатор запроса «0HLRUMQV9RNJI: 00000001»: приложением было создано необработанное исключение.

После долгих мучений я обнаружил, что это произошло из-за того, что я пропустил регистрацию службы:

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

Итак, теперь я пытаюсь выяснить, почему я не получил никаких подробностей о том, в чем была проблема. Я создал новое приложение Core 3.1 из шаблонов Visual Studio. Я установил 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 Идентификатор подключения «0HLRUMQV9RNJI», идентификатор запроса «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 работать, но теряет детали в моих сообщениях об ошибках? Кажется, это только журналы, которые будут происходить в конвейере, а не на уровне контроллера/домена.


person Darthg8r    schedule 12.12.2019    source источник
comment
Что произойдет, если вы удалите UseNLog() и добавите loggingBuilder.AddNLog() внутри ConfigureLogging внизу?   -  person Rolf Kristensen    schedule 12.12.2019
comment
Это приводит к бесполезному разнообразию сообщений, Microsoft.AspNetCore.Server.Kestrel Идентификатор соединения 0HLRUMQV9RNJI, Идентификатор запроса 0HLRUMQV9RNJI:00000001: Приложением было выдано необработанное исключение. Однако это исходит от NLog.   -  person Darthg8r    schedule 12.12.2019


Ответы (1)


Я думаю, что особая деталь, которую вы ищете, это ${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} в макет (если не достаточно раскраски).

person Rolf Kristensen    schedule 12.12.2019
comment
Хахаха, это идеально. Иногда самый простой ответ является правильным. Мне так и не пришло в голову проверить макет. Совет шляпы вам, сэр. - person Darthg8r; 13.12.2019