2016-07-01 9 views
1

Я пытаюсь использовать Semantic Logging Application Block для хранения журналов на Azure Table Storage. Установка:Как я могу отслеживать источник исключения при попытке установить приемник Azure для прослушивателя

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); 

Я получаю странное исключение:

Exception брошенную: 'System.MissingMethodException' в Microsoft.Practices.EnterpriseLibrary.SemanticLogging.WindowsAzure.dll

Дополнительная информация: Метод не найден: «Void Microsoft.WindowsAzure.Storage.Table.CloudTableClient.set_RetryPolicy (Microsoft.WindowsAzure.Storage.RetryPolicies.IRetryPolicy)».

У меня такая же проблема с реальным счетом. Пакеты версии (все из них из NuGet):

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

Как я могу отслеживать источник исключения? Google ничего не говорит о методе, который не найден. Проект для тестирования на вашем компьютере - here.

+0

Обратите внимание, что загрузка журналов в Azure Tables приятно, но их загрузки приложений Insights (AI) еще лучше: https://github.com/fidmor89/SLAB_AppInsights. Если у вас есть уровень Standard или Premium, вы можете настроить Continuous Export to Table Storage и получить это бесплатно ... –

ответ

3

Причины вы получаете эту ошибку, потому что SLAB зависит от клиентской библиотеки для хранения 3.0.2.0 (source) и установки Retry Policies на клиенте (например CloudTableClient) осуждались в версии 4.0.0.0 (source) и удаляется в некоторые более поздние версии (не уверены, какой).

Поскольку вы используете версию клиентской библиотеки версии 7.x, метод установки RetryPolicy на CloudTableClient не существует и, следовательно, вы получаете эту ошибку.

+0

Это было устарело в 7.0.0 (все еще было в 6.2.2-превью) –

1

Как и Гуарав, SLAB построен на очень старой версии Microsoft.WindowsAzure.Storage. Проблема this line, используя client.RetryPolicy вместо client.DefaultRequestOptions.RetryPolicy. Я попробовал обновить пакеты NuGet и изменить его, но он, похоже, нарушил некоторые тесты, и это не казалось тривиальным для их исправления. Также похоже, что поддержки 4.6 нет: https://github.com/mspnp/semantic-logging/issues/64.

Для этого есть дефект здесь: https://github.com/mspnp/semantic-logging/issues/81, но я сомневаюсь, что что-нибудь случится с ним в ближайшее время (если когда-либо). Я, вероятно, в конечном итоге напишу простую раковину, которая перенаправляет журналы в Trace Listener для Azure, чтобы позаботиться (в том числе Table Storage upload).

EDIT вот код (еще не проверено):

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 
} 

И класс расширения:

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); 
    } 
}