Как включить ведение журнала трассировки в ASP.NET Core?

Я не могу получить Basice LogTrace(...) вывод в моём приложении. Вот репродукция:

  1. Создайте новое приложение ASP.NET Core с помощью Visual Studio 2017.
  2. (Необязательно) закомментировать .UseApplicationInsights() так что репродукция яснее
  3. Заменить код в ValuesController.cs с этим:

    using System.Collections.Generic;
    using Microsoft.AspNetCore.Mvc;
    using Microsoft.Extensions.Logging;
    
    namespace WebApplication1.Controllers
    {
        [Route("api/[controller]")]
        public class ValuesController : Controller
        {
            private readonly ILogger<ValuesController> logger;
    
            public ValuesController(ILogger<ValuesController> logger)
            {
                this.logger = logger;
            }
    
            [HttpGet]
            public IEnumerable<string> Get()
            {
                logger.LogError("ERROR!");
                logger.LogWarning("WARN!");
                logger.LogInformation("INFO!");
                logger.LogTrace("TRACE!");
                return new string[] { "value1", "value2" };
            }
        }
    }
    
  4. + Изменить appsettings.Development.json к этому:

    {
      "Logging": {
        "IncludeScopes": false,
        "LogLevel": {
          "Default": "Trace",
          "System": "Information",
          "Microsoft": "Information"
        }
      }
    }
    
  5. Запустите и просмотрите выходные данные отладки.

Это ведет к:

  • Фактический вывод:

    только ERROR, WARN и INFO

  • Ожидаемый результат будет "TRACE!" сообщение также

Я пытался настроить значения в appsettings.json файл, но это тоже не имело никакого эффекта.

Странно, изменение значения в любом файле на "Error" тоже ничего не делает

Итог / Вопрос

Что мне нужно сделать, чтобы сделать инъекцию ILogger<ValuesController> соблюдать параметры ведения журнала, в том числе Trace уровень?


сноска

Вот некоторые из соответствующих кодов, которые будут автоматически сгенерированы с вышеупомянутым repro:

Startup.cs

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        // Add framework services.
        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        loggerFactory.AddConsole(Configuration.GetSection("Logging"));
        loggerFactory.AddDebug();

        app.UseMvc();
    }
}

Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        var host = new WebHostBuilder()
            .UseKestrel()
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseIISIntegration()
            .UseStartup<Startup>()
            .UseApplicationInsights()
            .Build();

        host.Run();
    }
}

appsettings.json дефолт:

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}

3 ответа

Решение

НАРУШЕНИЕ ИЗМЕНЕНИЙ НА 2.0
Как прокомментировал Tseng ниже, этот ответ устареет, начиная с версии 2.0. Более подробную информацию об этом объявлении можно найти здесь: https://github.com/aspnet/Announcements/issues/238


Где проблема заключается в...

На основании вашего Configure() Метод, я обнаружил проблему:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
    ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug(); // ⇦ you're not passing the LogLevel!

    app.UseMvc();
}

По этой причине ни одно из ваших изменений в наборе конфигурации в appsettings.json файлы не работают.

Поведение по умолчанию .AddDebug() без каких-либо аргументов передается
Добавляет журнал отладки, который включен для LogLevel.Information или выше.

Если вы хотите явно настроить его на использование определенного минимального уровня LogLevel, то вы можете передать его непосредственно AddDebug(ILoggerFactory, LogLevel) метод.

loggerFactory.AddDebug(LogLevel.Trace);

Более подробную информацию можно найти здесь.


Привязка к вашей конфигурации.

Способ 1: получить значение из конфигурации.

LogLevel foo = this.Configuration.GetSection("Logging:LogLevel")
    .GetValue<LogLevel>("Default");
loggerFactory.AddDebug(foo);

Способ 2: использовать встроенный объект для LogLevel

(Намеренно не учтено. Очевидно, что между этими двумя предлагаемыми методами он плотно прилегает.) Я бы предпочел одну из крайностей, чем идти наполовину)

Способ 3: Перейти вручную (используйте ConfigurationBinder)

Фантазии ConfigurationBinder

var obj = new MyObject();
ConfigurationBinder.Bind(_configuration.GetSection("Logging:LogLevel"), obj);

который будет отображаться на объект, как

public class MyObject
{
    public LogLevel Default { get; set; }
    public LogLevel System { get; set; }
    public LogLevel Microsoft { get; set; }
}

чтобы вы могли потом передать:

loggerFactory.AddDebug(obj.Default);

Специальное примечание об узлах и appsettings.json

Обратите внимание, что разделитель для конфигурации использует :,

Пример: "Logging:LogLevel" пойдет:

"Logging": {
  "IncludeScopes": false,
  "LogLevel": {             ⇦⇦⇦⇦⇦ Here
    "Default": "Debug",
    "System": "Information",
    "Microsoft": "Information"
  }
}

LogLevel Enum

Просто для справки, вот действительные LogLevel ценности:

public enum LogLevel
{
    Trace = 0,
    Debug = 1,
    Information = 2,
    Warning = 3,
    Error = 4,
    Critical = 5,
    None = 6,
}

Источник:
https://docs.microsoft.com/en-us/aspnet/core/api/microsoft.extensions.logging.loglevel

Это сработало для меня. Добавьте это в ConfigureServices(IServiceCollection services) метод:

services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));

Я пытался:

      services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));

В чем проблема ...

Ничего из этого мне не помогло. В моем случае у меня был appsettings.Development.json в папке с exe. В этом файле по умолчанию задано значение «Информация». По этой причине я не мог видеть журналы трассировки. Этот файл скрыт в обозревателе решений в Visual Studio. Чтобы увидеть этот файл, мне пришлось развернуть appsettings.json.

После того, как я изменил информацию => трассировку, я смог увидеть журналы с серьезностью трассировки.

Другие вопросы по тегам