2016-08-17 32 views
2

Serilogを使用してログを記録しようとしています。今は、SQL ServerとElasticsearchという2つのシンクを打っています(どちらかというと問題ではないことを確認するだけです)。私はまた、設定は非常に簡単である2013年のVisual StudioでIIS Expressおよびデバッグを使用して、私のdevの環境でこれをテストしている:Serilogは、非同期アクションでのみシンクし、最初の実行時にのみ

var log = new LoggerConfiguration() 
    .MinimumLevel.Debug() 
    .WriteTo.MSSqlServer(logConnectionString, "__Serilog") 
    .WriteTo.Elasticsearch(new ElasticsearchSinkOptions(nodes) { 
     AutoRegisterTemplate = true 
    }) 
    .CreateLogger(); 

常に、非同期コントローラーアクションは何も非非同期コントローラのアクションを記録したことがないだけにログオン最初の負荷。同じアクションへの各サブリクエストは何もしません。私は非常に単純なテスト・プラットフォームを作成することによって、これを確認した:「テスト・アクション」:

[Route("test")] 
public async Task<ActionResult> Test() 
{ 
    logger.Information("Test Action"); 
    return View(); 
} 

[Route("testasync")] 
public async Task<ActionResult> TestAsync() 
{ 
    logger.Information("Async Test Action"); 
    return View(); 
} 

を両方のアクションを何度も押した後、私は、唯一のログエントリを持っていました。

ログ(これはSQL ServerとElasticsearchの両方になります)は、すべてが正しく構成されていることを示しています。しかし、なぜ私はいくつかの人だけがそれを作っているのであって、他人を作っていないという理由で全然犠牲になっている。また、バッチ処理のためタイミングが遅れるかもしれないと考えましたが、何も現れずに何時間も待っていました。ただ、提起された例外はありませんでした確認する

、私は次のように追加しました:

Serilog.Debugging.SelfLog.Enable((msg) => System.Diagnostics.Debug.WriteLine(msg)); 

をしかし、何も今までデバッグ出力に記録されません。

最後に、何が価値がある、私はSerilogインスタンスを注入するNinjectを使用していますため:

kernel.bind<ILogger>().ToConstant(log).InRequestScope(); 

私は本当にここで問題ないと思いますが、誰が知っています。

答えて

1

それはNinjectのInRequestScope設定が各リクエストの終了時にロガーを配置されている可能性があります。 Serilogロガー(およびシンク)は廃棄時にフラッシュされ、シャットダウンされ、コントローラーで同時に発生したイベントが原因となっている理由を説明します。

これを確認するには、ロガーをシングルトンとして登録してみてください。

(あなたが作成した唯一のlogインスタンスがありますことを確認する必要がありますが、私はあなたが一度だけこれを設定していることToConstant(log)で想定しています。)

+0

恐ろしいです。それはそれだった。私は 'InRequestScope()'を 'InSingletonScope()'に変更しました。今のところ毎回動いているようです。奇妙なことに、非同期アクションに関してはあなたが言っていることは意味がありますが、非同期アクションがなぜ1回しかログに記録されないのかは説明できません。それはいつも失敗したか、常に働いていたかのようです。それにもかかわらず、この変更はそこにも役立ちました。 –

関連する問題