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

bip*_*obe 24 php mysql logging append fwrite

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

我决定存储日志,但我仍然不知道该怎么做.所以,我的问题是 - 什么更有效 - 将日志存储在sql数据库或文件中?

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

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

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

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

tro*_*foe 13

使用文件的日志更有效,但是存储在数据库中的日志更容易阅读,甚至是远程的(例如,如果需要,您可以编写Web前端).

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

  • 您如何在日志文件中记录I/O错误? (10认同)
  • 你不会记录它. (9认同)
  • Boss 会通过电子邮件发送一条 CRITICAL 日志消息。 (4认同)
  • 您可以记录到数据库,但如果记录到数据库时出现错误,您可以记录到文件,记录应该记录到数据库的原始错误以及尝试存储到日志数据库时遇到的错误 (2认同)

Fab*_*bio 8

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

对于您的问题,我认为如果您(开发人员)是唯一需要阅读日志消息的人,那么日志到文件会更简单,更合适.

如果您需要其他人需要在Web界面中读取日志或者您需要能够搜索日志,请记录到db.正如其他人已经指出并发问题一样,如果你有很多用户登录到db可以更好地扩展.

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

  • 你使用的工具越复杂,它就越不稳定。保持简单并使用直接的日志文件。 (3认同)

Joh*_*ica 7

评论你的发现.

关于写入文件你可能是对的.
关于阅读你是错的.

写入数据库:

  1. MyISAM将整个表锁定在插入上,导致锁争用.使用InnoDB,它具有行锁定功能.
  2. 与1.相反如果您想在日志上进行全文搜索.使用MyISAM,它支持全文索引.
  3. 如果你想要非常快,你可以使用memory引擎,这将表写入RAM.当CPU负载较低时,将数据传输到基于磁盘的表.

从数据库中读取

这是数据库真正闪耀的地方.
您可以将来自不同条目的各种信息组合起来,比平面文件中的更快更容易.

SELECT logdate, username, action FROM log WHERE userid = '1' /*root*/ AND error = 10;
Run Code Online (Sandbox Code Playgroud)

如果您在where子句中使用的字段上有索引,结果几乎会立即返回,请尝试在平面文件上执行此操作.

SELECT username, count(*) as error_count 
FROM log 
WHERE error <> 0 
GROUP BY user_id WITH ROLLUP
Run Code Online (Sandbox Code Playgroud)

没关系这个表没有规范化的事实,这对于平面文件要慢得多,也更难.
真的没脑子.


小智 6

速度并不是一切。是的,写入文件速度更快,但如果日志位于数据库中,则在日志中查找所需内容要快得多。几年前,我将 CMS 从基于文件的日志转换为 Mysql 表。表比较好。