我会登录到隔离存储,并为用户提供一种方法,可以使用带有 HttpWebRequest 的简单 PUT/POST 或通过 WCF 服务将日志提交回服务器。
请记住,XBAP 仅获得 512k 的隔离存储,因此您实际上可能希望将这些事件日志自动推送回服务器。还要记住,XBAP 只能与它的源服务器对话,因此接受日志文件的服务必须在同一个域下运行。
下面是一些快速示例代码,展示了如何在一个TextWriterTraceListener
之上设置一个IsolatedStorageFileStream
,此时您可以使用标准Trace.Write[XXX]
方法进行日志记录。
IsolatedStorageFileStream traceFileStream = new IsolatedStorageFileStream("Trace.log", FileMode.OpenOrCreate, FileAccess.Write);
TraceListener traceListener = new TextWriterTraceListener(traceFileStream);
Trace.Listeners.Add(traceListener);
更新
由于您对问题进行了更详细的修改,因此这是一个修改后的答案。
由于您提到您在桌面应用程序中使用 log4net,我们可以基于您已经习惯使用的依赖项构建,因为完全可以在 XBAP 版本中继续使用 log4net。Log4net 没有提供开箱即用的解决此问题的实现,但可以编写IAppender
与 WCF 通信的 log4net 的实现。
我查看了由 Joachim Kerschbaumer链接到的另一个应答器的实现(所有学分到期),它看起来是一个可靠的实现。我首先担心的是,在一个示例中,有人可能会在每个事件上或者同步地登录回服务,但实现实际上支持排队一定数量的事件并将它们以批处理的形式发送回服务器。此外,当它确实发送到服务时,它会使用Action 委托的异步调用来执行此操作,这意味着它将在线程池线程上执行并且不会阻塞 UI。因此,我会说实施非常可靠。
这是我将从这里采取的步骤:
- 下载 Joachim 的 WCF appender 实现
- 将他的项目添加到您的解决方案中。
- 从 XBAP 中引用 WCFAppender 项目
- 配置 log4net 以使用 WCF 附加程序。现在,这个记录器有几个设置,所以我建议检查他的示例应用程序的配置。然而,最重要的是 QueueSize 和 FlushLevel。您应该将 QueueSize 设置得足够高,以便根据您实际记录的数量,您不会过多地与 WCF 服务交谈。如果您只是配置警告/错误,那么您可以将其设置为较低的值。如果您正在使用信息进行配置,那么您希望将其设置得更高一些。就 FlushLevel 而言,您可能应该将其设置为 ERROR,因为这将保证无论发生错误时队列有多大,在记录错误时都会刷新所有内容。
- 该示例似乎使用 LINQ2SQL 登录到 WCF 服务内部的自定义数据库。您将需要替换此实现以记录到最适合您需要的任何数据源。
现在,Joachim 的示例以一种易于下载、运行和快速理解的方式编写。如果我将它放入生产解决方案中,我肯定会改变一些事情:
- 将 WCF 合同分离到一个单独的库中,您可以在客户端和服务器之间共享该库。这将允许您停止在 WCFAppender 库中使用 Visual Studio 服务引用,而只为数据类型引用相同的合同库。同样,由于合同将不再存在于服务本身中,您将从服务中引用合同库。
- 我不知道这里真的需要wsHttpBinding。它带有几个旋钮和开关,而不是像这样简单的东西可能需要的。我可能会使用更简单的 basicHttpBinding,如果您想确保日志数据通过网络加密,我会确保使用 HTTPS。