есть ли способ перезаписать уровень журнала глобального регистратора Serilog

Сценарий , который я хочу, - установить уровень глобального журнала на Ошибка. это мой код конфигурации, который вызывается в классе запуска:

 Log.Logger = new LoggerConfiguration()
            .MinimumLevel.Error()
            .WriteTo.Logger(p=>p.Filter.ByIncludingOnly(evt => evt.Level == 
 LogEventLevel.Error).WriteTo.MSSqlServer(ConnectionString, "Serilogs",
                null, LogEventLevel.Error, 50,
                null, null, false, columnOptions))

но дело в том, что я хочу вести некоторый пользовательский журнал информации в некоторых моих методах действий в контроллерах, например:

            Log.Logger.Information("{User} {RawUrl} ", 
      userId,actionContext.Request.RequestUri.AbsolutePath);

проблема в том, что Serilog не записывает информационные журналы в таблицу SQL из-за глобального параметра уровня ошибки, который определен в классе startup.cs. есть ли какое-либо решение этой проблемы (без установки глобального уровня журнала на Информация)?

1 ответ

Решение

В MinimumLevel.Error()конструкция предназначена для грубого фильтра высокого уровня, который может чрезвычайно эффективно исключить путь регистрации, прежде чем он попадет в приемник. Хотя это естественно, но это не критично - вы будете удивлены, насколько эффективным будет Serilog, если вы фильтруете записи журнала в белый список позже в конвейере журналирования.

WriteTo.Loggerи другие приемники также предоставляют эквивалентный способ установки минимального уровня, который будет поступать в этот приемник. Таким образом, важно выполнять фильтрацию только на этом уровне (сminimumLevel необязательный аргумент переопределения).

После того, как вы удалили глобальную фильтрацию, которая по замыслу блокирует ваш запрос журнала даже от захвата, а тем более от отправки в приемники, следующий шаг - найти способ для вашего Filter.ByIncluding определить некоторые LogEventиз Informationуровень как релевантный - один из примеров способа - занести в белый список определенные контексты (но вы также можете просто пометить его с помощью свойства). Пример:

Log.Logger = ....

var importantInfoLog = Log.Logger.ForContext<MyClass>();

importantInfoLog.Information("Warning, this is important Information!")

Тогда вы можете сказать WriteTo.Logger к

  • включить что-нибудь>= Ошибка
  • включить информацию, если исходный контекст <MyClass>

Альтернативное (но, на мой взгляд, худшее) решение - настроить несколько WriteTo.Logger:-

  1. с участием minimumLevel установлен в Error
  2. другой с minimumLevel оставлен по умолчанию (подразумевая>= Information), но захватывая только конкретные Information сообщения уровня, которые вы хотите.
Другие вопросы по тегам