登录SQL是一种糟糕的做法吗?

登录SQL是一种糟糕的做法吗?,sql,tsql,logging,Sql,Tsql,Logging,我在一家电子商务公司工作。我们的DBA最近告诉我,使用SQL进行日志记录是一种不好的做法,建议使用平面文件和grepping。我以前从未听说过登录SQL是一种不好的做法,我在网上也没有找到任何能证实这一点的东西 当我说日志记录时,我指的是记录用户操作,如登录、更改帐户信息等,以及用户代理、ip地址、帐户id和事件信息等数据 虽然随着时间的推移,它会导致大量的争吵,但如果客户有问题,搜索起来非常容易 登录SQL是一种不好的做法吗?最好是登录到文件吗? 谢谢。这样做的唯一问题是增加了数据库的负载和磁

我在一家电子商务公司工作。我们的DBA最近告诉我,使用SQL进行日志记录是一种不好的做法,建议使用平面文件和grepping。我以前从未听说过登录SQL是一种不好的做法,我在网上也没有找到任何能证实这一点的东西

当我说日志记录时,我指的是记录用户操作,如登录、更改帐户信息等,以及用户代理、ip地址、帐户id和事件信息等数据

虽然随着时间的推移,它会导致大量的争吵,但如果客户有问题,搜索起来非常容易

登录SQL是一种不好的做法吗?最好是登录到文件吗?


谢谢。

这样做的唯一问题是增加了数据库的负载和磁盘空间。除此之外,没有什么能阻止你这么做。实际上,能够查询您的日志并使它们保持一致和易于备份非常方便

与平面文件相比,使用SQL可以在日志中添加更多的结构。例如,您可以有以下列:

  • 身份证
  • 日期时间
  • 事件代码
  • 信息
  • 机械名称
  • httprequest
  • 用户名
  • 用户ID
  • AdditionalDataXML:一个可查询的XML列,包含有关事件的结构化数据
非常方便。我推荐它


为什么您的DBA会抵制?好吧,他劝你不要这样做没有坏处。他没有得到一个好的记录表的好处。但他必须维护它。激励是不对称的


作为一种缓解措施,您可以每晚使用
截断表
清除日志项。可能在这样做之前导出它们(bcp.exe)。

也许他指的是使用触发器进行日志记录。触发器可能会导致许多意想不到的效果,并且可能被认为是不好的做法


除此之外,SQL通常用作日志的存储,因此(如果您有足够的存储空间),这没有什么问题。

我以前从未听人将其描述为“不好的做法”,并且您可以随时设置一个作业来清除某个时间段的记录(例如,我们只保留上个月的日志)。我想这还取决于谁将查看日志,因为并非所有的应用程序支持人员都懂SQL,而他们可以轻松地阅读文本文件。

存在事务问题。日志记录将是事务的一部分,因此如果回滚,日志也将消失

为了让登录SQL正常工作,您需要设置一个单独的DBMS会话,这将使事情更加复杂。 Flatfiles没有事务。在磁盘已满的情况下,它们也会(合理地)正常失效。您可以在不干扰事务的情况下管理(清除)它们

而且,由于日志记录基本上是一种仪器,因此最好不要对被监视的过程产生过多的干扰

最后:如果您真的想要SQL的易用性,您可以选择将flatfiles重新导入到DBMS表中。在单独的交易中


顺便说一句:上面的答案不是关于保持历史。这是一个完全不同的游戏,应该被视为DBMS+应用程序的一部分。

看起来您的DBA更希望所有日志记录(SQL或应用程序)都转到一个平面文件来使用grep。我完全不同意。我个人觉得SQL比使用grep更容易搜索。条款

  WHERE event_time BETWEEN '1/1/2012 1:00AM' AND '1/1/2012 1:10AM'
比从grep获得的任何东西都更容易编写,检索(假设索引)也更快

Microsoft不认为日志记录对数据库有害,他们的企业库支持它:

IIS也支持它,大多数主要的日志库都包括数据库支持


存储问题本身并不一定是一个问题,您要么要登录到应用程序中的一个文件,要么要登录到数据库中的一个DB文件。我看到的主要问题是,在您进行事务处理时,它是否变得过于昂贵,以及如上所述,回滚事务导致回滚日志记录的问题。

在我请求与上述用户操作相关联的表后,他发表了这一评论(没有触发器,只是简单地插入一个存储过程)。它仍然增加了用户事务的权重。DBMS必须处理两条或更多记录,而不是一条记录。这些都需要缓冲区空间和锁(以及I/O带宽)是的,这就是为什么我对他在SQL中使用它的犹豫感到困惑。我过去在其他网站上使用过类似的结构,没有任何问题。嗯,他没有任何负面影响。他没有从拥有一个好的日志表中得到好处。但他必须维护它。激励是不对称的。很好的一点。我没有想到这一点。我认为这种类型的日志记录非常普遍,我想确认一下。我认为它不常见。我从未见过,只是自己做过。我认为平面文件日志记录在很多情况下是一种反模式。我的意思是SQL日志记录非常普遍。我也从未见过任何人做过用户活动的平面文件日志记录。在这种情况下,我认为平面文件日志记录是一种反模式事件发生后,它作为一个单独的SQL命令由应用程序完成。它确实会略微增加SQL server上的负载,但不会为最终用户增加加载时间,因为它是异步的。在这种情况下,情况更糟,因为它必须执行“轮询”,寻找新的更新,与logcollector维护的一些水印时间戳相比。可能轮询不是正确的术语,但本质上它是轮询,如果它在事后清除更新。它如何识别被触摸的记录?它不是记录SQL,而是记录用户的活动…在SQL中。例如,如果他们试图更新他们在文件中的地址…它将通过存储过程在SQL中更新它。如果成功(没有SQL错误,存储过程返回成功指示器),它(web服务器)将调用