長時間実行されるプロセス (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; }
}
2 番目の方法が望ましいですが、2 つのロガーが同じログ ファイルを共有する必要がある場合は適切に動作しません。どちらの場合もファイルに書き込む必要がある場合は、上位レベルのロガーを下位レベルのロガーにチェーンします。たとえば、次のようにします。
var minWarningLogger = new LoggerConfiguration()
.MinimumLevel.Warning()
.WriteTo.Sink((ILogEventSink)minVerboseLogger)
.CreateLogger();
確かに、これはリンクした NLog アプローチよりも複雑です。どうやったらスムーズにできるか考えてみます。