从标题可以清楚地看出问题。例如,无论使用何种规模,Apache都将其访问和错误日志保存在文件中而不是RDBMS中。
对于RDMS,我们只需要编写SQL查询,它将完成工作,而对于文件,我们必须确定特定的格式,然后编写正则表达式,或者可能是解析器来操纵它们。如果没有给予足够的照顾,在某些情况下甚至可能失败。
但是,每个人似乎都更喜欢使用文件系统来维护日志。我对这些方法都不抱有偏见,但我想知道为什么要这样进行。是速度还是可维护性或其他?
从标题可以清楚地看出问题。例如,无论使用何种规模,Apache都将其访问和错误日志保存在文件中而不是RDBMS中。
对于RDMS,我们只需要编写SQL查询,它将完成工作,而对于文件,我们必须确定特定的格式,然后编写正则表达式,或者可能是解析器来操纵它们。如果没有给予足够的照顾,在某些情况下甚至可能失败。
但是,每个人似乎都更喜欢使用文件系统来维护日志。我对这些方法都不抱有偏见,但我想知道为什么要这样进行。是速度还是可维护性或其他?
Answers:
数据库可能发生太多故障,记录这些故障也很重要。
除非您的数据库系统允许自主事务(或根本没有事务),否则日志记录将需要单独的连接,因此日志记录中的回滚或提交不会干扰应用程序中的回滚或提交。
许多值得记录的事情在启动期间发生,即可能在数据库连接建立之前。
在典型的设置中,每天都会创建一个新的日志文件,将旧的日志文件压缩并保存2周,然后再将其删除。在RDBMS中做同样的事情并不容易。
DELETE FROM dbo.Log WHERE LogDate < today minus 2 weeks
我以前看过将日志写入数据库(有时您会获得可配置的日志记录选项,其中跟踪记录到文件,错误记录到数据库,致命事件到Windows事件日志)。
主要原因是速度和大小,启用某些跟踪会产生大量的日志记录质量-我已经浏览了千兆字节的日志文件。另一个主要原因是,读取日志需要顺序进行,除了查找某个错误或条目外,没有真正的查询日志的必要,而在文件中查找在此方面效果很好。
首先。
如果没有给予足够的照顾,在某些情况下甚至可能失败。
如果不小心,数据库事务不会失败?
写入文本文件有很多好处,最重要的是
文件系统是一个数据库。它确实是一个更简单的分层数据库,而不是关系DBMS,但是它仍然是数据库。
记录到文件系统之所以流行是因为文本日志与Unix哲学非常吻合:“文本是通用接口”。
Unix开发了许多通用工具,这些工具可以很好地处理文本日志。文本日志是否由mysql,apache,您的自定义应用程序,长期不支持的第三方软件生成都无所谓,sysadmin可以使用标准的Unix工具,例如grep,sed,awk,sort,uniq,cut,tail等等,以完全相同的方式浏览日志。
如果每个应用程序都登录到其自己的数据库,一个登录到MySQL,另一个登录到Postgres,另一个登录到Elasticsearch,另一个想要登录到ELK,另一个只能登录到MongoDB,那么您将必须学习二十种不同的工具来拖曳每个工具的日志。应用。文本是每个人都可以登录的通用媒体。
即使设法使所有日志都进入一个数据库(例如MySQL),您仍可能会发现每个应用程序都希望使用不同的表模式进行日志记录,因此仍然需要编写自定义工具来查询每个数据库的日志应用。而且,如果您以某种方式挤满了每个应用程序以登录到单个架构,则可能会发现该通用架构无法真正告诉您每个应用程序的完整情况,因此无论如何您仍然必须解析日志文本。
在实践中,登录数据库通常并没有真正使事情变得容易得多。
当您有特定的分析或特定的审计保留要求时,登录数据库可能会很有用,为此您可以设计特定的数据库模式以仅出于这些特定目的收集数据。但是对于取证和调试以及在收集日志时没有考虑到特定目标的情况下,文本日志通常足够好,以致于学习或创建专用工具的成本通常是不值得的。
让我们从几层来看一下:
简单来说:
然后,我们有了基于用例的方法:
您是否想将特定于节点的错误记录到水平缩放的RDBMS中,当您可以弹出一个节点的引擎盖并在那里看到它时,您需要采取额外的工作来查找特定节点的错误吗?另一方面,您的应用程序可能应该登录到RDBMS来收集应用程序级别的错误和通知。
当RDBMS由于无法写入数据库而需要自行记录日志时,会发生什么情况?
复杂。添加RDBMS将在天文上增加整个系统的复杂性。而管理复杂性的能力是使程序员与源代码生产者区别开来的主要因素。