Как отследить источник исключения при попытке установить приемник Azure для слушателя
Я пытаюсь использовать Semantic Logging Application Block
хранить логи в Azure Table Storage
, Настроить:
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);
Я получаю странное исключение:
Возникло исключение: 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 ничего не говорит о методе, который не найден. Проект для тестирования на вашей машине находится здесь.
2 ответа
Причина, по которой вы получаете эту ошибку, состоит в том, что SLAB
зависит от клиентской библиотеки хранилища 3.0.2.0 (source
) и настройка Retry Policies
на клиенте (CloudTableClient
например) устарел в версии 4.0.0.0 (source
) и удален в более поздней версии (не уверен, какой).
Поскольку вы используете версию 7.x клиентской библиотеки хранилища, метод для установки RetryPolicy на CloudTableClient
там нет и, следовательно, вы получаете эту ошибку.
Как сказал Гуарав, SLAB построен на очень старой версии Microsoft.WindowsAzure.Storage
, Проблема в этой линии, используя 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).
РЕДАКТИРОВАТЬ вот код (еще не проверен):
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);
}
}