4

長時間実行されるタスクを処理する Windows サービスがあり、強制的に実行しない限りシャットダウンしません (つまり、コンピューターのシャットダウン)。Windows サービスが稼働している間ずっと、同じ Serilog インスタンスを維持したいと考えています (パフォーマンス上の理由から)。

ただし、以下に示すように、Dispose() 呼び出しの後にのみログが表示されます。

var logger = new LoggerConfiguration()
            .WriteTo.Seq("http://localhost:5341")
            .CreateLogger();

logger.ForContext("TestContext", new { Machine = "TSTDB2" }, true).Information("Test");

logger.Dispose();

数秒の遅延は気にしませんが、Serilog インスタンスが破棄されるまで待たなければならないのはうまくいきません。どんな解決策でも大歓迎です。

4

2 に答える 2

1

デバッグ中に同様の問題に遭遇しました。ブレークポイントを配置してデバッグすると、数秒の処理時間を考慮しないと Seq の呼び出しが行われないことに気付きました。その理由は、キューに入っているログを一括送信する前に、数秒間ログを保持するためです。設定可能な量と頻度。デフォルトでは、2秒だと思います。

もう 1 つの方法は、コンソール アプリケーションに適したグローバル コンテキスト アプローチを使用することです。

Log.Logger = new LoggerConfiguration()
        .WriteTo.Seq("http://localhost:5341", period: TimeSpan.Zero) // <---
        .CreateLogger();

// Now you can make logging calls from anywhere in the application (main thread). 
Log.Debug("Test log");

特定の例外やアプリケーションの終了により、ログがアップロードされない場合もあります。なんらかの理由でアプリケーション (またはスレッド) が終了する前に、ログをアップロードする時間を確保してください。

于 2018-06-07T21:07:41.170 に答える