代码之家  ›  专栏  ›  技术社区  ›  abmv

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

  •  2
  • abmv  · 技术社区  · 15 年前

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

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

    我的XBAP是完全信任的内部网模式。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Drew Marsh    15 年前

    我将登录到独立的存储,并为用户提供一种方法,让他们通过httpwebrequest使用一个简单的put/post或通过一个wcf服务(如果您觉得frisky)将日志提交回服务器。

    请记住,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不附带一个可以立即解决这个问题的实现,但是可以编写一个log4net的实现。 IAppender 与WCF通信。

    我看了一眼 the implementation the other answerer linked to 由JoachimKerschbaumer(所有信贷到期)提供,它看起来是一个可靠的实现。我的第一个问题是,在一个示例中,可能有人在每个事件上或者同步地重新登录到服务,但是实现实际上支持排队处理一定数量的事件,并以批处理的形式将它们发送回服务器。此外,当它确实发送到服务时,它使用 async invocation of an Action delegate 这意味着它将在线程池线程上执行,而不会阻塞UI。因此,我认为实现是非常可靠的。

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

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

    现在,Joachim的示例是以一种非常容易被人下载、运行和理解的方式编写的。如果我把它放到生产解决方案中,我肯定会改变一些事情:

    1. 将WCF契约分离到一个单独的库中,您可以在客户机和服务器之间共享该库。这将允许您停止在wcfapender库中使用Visual Studio服务引用,并仅为数据类型引用相同的契约库。同样,由于合同将不再在服务本身中,所以您将从服务中引用合同库。
    2. 我不知道wshttpbinding在这里真的是必要的。它配备了几个旋钮和开关,比人们可能需要的简单的东西还多。我可能会使用更简单的basichttpbinding,如果您想确保日志数据是通过线路加密的,我只会确保使用https。
        2
  •  0
  •   RickNZ    15 年前

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

    您也可以在本地缓存消息,无论是在RAM中还是在独立的存储中——也许是在网络不可访问的情况下作为备份。

    一定要在一定的时间窗口内观察重复的事件。您不希望在几秒钟内记录1000个相同异常的副本。

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

        3
  •  0
  •   Massimiliano    15 年前

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

    您不允许在部分信任的情况下执行任何远程处理,因此不能使用log4net remotingpender。

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

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