我在一家电子商务公司工作。我们的DBA最近告诉我,使用SQL进行日志记录是一种不好的做法,并建议使用平面文件和grepping。我以前从来没有听说过登录SQL是一种不好的做法,我在网上找不到任何证实这一点的内容。
当我说日志记录时,我的意思是记录用户操作,如登录,更改帐户信息等,以及用户代理,IP地址,帐户ID和事件信息等数据。
虽然随着时间的推移会导致很多行,但如果客户出现问题,它会非常容易搜索。
登录SQL是一种不好的做法,是否更适合登录文件?
感谢。
答案 0 :(得分:3)
这样做的唯一问题是数据库负载增加和磁盘空间增加。除此之外,没有什么能阻止你这样做。实际上,能够查询日志并使其一致且易于备份非常方便。
与平面文件相比,您可以使用SQL在日志中添加更多结构。例如,您可以拥有以下列:
非常方便。我推荐它。
为什么你的DBA会抗拒?嗯,他没有任何缺点说你。他没有得到一个好的记录表的好处。但他必须坚持下去。激励措施是不对称的。
作为缓解措施,您可以每晚TRUNCATE TABLE
清除日志项。也许在这之前导出它们(bcp.exe)。
答案 1 :(得分:3)
也许他指的是使用触发器来记录as bad practice。触发器可能会导致很多意想不到的效果,并且可能被认为是不好的做法。
除此之外,SQL通常用作日志的存储,因此(如果你有足够的存储空间),这没有任何问题。
答案 2 :(得分:3)
存在交易问题。日志记录将成为事务的一部分,因此如果它被回滚,日志也会消失。
要使用SQL登录,您需要设置一个单独的DBMS会话,这会使事情变得更复杂。 Flatfiles没有交易。它们也(合理地)在磁盘满载条件下优雅地失败。您可以管理(清除)它们而不会干扰交易。
而且,由于日志记录基本上是 instrumentation ,因此最好不要过多地干扰被监控的进程。
最后:如果你真的想要SQL的易用性,你总是可以选择将flatfiles重新导入到DBMS表中。在单独的交易中。
BTW:上述答案与维护历史无关。这是一个完全不同的球赛,应该被视为DBMS +应用程序的一部分。答案 3 :(得分:3)
看起来您的DBA宁愿将所有日志记录(SQL或应用程序)转到平面文件以使用grep。我完全不同意。我个人认为SQL比使用grep更容易搜索。条款
WHERE event_time BETWEEN '1/1/2012 1:00AM' AND '1/1/2012 1:10AM'
比从grep获得的任何内容更容易编写和更快地检索(假设索引)。
Microsoft认为日志记录对数据库不利,他们的企业库支持它: http://msdn.microsoft.com/en-us/library/ff664543(v=pandp.50).aspx
IIS也支持它,大多数主要的日志库都包括数据库支持。
存储问题本身不一定是个问题,您要么在应用程序中登录到文件,要么登录到数据库中的DB文件。我看到的主要问题是,当您进行交易时,它是否变得非常昂贵,并且如上所述,回滚事务导致回滚日志记录的问题。
答案 4 :(得分:0)
我之前没有听说它被描述为“不良做法”,你总是可以设置一份工作来清除某个年龄段的记录(例如,我们只保留上个月的日志值)。我想这也取决于谁将查看日志,因为并非所有应用程序支持人员都知道SQL,而他们可以轻松读取文本文件。