改进日志异常

时间:2012-10-19 15:59:50

标签: sql sql-server logging hash

我计划在新的网络项目中使用log4net。根据我的经验,我看到日志表有多大,我也注意到错误或异常都会重复。例如,我只查询一个记录超过132.000条记录的日志表,并且我使用distinct,发现只有2.500条记录是唯一的(~2%),其他记录(~98%)只是重复记录。所以,我想出了改善日志记录的想法。

有几个新列:counterupdated_dt,每次尝试插入相同记录时都会更新。

如果要跟踪导致异常的用户,需要创建user_log或log_user表,以映射N-N关系。

创建这个模型可能会使系统变得缓慢而低效,试图比较所有这些长文本......这里的诀窍,我们还应该有一个16或32的二进制hash column,它将消息和异常,并在其上配置索引。我们可以使用HASHBYTES来帮助我们。 我不是数据库专家,但我认为这将更快地找到类似的记录。而且由于散列不保证唯一性,有助于更快地定位那些类似的记录,然后直接通过消息或异常进行比较以确保它们是唯一的。

这是一个理论/实践解决方案,但它会起作用还是带来更多复杂性?我要遗漏哪些方面或需要考虑哪些因素?触发器将完成插入或更新的工作,但触发器是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

是的,你可以这样做。这是一个好主意,它会起作用。从多个线程或进程插入时,请注意并发问题。您可能需要详细调查锁定。您应该查看锁定提示(在您的情况下为UPDLOCK, HOLDLOCK, ROWLOCK)和MERGE语句。它们可用于维护维度表。

作为替代方案,您可以登录到文件并进行压缩。典型的压缩算法非常擅长消除这种类型的精确冗余。

答案 1 :(得分:1)

我不会过于关注132,000条记录的日志表,说实话,我在日志表中看到了数百万条记录,甚至数十亿条记录。如果您每几分钟注销132,000条记录,那么您可能需要稍微调整一下。

我认为这个想法很有意思,但这是我的主要关注点:

  • 通过执行此操作,您实际上可能会损害应用程序的性能。 Log4Net ADO.NET appender是同步的。这意味着如果你使INSERT变得比它需要的复杂(也就是查看数据是否已经存在,计算哈希码等),你将阻止线程调用日志记录。这不好!你可以将这篇文章修复到某种临时表中,并通过一项工作或其他东西进行带外处理,但现在你已经为一些可能更简单的东西创建了一堆移动部件。
  • 时间可能会更好地用于做其他事情。存储很便宜,开发时间不是很少,而且日志不需要非常快速访问,因此非规范化模型应该没问题。

思想?