在长时间运行的进程(例如 Windows 服务或 ASP.NET 应用程序)中,有时需要在不停止应用程序的情况下临时提高日志级别。NLog 可以监控日志配置文件,并在每次修改时重新读取它们。
https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration
Serilog也可以做到这一点吗?
在长时间运行的进程(例如 Windows 服务或 ASP.NET 应用程序)中,有时需要在不停止应用程序的情况下临时提高日志级别。NLog 可以监控日志配置文件,并在每次修改时重新读取它们。
https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration
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 更改时,记录器将获取新的最低级别设置。
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 方法更复杂;我会考虑一下我们如何使它更顺畅。