10

長時間実行されるプロセス (Windows サービスや ASP.NET アプリケーションなど) では、アプリケーションを停止せずに一時的にログ レベルを上げることが望ましい場合があります。NLog は、ログ構成ファイルを監視し、変更されるたびに再読み取りできます。

https://github.com/nlog/NLog/wiki/Configuration-file#automatic-reconfiguration

これはSerilogでも可能ですか?

4

1 に答える 1

17

これに使用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 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; }
}

2 番目の方法が望ましいですが、2 つのロガーが同じログ ファイルを共有する必要がある場合は適切に動作しません。どちらの場合もファイルに書き込む必要がある場合は、上位レベルのロガーを下位レベルのロガーにチェーンします。たとえば、次のようにします。

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

確かに、これはリンクした NLog アプローチよりも複雑です。どうやったらスムーズにできるか考えてみます。

于 2014-09-13T09:25:19.267 に答える