我很少使用cron加载脚本。现在我没有存储任何日志,所以如果任何脚本加载失败,我不会知道它,直到我看到结果-即使当我注意到结果不正确,我也不能做任何事情,因为我不知道哪个脚本失败了。
我已经决定存储日志,但我仍然不确定如何做。所以,我的问题是-在sql数据库或文件中存储日志哪个更有效?
我可以在mysql数据库中创建' logs‘表,并将每个日志存储在单独的行中,或者我可以使用php的file_put_contents或fopen/fwrite将日志存储在单独的文件中。
我的脚本在工作时大约每分钟添加5个日志(总共)。我已经做了一些测试来确定哪个更快- fopen/fwrite和mysql的insert。我循环执行"insert“语句3000次,生成3000行,循环fopen/fwrite 3000次,生成包含示例文本的3000个文件。Fwrite的执行速度比sql的insert快4-5倍。我进行了第二次循环-我循环了一个'select‘语句,并将其分配给一个字符串3000次-我还使用'fopen’打开了3000个文件,并将结果分配给该字符串。结果是一样的- fopen/fwrite完成任务的速度提高了4-5倍。
那么,对于所有有经验的程序员,您在存储日志方面的经验是什么?有什么建议吗?
// 04.09.2011编辑-感谢大家的回答,他们对我帮助很大。每个帖子都很有价值,所以很难只接受一个答案;-)
发布于 2011-08-31 21:07:11
您可以使用诸如Zend_Log之类的组件,该组件本身支持附加到同一日志实例的编写器的概念。通过这种方式,您可以将相同的消息记录到一个或多个不同的位置,而无需更改您的日志记录代码。您可以随时更改代码来替换日志系统,或者以一种简单的方式添加新的日志系统。
对于您的问题,我认为如果您(开发人员)是唯一需要读取日志消息的人,那么log to files会更简单、更合适。
如果您需要其他人需要在web界面中读取日志,或者如果您需要通过日志进行搜索的能力,请改为登录到db。正如其他人也指出的那样,如果你有很多用户登录到db,那么可以更好地扩展。
最后,每分钟5条消息的日志频率几乎不需要应用程序的cpu,因此您不需要担心性能问题。在您的情况下,我会从日志文件开始,然后更改(或添加更多的编写器),如果您的必需品要更改的话。
发布于 2011-08-31 21:04:40
使用文件的日志效率更高,但是存储在数据库中的日志更容易读取,甚至是远程读取(例如,如果需要,您可以编写web前端)。
但是请注意,在数据库中连接和插入行很容易出错(数据库服务器宕机、密码错误、资源不足),那么如果您决定使用数据库,那么应该在哪里记录这些错误呢?
发布于 2011-08-31 21:27:01
对你的发现发表评论。
关于对文件的写入,您可能是对的。
关于读数,你大错特错了。
对数据库的写入:
memory
引擎,这会把表写在内存中。当CPU负载较低时,将数据传输到基于磁盘的表。从数据库读取
这才是数据库真正闪亮的地方。
您可以组合来自不同条目的各种信息,这比从平面文件中进行操作要快得多,也容易得多。
SELECT logdate, username, action FROM log WHERE userid = '1' /*root*/ AND error = 10;
如果您对where
子句中使用的字段建立了索引,那么结果几乎可以立即返回,请尝试对平面文件执行此操作。
SELECT username, count(*) as error_count
FROM log
WHERE error <> 0
GROUP BY user_id WITH ROLLUP
不管表没有被规范化的事实,这将会慢得多,而且对于平面文件来说也很难做到。
这真的不需要动脑筋。
https://stackoverflow.com/questions/7257242
复制相似问题