Разделение протоколов уровня приложений и ведение журналов уровня в ядре ASP.NET

Если я добавлю службы журналов в контейнер (в ASP.NET 5 RC1):

services.AddSingleton<ILoggerFactory>();
services.AddSingleton(typeof(ILogger<>), typeof(Logger<>));
//or just services.AddLogging();

Затем я могу использовать Logger в своем слое приложения:

class MyAppLogicService
{
    public MyAppLogicService(ILogger<MyAppLogicService> logger) 
    { 
        logger.LogInformation("Hey");
    }
}

Но в этом случае мои события logger.LogInformation() будут смешиваться с несущественными событиями информации о каркасе (согласно разработчикам до 10 на запрос!).

Документация ASP.NET 5:

Рекомендуется выполнять ведение журнала приложений на уровне ваше приложение и его API, а не на уровне структуры. framework уже имеет встроенный журнал, в который можно установив соответствующий уровень детализации ведения журнала.

Что это значит? Означает ли это, что использование ILogger/ILoggerFactory в клиентском коде (логика приложения) не рекомендуется?

Что такое элегантное решение для отдельного ведения журнала на уровне приложений из ведения журнала уровня? На данный момент я использую Serilog и фильтрую ContextSource, но это далеко не элегантно...

Ответ 1

выполнять ведение журнала приложений на уровне вашего приложения и его API, а не на уровне структуры Я думаю, что сообщение здесь состоит в том, что вы не должны пытаться регистрировать каждую информацию запроса, потому что это уже зарегистрировано в рамках фреймворка.

Как и при микшировании событий журнала событий и событий журнала приложений - в документах также указано:

При создании регистратора должно быть указано имя категории. Имя категории указывает источник событий регистрации. По соглашению эта строка является иерархической, с категориями, разделенными символами точки (.). Некоторые поставщики журналов имеют поддержку фильтрации, которая использует это соглашение, что облегчает поиск выходных данных регистрации.

По умолчанию при использовании введенного ILogger<MyAppLogicService> имя категории, если полное имя класса (с пространством имен).

Итак, чтобы избежать загромождения вашего журнала с помощью информации о структуре, вы можете отфильтровать весь шум, включив только те категории, которые соответствуют вашему пространству имен. При использовании ConsoleLogger это будет выглядеть так:

loggerFactory.AddConsole((cat, level) => cat.StartsWith("mynamespace."));

Я предполагаю, что это похоже на "использование Serilog и фильтрацию ContextSource".