Я не могу получить вывод 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. Запустите и просмотрите выходные данные отладки.

Это ведет к:

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

    only 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"
    }
  }
}
7
Jeroen 28 Май 2017 в 14:04

2 ответа

Лучший ответ

НАРУШЕНИЕ ИЗМЕНЕНИЙ НА 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,
}

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

15
Community 20 Июн 2020 в 09:12

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

services.AddLogging(builder => builder.SetMinimumLevel(LogLevel.Trace));
8
Juan Carlos Puerto 14 Окт 2017 в 15:35