我尝试使用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):
如何跟踪异常来源? Google对未找到的方法一无所知。要在您的计算机上测试的项目是here。
答案 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
}