在.NET中实现自定义TraceListener

时间:2009-02-22 16:13:50

标签: .net sql-server logging

我正在寻找实现TraceListener的最佳实践,它将从ASP.NET应用程序中在SQL Server中写入日志。

为了避免降低性能,在实施这样的课程时应该考虑哪些因素?

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

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

我在互联网上找到了一个article,它显示了一个自定义TraceListener的示例,该自定义TraceListener写入SQL服务器但在将其放入生产代码之前我希望得到更多反馈。

3 个答案:

答案 0 :(得分:5)

log4net 会将跟踪转储到带有一大堆刷新选项等的sql db。 检查一下:http://logging.apache.org/log4net/release/features.html

log4net已经过验证。如果你可以避免“重新编写方向盘”那么它是对的吗?

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

我不能说SP是否比ADO插入更快,但我总是建议在应用程序中保留查询/非查询,而不是在数据存储中。就像你现在一样,数据存储区用于数据,而不是逻辑。避免SP。

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