如何在不重新启动应用程序的情况下重新配置Serilog

本文关键字:新配置 配置 Serilog 情况下 重新启动 应用程序 | 更新日期: 2023-09-27 18:19:25

在长时间运行的进程(如Windows服务或ASP.NET)中应用程序)有时需要临时增加日志级别,而不停止应用程序。NLog可以监视日志记录配置文件,并在每次修改时重新读取它们。

https://github.com/nlog/NLog/wiki/Configuration-file#automatic-重新配置

Serilog也可以这样做吗?

如何在不重新启动应用程序的情况下重新配置Serilog

为此使用LoggingLevelSwitch

// Set initial level
var levelSwitch = new LoggingLevelSwitch(LogEventLevel.Warning);
Log.Logger = new LoggerConfiguration()
  .MinimumLevel.ControlledBy(levelSwitch)
  .WriteTo.Console()
  .CreateLogger();
Log.Debug("This is not shown");
levelSwitch.MinimumLevel = LogEventLevel.Debug;
Log.Debug("This will now be shown, since the level has changed");

当`levelSwitch.MinimumLevel更改时,记录器将获取新的最低级别设置。

对于序列号1.4.10及更早版本

Serilog并没有把这当成一个一流的概念。

这可以使用过滤器进行模拟:

// Stored e.g. in a static field
volatile LogEventLevel minLevel;
Log.Logger = new LoggerConfiguration()
    .Filter.ByExcluding(evt => (int)evt.Level < (int)minLevel)
    .CreateLogger();

minLevel如何在应用程序运行时被修改将由您决定。

这种方法不如本地设置最低级别有效,因为在所有情况下都会生成事件,但实际开销不应该很大。

根据您使用的水槽,一种替代方案是简单地创建多个记录器,并在它们之间进行选择:

var minVerboseLogger = new LoggerConfiguration()
    .MinimumLevel.Verbose()
    .CreateLogger();
var minWarningLogger = new LoggerConfiguration()
    .MinimumLevel.Warning()
    .CreateLogger();
// Somewhere else:
public ILogger Log
{
    get { return isVerbose ? minVerboseLogger : minWarningLogger; }
}

第二种方法更可取,但如果两个记录器需要共享同一个日志文件,则不会表现良好。如果在这两种情况下都需要写入文件,请将较高级别的记录器链接到较低级别的记录器,例如:

var minWarningLogger = new LoggerConfiguration()
    .MinimumLevel.Warning()
    .WriteTo.Sink((ILogEventSink)minVerboseLogger)
    .CreateLogger();

诚然,这比您联系的NLog方法更复杂;我会考虑一下如何使它更顺利。