2016-07-01 5 views
1
setzen

Ich versuche, Semantic Logging Application Block zu verwenden, um Protokolle in Azure Table Storage zu speichern. Setup:Wie kann ich die Quelle der Ausnahme beim Versuch, Azure-Senke für einen Listener

ObservableEventListener listener1 = new ObservableEventListener(); 
var conString = 
    $"DefaultEndpointsProtocol={CloudStorageAccount.DevelopmentStorageAccount.TableEndpoint.Scheme};" + 
    $"AccountName={CloudStorageAccount.DevelopmentStorageAccount.Credentials.AccountName};" + 
    $"AccountKey={Convert.ToBase64String(CloudStorageAccount.DevelopmentStorageAccount.Credentials.ExportKey())}"; 

listener1.LogToWindowsAzureTable(// <---- EXCEPTION HERE 
     instanceName: "instName", 
     connectionString: conString); 

Ich bin eine seltsame Ausnahme bekommen:

Ausnahme geworfen: 'System.MissingMethodException' in Microsoft.Practices.EnterpriseLibrary.SemanticLogging.WindowsAzure.dll

Zusätzliche Informationen: Methode nicht gefunden: "Microsoft.WindowsAzure.Storage.Table.CloudTableClient.set_RetryPolicy (Microsoft.WindowsAzure.Storage.RetryPolicies.IRetryPolicy)".

Ich habe das gleiche Problem mit einem echten Konto. Pakete Versionen (alle von ihnen sind aus NuGet):

  • EnterpriseLibrary.SemanticLogging - 2.0.1406.1
  • EnterpriseLibrary.SemanticLogging.WindowsAzure - 2.0.1406.1
  • WindowsAzure.Storage - 7.0.0

Wie kann ich die Quelle der Ausnahme verfolgen? Google sagt nichts über die Methode, die nicht gefunden wird. Ein Projekt zum Testen an Ihrem Computer ist here.

+0

Beachten Sie, dass Protokolle Azure Tabellen Hochladen schön, aber sie Praktische Anwendung (AI Hochladen) ist noch besser: https://github.com/fidmor89/SLAB_AppInsights. Wenn Sie die Standard- oder Premium-Stufe haben, können Sie den Continuous Export to Table Storage konfigurieren und erhalten Sie kostenlos ... –

Antwort

3

Der Grund dieser Fehler auch immer ist, weil SLAB auf Speicher Client-Bibliothek 3.0.2.0 abhängig ist (source) und Retry Policies auf Client (CloudTableClient zum Beispiel) Einstellung wurde in der Version 4.0.0.0 (source) ist veraltet und entfernt in etwas spätere Version (nicht sicher welche).

Da Sie Version 7.x der Speicher-Client-Bibliothek verwenden, ist die Methode zum Festlegen von RetryPolicy auf CloudTableClient nicht vorhanden und daher erhalten Sie diesen Fehler.

+0

Es wurde in 7.0.0 veraltet (war noch in 6.2.2-Vorschau) –

1

Wie Guarav sagte, ist SLAB gegen eine sehr alte Version von Microsoft.WindowsAzure.Storage gebaut. Das Problem ist this line, mit client.RetryPolicy anstelle von client.DefaultRequestOptions.RetryPolicy. Ich habe versucht, die NuGet-Pakete zu aktualisieren und zu ändern, aber es schien einige Tests zu unterbrechen und es schien nicht trivial zu sein, sie zu beheben. Auch sieht es so aus, als wäre 4.6 Unterstützung nicht vorhanden: https://github.com/mspnp/semantic-logging/issues/64.

Es gibt hier einen Fehler: https://github.com/mspnp/semantic-logging/issues/81, aber ich bezweifle, dass irgendetwas damit bald (wenn überhaupt) passieren wird. Ich werde wahrscheinlich am Ende eine einfache Senke schreiben, die die Logs an einen Trace Listener für Azure umleitet (einschließlich Table Storage upload).

EDIT hier ist der Code (noch nicht getestet):

public class SystemDiagnosticsTraceSink : IObserver<EventEntry> 
{ 
    public void OnNext(EventEntry entry) 
    { 
     if (entry == null) return; 
     using (var writer = new StringWriter()) 
     { 
      new EventTextFormatter().WriteEvent(entry, writer); 
      var eventText = writer.ToString(); 
      switch (entry.Schema.Level) 
      { 
       case EventLevel.LogAlways: 
       case EventLevel.Critical: 
       case EventLevel.Error: 
        Trace.TraceError(eventText); 
        return; 
       case EventLevel.Warning: 
        Trace.TraceWarning(eventText); 
        return; 
       case EventLevel.Informational: 
       case EventLevel.Verbose: 
        Trace.TraceInformation(eventText); 
        return; 
       default: 
        Trace.TraceError("Unknown event level: " + entry.Schema.Level); 
        Trace.TraceInformation(eventText); 
        return; 
      } 
     } 
    } 
    public void OnError(Exception error) 
    {} //you might want to do something here 
    public void OnCompleted() 
    {} //nothing to do 
} 

Und die Erweiterungsklasse:

public static class SystemDiagnosticsTraceSinkExtensions 
{ 
    public static SinkSubscription<SystemDiagnosticsTraceSink> LogToSystemDiagnosticsTrace 
     (this IObservable<EventEntry> eventStream) 
    { 
     if (eventStream == null) throw new ArgumentNullException(nameof(eventStream)); 

     var sink = new SystemDiagnosticsTraceSink(); 
     return new SinkSubscription<SystemDiagnosticsTraceSink>(
         eventStream.Subscribe(sink), sink); 
    } 
} 
Verwandte Themen