2

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

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

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

4

3 回答 3

4

我会登录到隔离存储,并为用户提供一种方法,可以使用带有 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。因此,我会说实施非常可靠。

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

  1. 下载 Joachim 的 WCF appender 实现
  2. 将他的项目添加到您的解决方案中。
  3. 从 XBAP 中引用 WCFAppender 项目
  4. 配置 log4net 以使用 WCF 附加程序。现在,这个记录器有几个设置,所以我建议检查他的示例应用程序的配置。然而,最重要的是 QueueSize 和 FlushLevel。您应该将 QueueSize 设置得足够高,以便根据您实际记录的数量,您不会过多地与 WCF 服务交谈。如果您只是配置警告/错误,那么您可以将其设置为较低的值。如果您正在使用信息进行配置,那么您希望将其设置得更高一些。就 FlushLevel 而言,您可能应该将其设置为 ERROR,因为这将保证无论发生错误时队列有多大,在记录错误时都会刷新所有内容。
  5. 该示例似乎使用 LINQ2SQL 登录到 WCF 服务内部的自定义数据库。您将需要替换此实现以记录到最适合您需要的任何数据源。

现在,Joachim 的示例以一种易于下载、运行和快速理解的方式编写。如果我将它放入生产解决方案中,我肯定会改变一些事情:

  1. 将 WCF 合同分离到一个单独的库中,您可以在客户端和服务器之间共享该库。这将允许您停止在 WCFAppender 库中使用 Visual Studio 服务引用,而只为数据类型引用相同的合同库。同样,由于合同将不再存在于服务本身中,您将从服务中引用合同库。
  2. 我不知道这里真的需要wsHttpBinding。它带有几个旋钮和开关,而不是像这样简单的东西可能需要的。我可能会使用更简单的 basicHttpBinding,如果您想确保日志数据通过网络加密,我会确保使用 HTTPS。
于 2009-11-10T03:35:31.327 回答
0

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

您也可以在本地缓存消息,无论是在 RAM 中还是在隔离存储中——也许可以作为备份,以防网络无法访问。

请务必在特定时间范围内注意重复事件。您不想在几秒钟内记录 1,000 个相同异常的副本。

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

于 2009-11-15T14:06:57.197 回答
0

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

在部分信任的情况下,你也不能做任何远程处理,所以你不能使用 log4net RemotingAppender。

最后,在部分信任 XBAP 下,您有 WebPermission只能与您的应用程序源服务器对话。我建议使用 WCF 服务,如本文所述。我们在我当前的项目中使用了类似的配置,并且效果很好。

然后,基本上,在 WCF 服务器端,您可以将日志记录到任何适当的位置:文件、数据库等。您可能还希望保留 log4net 日志记录代码并尝试使用互联网上可用的 wcf 日志附加程序之一(这个这个)。

于 2009-11-15T15:13:34.103 回答