什么更有效 - 将日志存储在 sql 数据库或文件中?

2022-08-30 11:13:19

我很少经常通过cron加载脚本。现在我不存储任何日志,所以如果任何脚本无法加载,在我看到结果之前我都不会知道它 - 即使我注意到结果不正确,我也不能做任何事情,因为我不知道哪个脚本失败了。

我决定存储日志,但我仍然不确定如何做到这一点。所以,我的问题是 - 什么更有效 - 将日志存储在sql数据库或文件中?

我可以在mysql数据库中创建“logs”表,并将每个日志存储在单独的行中,或者我可以使用php的file_put_contents或fopen / fwrite将日志存储在单独的文件中。

我的脚本在工作时每分钟大约会增加 5 个日志(总共)。我做了一些测试来确定什么更快 - fopen / fwrite或mysql的插入。我循环了一个“insert”语句 3000 次以生成 3000 行,循环 fopen/fwrite 3000 次以使用示例文本生成 3000 个文件。Fwrite的执行速度比sql的插入快4-5倍。我做了第二个循环 - 我循环了一个“select”语句并将其分配给字符串3000次 - 我还使用“fopen”打开了3000个文件并将结果分配给字符串。结果是一样的 - fopen/fwrite 完成任务的速度提高了 4-5 倍。

那么,对于所有有经验的程序员 - 您在存储日志方面有什么经验?有什么建议吗?

04.09.2011 编辑 - 谢谢大家的回答,他们帮助了妈妈很多。每个帖子都很有价值,所以很难接受一个答案;-)


答案 1

使用文件的日志效率更高,但是存储在数据库中的日志更容易读取,即使是远程读取(例如,如果需要,您可以编写Web前端)。

但请注意,将行连接并插入数据库容易出错(数据库服务器关闭、密码错误、资源不足),因此,如果您决定使用数据库,您将在哪里记录这些错误?


答案 2

您可以使用Zend_Log等组件,该组件本身支持附加到同一日志实例的编写器的概念。通过这种方式,您可以将相同的消息记录到一个或多个不同的位置,而无需更改日志记录代码。您可以随时更改代码以替换日志系统或以简单的方式添加新代码。

对于您的问题,如果您(开发人员)是唯一需要读取日志消息的人,我认为记录文件更简单,更合适。

如果您需要其他人需要在 Web 界面中读取日志,或者您需要能够搜索日志,请改为记录到 db。正如其他人所指出的那样,并发性也很重要,如果您有很多用户登录到数据库,则可以更好地扩展。

最后,每分钟 5 条消息的日志频率几乎不需要应用程序的 CPU,因此您无需担心性能。在你的情况下,我会从日志文件开始,然后更改(或添加更多编写器),如果你的要求会改变。


推荐