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前端).
但请注意,在数据库中连接和插入行是容易出错的(数据库服务器关闭,密码错误,资源不足),那么如果您决定使用数据库,那么您将在哪里记录这些错误?
您可以使用Zend_Log等组件,它本身支持附加到同一日志实例的编写器概念.通过这种方式,您可以将相同的消息记录到一个或多个不同的位置,而无需更改日志记录代码.您可以随时更改代码以替换日志系统或以简单的方式添加新系统.
对于您的问题,我认为如果您(开发人员)是唯一需要阅读日志消息的人,那么日志到文件会更简单,更合适.
如果您需要其他人需要在Web界面中读取日志或者您需要能够搜索日志,请记录到db.正如其他人已经指出并发问题一样,如果你有很多用户登录到db可以更好地扩展.
最后,每分钟5条消息的日志频率几乎不需要您的应用程序的CPU,因此您不必担心性能.在您的情况下,我将从日志文件开始,然后更改(或添加更多编写器),如果您的必需品将更改.
评论你的发现.
关于写入文件你可能是对的.
关于阅读你是错的.
写入数据库:
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)
没关系这个表没有规范化的事实,这对于平面文件要慢得多,也更难.
真的没脑子.
归档时间: |
|
查看次数: |
22064 次 |
最近记录: |