应用程序作为XBAP运行时记录?

时间:2009-11-08 11:52:13

标签: wpf logging xbap

当应用程序作为XBAP运行时,这里的任何人实际上都实现了任何日志记录策略吗?关于如何根据您的经验实施简单策略的任何建议(作为代码)。

桌面模式下的我的应用实际上使用集成的asop log4net实现登录到日志文件(滚动日志)但是在xbap中我无法登录因为它将文件存储在缓存(app2.0或某个文件夹)中所以我检查是否浏览器托管和不记录,因为我甚至不知道它是否记录...(为什么相同的代码库)....如果有一种方法将此日志推送到服务,如Web服务或发布错误到某个端点..

我的xbap是完全信任的Intranet模式。

3 个答案:

答案 0 :(得分:4)

我会登录到隔离存储,并为用户提供一种方法,使用简单的PUT / POST和HttpWebRequest将日志提交回服务器,或者,如果您感觉活泼,则通过WCF服务。

请记住,XBAP只能获得512k的隔离存储,因此您可能实际上想要将这些事件日志自动推送回服务器。还要记住,XBAP只能回复它的原始服务器,因此接受日志文件的服务必须在同一个域下运行。

以下是一些快速示例代码,演示如何在TextWriterTraceListener之上设置IsolatedStorageFileStream,此时您可以使用标准Trace.Write[XXX] methods进行日志记录。

IsolatedStorageFileStream traceFileStream = new IsolatedStorageFileStream("Trace.log", FileMode.OpenOrCreate, FileAccess.Write);

TraceListener traceListener = new TextWriterTraceListener(traceFileStream);

Trace.Listeners.Add(traceListener);

更新

以下是修订后的答案,因为您对问题进行了修订,并提供了更多详细信息。

由于您提到您在桌面应用程序中使用log4net,我们可以构建您已经习惯使用的依赖关系,因为完全可以继续在XBAP版本中使用log4net。 Log4net没有一个可以解决这个问题的实现,但是可以编写一个与WCF通信的log4net IAppender的实现。

我看了Joachim Kerschbaumer的the implementation the other answerer linked to(所有到期的信用证),看起来像是一个可靠的实现。我的第一个问题是,在一个示例中,有人可能会在每个事件和可能同步时回溯到服务,但实现实际上支持排队一定数量的事件并以批量形式将它们发送回服务器。此外,当它发送到服务时,它使用async invocation of an Action delegate这样做,这意味着它将在线程池线程上执行而不阻止UI。因此,我认为实施是非常可靠的。

以下是我将从这里采取的步骤:

  1. Download Joachim's WCF appender implementation
  2. 将他的项目添加到您的解决方案中。
  3. 从XBAP
  4. 引用WCFAppender项目
  5. 配置log4net以使用WCF appender。现在,这个记录器有几个设置,所以我建议查看他的示例应用程序的配置。然而,最重要的是QueueSize和FlushLevel。您应该将QueueSize设置得足够高,以便根据您实际记录的数量,您不会过多地与WCF服务混淆。如果您只是配置警告/错误,那么您可以将其设置为低。如果您正在配置信息,那么您希望将其设置得更高一些。就FlushLevel而言,您可能只需将其设置为ERROR,因为这样可以保证无论发生错误时队列有多大,都会在记录错误时刷新所有内容。
  6. 该示例似乎使用LINQ2SQL登录到WCF服务内的自定义数据库。您需要替换此实现以记录最适合您需求的数据源。
  7. 现在,Joachim的样本编写方式非常容易让人们非常快速地下载,运行和理解。如果我把它放到生产解决方案中,我肯定会改变一些事情:

    1. 将WCF合同分成一个单独的库,您可以在该库中共享客户端和服务器。这将允许您停止在WCFAppender库中使用Visual Studio服务引用,并仅为数据类型引用相同的合同库。同样,由于合同将不再在服务本身中,您将从服务中引用合同库。
    2. 我不知道wsHttpBinding在这里真的是必要的。它配备了几个旋钮和开关,而不是像这样简单的东西。我可能会使用更简单的basicHttpBinding,如果你想确保日志数据是通过线路加密的,我会确保使用HTTPS。

答案 1 :(得分:0)

我的方法是登录远程服务,由唯一用户ID或GUID键入。通常的异步调用开销不是很高。

您也可以在本地缓存邮件,无论是在RAM中还是在隔离存储中 - 如果网络无法访问,也可以作为备份。

务必在特定时间窗口内查看重复事件。您不希望在几秒钟内记录相同异常的1,000个副本。

另外,我喜欢记录的不仅仅是错误。您还可以记录性能数据,例如某些功能执行的时间(特别是进程外调用),或响应用户明确进入“调试和报告”模式的更详细数据。检查超过特定阈值的呼叫对于帮助捕获回归并抢占用户投诉也很有用。

答案 2 :(得分:0)

如果您在部分信任下运行XBAP,则只允许您在客户端计算机上写入IsolatedStorage。它只有512 KB,您可能希望以更有价值的方式使用(而不是记录日志),例如存储用户的首选项。

您不允许在部分信任下执行任何远程处理工作,因此您无法使用log4net RemotingAppender。

最后,在部分信任XBAP下,你有WebPermission to talk to the server of your app origin only。我建议使用WCF服务like described in this article。我们在当前项目中使用类似的配置,它工作正常。

然后,基本上,在WCF服务器端,您可以记录到适当的任何地方:文件,数据库等。您可能还想保留log4net日志记录代码并尝试使用其中一个可用的wcf日志追加器互联网(thisthis)。