Отключение ведения журнала INFO, похожего на трассировку, с помощью MVC

При включении ведения журнала приложения для приложения ASP.NET Core MVC я обнаружил, что для каждого запроса к API регистрируется много низкоуровневых сведений (пример см. ниже).

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

Есть ли способ отключить это? Или, возможно, мне следует рассмотреть другой подход к ведению журнала?

Пример журналов INFO для запроса API

2017-03-14 09:23:46.944 +00:00 [Информация] Запрос запуска HTTP/1.1 GET http://example.net/api/something приложение/json

14.03.2017 09:23:46.944 +00:00 [Информация] Токен успешно проверен.

2017-03-14 09:23:46.944 +00:00 [Информация] HttpContext.User объединен через автоматическую аутентификацию из схемы аутентификации: "Bearer".

2017-03-14 09:23:46.944 +00:00 [Информация] AuthenticationScheme: "Bearer" был успешно аутентифицирован.

2017-03-14 09:23:46.944 +00:00 [Информация] Авторизация пользователя прошла успешно: ноль.

2017-03-14 09:23:46.944 +00:00 [Информация] Выполнение метода действия "Xyz.GetAsync (Xyz.Api)" с аргументами (["Xyz.Something", "", "", "", " ", "0", "100", "", "2017-06-01T00:00:00Z", "False"]) — ModelState имеет значение Valid

14.03.2017 09:23:47.115 +00:00 [Информация] Выполнение JsonResult, запись значения «Xyz.Resources.SomeModel[]».

2017-03-14 09:23:47.115 +00:00 [Информация] Выполнено действие «Xyz.GetAsync (Xyz.Api)» за 206,5169 мс

2017-03-14 09:23:47.115 +00:00 [Информация] Запрос завершен за 216,8241 мс 200 application/json; кодировка = utf-8


person Dave New    schedule 14.03.2017    source источник
comment
@DavidPine Проблема в том, что ни один из наших собственных журналов приложений информационного уровня не пройдет.   -  person Dave New    schedule 14.03.2017
comment
Вы можете отвечать на ответы. В любом случае вы можете фильтровать или регистрировать на более подходящем уровне. Вы, вероятно, хотите фильтровать.   -  person Dave Newton    schedule 14.03.2017


Ответы (2)


Уровень журнала

Все они выглядят как Information, вы должны иметь возможность настроить это в appsettings.json таким образом, чтобы уровень регистрируемых записей был больше, чем «информация»... см. Уровень журнала.

Идентификатор события журнала

Уровень журнала распространяется на все приложение, поэтому все, что использует ведение журнала, в этом отношении одинаковы. Если вы хотите, чтобы ваши журналы выделялись и считали их более важными, регистрируйте их как таковые. Зарегистрируйте их как предупреждения - если это уместно. Кроме того, в качестве альтернативы вы можете использовать EventId, чтобы начать изоляцию журналов. Идея заключалась в том, что вы могли бы фильтровать журналы по «id», чтобы быстро находить интересующие вас вещи.

Фильтры

Наконец, вы можете применять фильтры.

Вы можете установить правила фильтрации для всех поставщиков, зарегистрированных в экземпляре ILoggerFactory, с помощью метода расширения WithFilter. В приведенном ниже примере журналы платформы (категория начинается с «Microsoft» или «Система») ограничиваются предупреждениями, в то время как приложение регистрируется на уровне отладки.

public void Configure(IApplicationBuilder app,
    IHostingEnvironment env,
    ILoggerFactory loggerFactory)
{
    loggerFactory
        .WithFilter(new FilterLoggerSettings
        {
            { "Microsoft", LogLevel.Warning },
            { "System", LogLevel.Warning },
            { "ToDoApi", LogLevel.Debug }
        })
        .AddConsole()
        .AddDebug()
}

Я думаю, что фильтры - это то, что вам нужно здесь. Укажите, что и Microsoft, и System находятся в LogLevel.Warning, тогда вы должны видеть только важные журналы от них.

person David Pine    schedule 14.03.2017

похоже, что хуки для этого немного изменились в netcoreapp2.0:

public virtual void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<ILoggerFactory, LoggerFactory>();
    services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
    services.AddLogging(builder =>
    {
        builder.SetMinimumLevel(LogLevel.Trace);
        builder.AddFilter("Microsoft", LogLevel.Warning);
        builder.AddFilter("System", LogLevel.Error);
        builder.AddFilter("Engine", LogLevel.Debug);
    });

    /// ... etc
}

добавление вышеизложенного помогло мне.

person user326608    schedule 25.02.2018