2017-02-15 42 views
0

如何設置Trace.Trace*Information,Warning,Error等)以保存在服務結構日誌中?我發現的唯一選擇是使用ServiceEventSource發送消息,但這需要修改大量代碼以從Trace語句移開。服務結構 - 跟蹤語句不記錄

是否有任何偵聽器可用於將Trace語句轉發到ServiceEventSource?或者更簡單些?

+1

也許您可以使用https://github.com/Azure/diagnostics-eventflow將跟蹤消息重新路由到ServiceEventSource。您將需要爲它編寫輸出,因爲EventSource不是開箱即用的,但這是一項簡單的工作。 –

+0

謝謝,明天我會嘗試第一件事! –

回答

2

EventFlow(正如Peter Bons的評論中所提到的)加上Application Insights可能是一個很好的解決方案。您可以輕鬆設置EventFlow來偵聽您現有的Trace語句,然後將其轉發到Application Insighs,您可以在其中監控服務的執行情況。

設置EventFlow非常簡單,只需將NuGet Microsoft.Diagnostics.EventFlow添加到您的服務項目即可。然後在eventflowconfig.json添加跟蹤作爲輸入和應用洞察作爲輸出:

{ 
"inputs": [ 
    { 
     "type": "Trace", 
     "traceLevel": "Warning" 
    } 
], 
"filters": [], 
"outputs": [ 
    { 
     "type": "ApplicationInsights", 
     "instrumentationKey": "00000000-0000-0000-0000-000000000000" 
    } 
], 
"schemaVersion": "2016-08-11", 
"extensions": [] 

}

現在你只安裝在您的Azure的賬號的應用見解實例,並改變instrumentationKey您AI的一個實例。

application insights settings

之後,你可以開始修改您的EventFlow配置來提取你的痕跡具體要求和度量數據(如果您有型在你的痕跡信息的),那麼你就可以開始顯現,或搜索特定的AI儀表板中的跟蹤類型。

請注意,Application Insights默認僅保留7天的日誌。如果你想保持更長的痕跡,你可以改變AI層,你可以activate Continuous Export

-1
namespace MassProcessing 
{ 
    internal static class Program 
    { 
     /// <summary> 
     /// This is the entry point of the service host process. 
     /// </summary> 
     private static void Main() 
     { 
      try 
      { 
       // The ServiceManifest.XML file defines one or more service type names. 
       // Registering a service maps a service type name to a .NET type. 
       // When Service Fabric creates an instance of this service type, 
       // an instance of the class is created in this host process. 
       using (var diagnosticsPipeline = ServiceFabricDiagnosticPipelineFactory.CreatePipeline("EngageServiceFabric-MassProcessing-DiagnosticsPipeline")) 
       { 
        ServiceRuntime.RegisterServiceAsync("MassProcessingType", 
        context => new MassProcessing(context)).GetAwaiter().GetResult(); 

        ServiceEventSource.Current.ServiceTypeRegistered(Process.GetCurrentProcess().Id, typeof(MassProcessing).Name); 

        // Prevents this host process from terminating so services keep running. 
        Thread.Sleep(Timeout.Infinite); 
       } 
      } 
      catch (Exception e) 
      { 
       ServiceEventSource.Current.ServiceHostInitializationFailed(e.ToString()); 
       throw; 
      } 
     } 
    } 
}