代码之家  ›  专栏  ›  技术社区  ›  Darin Dimitrov

在.NET中实现自定义跟踪侦听器

  •  10
  • Darin Dimitrov  · 技术社区  · 16 年前

    我正在寻找实现 TraceListener 这将从ASP.NET应用程序写入SQL Server内部的日志。

    在实现此类以避免性能降低时,应该考虑哪些事项?

    存储过程会比普通的ADO.NET INSERT语句更快吗?

    我真的很喜欢将日志写入一个临时的内存缓冲区,并在以后从后台线程将其刷新到数据库中的想法,但是什么数据结构最适合这种情况? Queue<T> 看起来是个不错的候选者,但是如果没有同步机制,我就无法向其中添加元素。

    我在网上找到了一个 article 这显示了一个自定义跟踪侦听器的示例,它向SQL Server写入数据,但在将其放入生产代码之前,我希望得到更多的反馈。

    3 回复  |  直到 16 年前
        1
  •  4
  •   JoshBerke    16 年前

    存储过程不会比参数化SQL更快。在我的应用程序中,比起硬编码SQL,我更喜欢使用存储过程,但是如果要生成insert语句,那就更好了。

    如果您认为可能会丢失数据,那么使用缓冲区是一个好主意。如果您希望将客户机与插入分离,并且希望它是持久的,那么可以使用msmq。然后您可以编写一个处理队列的Windows服务,它将与应用程序完全分离。如果您有一个服务器场,那么它还可以从多个服务器聚合日志。

        2
  •  5
  •   Matt Kocaj    16 年前

    Log4NET 将跟踪转储到一个SQL数据库,其中包含一整堆刷新选项等。 检查一下: http://logging.apache.org/log4net/release/features.html

    log4net已被证明。如果你能避免“写轮子”,那就好了,对吧?

        3
  •  1
  •   Matt Kocaj    16 年前

    我不能说SP是否比ADO插入更快,但我总是建议在应用程序中保留查询/非查询,而不是在数据存储中。正如您现在所看到的,数据存储是为了数据,而不是逻辑。避免SPS。

    MS SQL Server是一个复杂的机器,我认为您的应用程序不会导致代码阻塞,从而导致过多的日志记录到您的数据库中。显然,这取决于您的特定实现,并且出于您对性能的兴趣,我假设您打算支持大容量。我的意思是,我认为您不需要内存中的队列或服务来包装日志记录过程。只需将跟踪刷新到ASPNET应用程序中的数据库,然后忘记缓存/刷新。SQL将负责将日志查询保存在内存中,并负责将其写入磁盘——事实上,它管理得非常好。SQL的查询缓冲区将确保您的代码不会在刷新跟踪时阻塞。如果你不相信我,用调试窗口中的时间戳或其他东西来测试它。如果您确实需要调整它,那么调整应该在数据库的内存设置中。你不需要在这里发明一个包装器,使用SP或者在你的服务器上启动另一个服务(比如msmq),这只会占用你宝贵的CPU和MEM。