Используя log4net, можно изменить настройки ведения журнала во время выполнения, изменив файл app.config, пока он у вас есть.
<add key = "log4net.Config.Watch" value = "True" />
Мой вопрос прост: есть ли способ сделать это для Serilog?
Я читал о классе LoggingLevelSwitch (), но похоже, что его можно изменить только с помощью кода. Конечно, это можно запрограммировать самостоятельно, но я ищу решение, встроенное в Serilog.





Вы не можете изменить конфигурацию регистратора во время выполнения, изменив 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 - это цитата из официального документа. Также вопрос касается файла app.config (речь идет о файле log4net.config).
Текущая реализация 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));
}
}
Или вы можете просто использовать библиотеку Журнал. Серилог, которая предоставляет служебные функции именно для этого.
Ваш комментарий относительно log4net не совсем точен. Я использую файл log4net.config вместе с ConfigureAndWatch, где изменения в файле (например, уровень ведения журнала) динамически считываются и применяются log4net во время выполнения.