如何在尝试为侦听器设置Azure接收器时跟踪异常源

时间:2016-07-01 08:49:55

标签: .net azure azure-table-storage semantic-logging slab

我尝试使用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);

我得到了一个奇怪的例外:

  

抛出异常:&#39; System.MissingMethodException&#39;在Microsoft.Practices.EnterpriseLibrary.SemanticLogging.WindowsAzure.dll

     

其他信息:未找到方法:&#39; Void Microsoft.WindowsAzure.Storage.Table.CloudTableClient.set_RetryPolicy(Microsoft.WindowsAzure.Storage.RetryPolicies.IRetryPolicy)&#39;。

我对真实帐户有同样的问题。包版本(所有这些都来自NuGet):

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

如何跟踪异常来源? Google对未找到的方法一无所知。要在您的计算机上测试的项目是here

2 个答案:

答案 0 :(得分:3)

您收到此错误的原因是SLAB依赖于存储客户端库3.0.2.0(source)并在客户端Retry Policies上设置CloudTableClient示例)在版本4.0.0.0(source)中已弃用,并在某些更高版本中删除(不确定是哪一个)。

因为您使用的是7.x版的存储客户端库,所以在CloudTableClient上设置RetryPolicy的方法不存在,因此您收到此错误。

答案 1 :(得分:1)

就像Guarav所说,SLAB是针对private final String TAG = "DEBUG_TAG"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); List<String> nameList = new ArrayList<>(); //populate nameList ... for(String name : nameList) Log.d(TAG, name); } 的旧版本构建的。问题是this line,使用Microsoft.WindowsAzure.Storage代替client.RetryPolicy。我尝试更新NuGet包并进行更改,但它似乎打破了一些测试,修复它们似乎并不容易。此外看起来似乎不支持4.6 https://github.com/mspnp/semantic-logging/issues/64

这里有一个缺点:https://github.com/mspnp/semantic-logging/issues/81,但我怀疑随时都会发生任何事情(如果有的话)。我可能最终会编写一些简单的接收器,将日志重定向到Trace Listener for Azure来处理(包括Table Storage upload)。

编辑这里是代码(尚未测试):

client.DefaultRequestOptions.RetryPolicy

扩展类:

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
}