Serilog эквивалент log4net.Config.Watch?

Используя log4net, можно изменить настройки ведения журнала во время выполнения, изменив файл app.config, пока он у вас есть.

<add key = "log4net.Config.Watch" value = "True" />

Мой вопрос прост: есть ли способ сделать это для Serilog?

Я читал о классе LoggingLevelSwitch (), но похоже, что его можно изменить только с помощью кода. Конечно, это можно запрограммировать самостоятельно, но я ищу решение, встроенное в Serilog.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
6
0
491
2

Ответы 2

Вы не можете изменить конфигурацию регистратора во время выполнения, изменив app.config:Документация log4net

Because the System.Configuration API does not support reloading of the config file the configuration settings cannot be watched using the log4net.Config.XmlConfigurator.ConfigureAndWatch methods. The main advantage of using the System.Configuration APIs to read the configuration data is that it requires less permissions than accessing the configuration file directly.


И вы не можете этого сделать с Serilog

Как вы упомянули, уровень журнала можно настроить во время выполнения, Источник:

var levelSwitch = new LoggingLevelSwitch();

levelSwitch.MinimumLevel = LogEventLevel.Warning;

// configuring the logger using log level switch 
var log = new LoggerConfiguration()
   .MinimumLevel.ControlledBy(levelSwitch)
   .WriteTo.ColoredConsole()
  .CreateLogger();

// and you can switch the log level later on
levelSwitch.MinimumLevel = LogEventLevel.Verbose;

Вы можете увидеть некоторые параметры здесь для изменения раковин.

Ваш комментарий относительно log4net не совсем точен. Я использую файл log4net.config вместе с ConfigureAndWatch, где изменения в файле (например, уровень ведения журнала) динамически считываются и применяются log4net во время выполнения.

Mike Lowery 29.07.2019 23:50

Мой комментарий о log4net - это цитата из официального документа. Также вопрос касается файла app.config (речь идет о файле log4net.config).

Hooman Bahreini 31.07.2019 01:00

Текущая реализация Serilog (2.9.0) такова, что не может полностью перезагрузить настройки. Чтобы обойти эту проблему без введения дополнительных зависимостей, избегайте создания статических регистраторов и следуйте приведенному здесь примеру: https://github.com/akovac35/Logging/blob/v1.0.4/src/com.github.akovac35.Logging.Serilog/SerilogHelper.cs

public static void CreateLogger()
{
    CreateLogger(configure =>
    {
        configure.AddJsonFile("serilog.json", optional: false, reloadOnChange: true);
    });
}

public static void CreateLogger(Action<IConfigurationBuilder> configure)
{
    if (configure == null) throw new ArgumentNullException(nameof(configure));

    UpdateLogger(configure);
}

public static void UpdateLogger(Action<IConfigurationBuilder> configure)
{
    if (configure == null) throw new ArgumentNullException(nameof(configure));

    // The following pattern fires the reload token only once per settings change           
    var configurationBuilder = new ConfigurationBuilder();
    try
    {
        configure(configurationBuilder);
        IConfiguration configuration = configurationBuilder.Build();

        // Release previous callback - will be released only if this line is reached, allowing for another reload
        _changeCallback?.Dispose();
        _changeCallback = null;
        // .NET will not trigger a reload for invalid config file format, so reaching this line signals Json is OK
        _changeCallback = configuration.GetReloadToken().RegisterChangeCallback(state =>
        {
            UpdateLogger(configure);
        }, null);

        // Reading configuration will fail for invalid properties, that is why reload registration must happen
        // before this line or subsequent file updates may not be detected
        global::Serilog.ILogger newLogger = new LoggerConfiguration()
        .ReadFrom.Configuration(configuration)
        .Enrich.FromLogContext()
        .CreateLogger();

        Log.Logger = newLogger;

        GetLogger().Here(l => l.LogInformation("Updated logger: {@configuration}", configuration));
    }
    catch (Exception ex)
    {
        GetLogger().Here(l => l.LogError(ex, ex.Message));
    }
}

Или вы можете просто использовать библиотеку Журнал. Серилог, которая предоставляет служебные функции именно для этого.

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