2017-03-31 3 views
0

サービスファブリッククラスタでEventSourceとElasticSearchが正しく設定されました。これで、サービスファブリックアプリケーションと対話するWebアプリケーションにEventSourcesを追加して、すべてのイベント(アプリケーションログ)を1か所で表示し、Kibanaを介してフィルタ/クエリを表示できるようになりました。WebアプリケーションにEventSourceを追加する方法

私たちの問題は、exeであるサービスファブリックアプリケーションとステートレスの.NET 4.6(.net CORE)Webアプリケーションとの違いに関連しているようです。サービスファブリックでは、Program.csにパイプラインをインスタンシエートするusingステートメントを配置し、無限のスリープを設定します。

private static void Main() 
{ 
     try 
     { 
      using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("CacheApp-CacheAPI-DiagnosticsPipeline")) 
      { 
       ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(Endpoint).Name); 
       // Prevents this host process from terminating so services keeps running. 
       Thread.Sleep(Timeout.Infinite); 
      } 

ウェブアプリケーションでこれを行うにはどうすればよいですか?これは、EventSourceのServiceFabric以外の実装で使用しているパイプラインコードです。

using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json")) 
    { 
     IEnumerable ie = System.Diagnostics.Tracing.EventSource.GetSources(); 

     ServiceEventSource.Current.Message("initialize eventsource"); 

    } 

を私たちは、パイプラインを参照し、使用して文の中からではなく、それ以外でElasticSearchにイベントを送信することができます:これは私たちが使用しているものです。したがって、質問は次のとおりです。

  1. どのようにWebアプリケーションのステートメントを使用してパイプラインを配置しますか?
  2. ログを記録するたびに、またはステートレスWebイベント全体でパイプラインを再利用する方法がある場合に、パイプラインをインスタンス化して破棄する必要がありますか?それは非常に高価で、パフォーマンスを傷つけるように思えるでしょう。パイプラインをキャッシュすることはできますか?

これはジストです。明確にする必要がある場合はお知らせください。私はそこにクライアントアプリケーションのための多くのドコが見えますが、Webアプリケーションのための多くはありません。

おかげで、ソリューションコード

DiagnosticPipelineパイプラインWITH グレッグ

UPDATE。

EventFlowパイプラインを初期化する最も簡単な方法は、例えば、Program.csの Main()方法であろうASP.NETコアを仮定
protected void Application_Start(Object sender, EventArgs e) 
{ 
    try 
    { 
     pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json"); 
     IEnumerable ie = System.Diagnostics.Tracing.EventSource.GetSources(); 
     AppEventSource.Current.Message("initialize eventsource"); 

    } 
} 

protected void Application_End(Object sender, EventArgs e) 
{ 
    pipeline.Dispose(); 
} 

答えて

1

public static void Main(string[] args) 
{ 
    using (var pipeline = DiagnosticPipelineFactory.CreatePipeline("eventFlowConfig.json")) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .UseApplicationInsights() 
      .Build(); 

      host.Run(); 
    } 
} 

これはhost.Run(事実を利用します)は、サーバーがシャットダウンされるまでブロックされ、要求が受信されて処理されている間にパイプラインが存在します。

ウェブフレームワークによっては、状況によっては状況が異なる場合があります。例えば。あなたが使用するものが "setup"と "cleanup"フックを提供するならば、セットアップフェーズ中に診断パイプラインを作成し、それをメンバ変数に格納して、クリーンアップフェーズ中に処分することができます。たとえば、ASP.NETクラシックでは、コードをglobal.asax.csに、Application_OnStartApplication_OnEndの方法を利用します。詳細については、Application Instances, Application Events, and Application State in ASP.NETを参照してください。

リクエストが配信されるたびにパイプラインインスタンスを作成することは、あなたが言ったように非常に非効率的です。それを行うには本当に良い理由はありません。

+0

ありがとうございますが、これはネットではありません.COREはIISでホストされている古いWebフォームアプリケーションです。これらのアプリでは、「メイン」はありません。多分global.asaxを使うことができますか? - – gperrego

+0

はい、global.asaxは私が試みるものです。私は元の答えにいくつかの詳細を追加しました。 –

+0

それではusingステートメントを使用しないでください。Application_Startのソートはusingステートメントとして機能し、Startに変数rightを入れますか? var pipeline = DiagnosticPipelineFactory.CreatePipeline( "eventFlowConfig.json");その後、変数Application_Endを破棄します。今試してみてください – gperrego

関連する問題