数据库日志与文件日志


Database logs vs file logs

我已经创建了一个PHP+MYSQL web应用程序,现在我正在尝试实现一个日志系统来存储和跟踪每个用户的一些操作。

这样做的目的如下:通过记录IP+时间+动作来跟踪每个用户会话的活动,然后通过记录时间+页面名称来查看他稍后访问的页面;对于每个用户,都会有一个格式为log的文件{userid}_{month}.log

然后,每个日志将仅由网站所有者通过自定义管理面板查看,并且数据将仅用于安全目的(如中所示,以向用户显示他是否从不同的IP登录,或者其他人是否从不同IP登录,并查看用户在登录会话中访问了网站的哪些区域)。

目前,我有一个MYSQL MyISAM表,我在其中存储用户ID、IP、时间、操作,该应用程序仍然没有启动,但我们打算拥有非常多的用户(超过10万),使用数据库进行这种解决方案感觉就像自杀。

那么你有什么建议呢?应该如何进行日志记录?使用文件,使用当前数据库中的表,使用单独的数据库?PHP有可用的文件日志记录框架吗?

那么应该如何读取文件呢?逐行阅读结果?

谢谢你

你有很多选择,所以我将根据我的经验来谈谈一家拥有约50万用户的初创公司,每月活跃10万,这似乎在你的范围内。

我们在MySQL数据库中记录了用户操作。

  1. 查询数据非常简单快捷(提供了良好的索引)
  2. 我们在Azure上运行,并有一个专用的MySQL(带有从属服务器等)用于存储所有用户数据,包括日志。空间不是问题
  3. 登录MySQL可能会很慢,这取决于您所记录的一切,所以我们只是将日志推送到Redis,并让Python应用程序从Redis读取日志,然后在后台插入MySQL。这使得日志记录基本上对加载时间没有影响

我们决定登录MySQL进行用户操作,因为:

  1. 我们希望在任何时候对任何内容运行查询,而不需要付出太多努力。用户操作日志的结构化格式使得这项工作变得非常容易
  2. 如果需要,它还允许向用户显示某些日志
  3. 当我们引入徽章时,我们不需要解析文本日志来将徽章授予那些执行特定操作X次的人。我们只是针对用户操作日志编写了一个查询,徽章就被授予了。因此,根据操作添加功能也很容易

我们确实对一些应用程序日志使用了文件日志记录,或者我们没有每天查询的东西,比如Python应用程序写入数据库、Web服务器访问和错误日志等。

我们使用Logstash来处理这些日志。它可以简单地挂接到日志文件并将其流式传输到Logstash服务器。Logstash还可以查询您的日志,这非常酷。

高级使用

我们使用Slack进行团队通信,并将Python数据库编写应用程序与之集成,这使我们能够将关键错误发送到一个渠道(通过他们的API),在那里有人可以立即采取修复措施。

关闭

我的建议是现在不要想太多,登录MySQL,查询并查看统计数据。更新、冲洗并重复。您希望保持部署和更新之间的快速循环,因此通过快速SQL查询做出决策会很容易。

基本上,你想避免的是登录到服务器,找到一个日志和grep,通过它找到一些东西,上面实现了这一点。

这就是我们所做的,它仍然像那样运行,我们没有计划很快改变它。我们没有遇到任何找不到我们需要的东西的问题。如果用户数量激增,我们的月活跃用户达到100万,那么我们可能会改变它。

请注意:无论您决定以何种方式登录,如果您正在保存POST数据,请确保永远不要对信用卡信息这样做,除非您符合要求。或者使用Stripe的JavaScript库。

如果您确信读取日志一次主要针对一个用户,则应考虑对日志表进行分区:http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html使用userid作为分区键。

分区的最大数量是1024,您将有一个分区存储100000用户中的1/1000,这是合理的。

PHP有可用的文件日志记录框架吗?

包装学家提供了以下内容:https://packagist.org/packages/psr/log

请注意,它不是一个文件日志记录框架,而是基于图中PSR-3标准的记录器的API。因此,如果您愿意,它是PHP的"标准"记录器接口。您可以构建一个实现此接口的记录器,或者在packagegist上搜索其他实现该接口的记录器(基于文件或MySQL)。包装上还有其他一些伐木机(茶杯、林业),但最好使用符合PSR标准的伐木机。

我们使用伟大的工具Graylog进行日志记录。

它可以扩展到你想要的高度,在数据可视化方面有很好的工具,即使对于复杂的查询和庞大的数据集,速度也非常快,而且底层的搜索引擎(弹性搜索)是无模式的。后者可能是一个优势,因为您可以在没有mysql模式给您带来麻烦的情况下扩展日志。

Graylog、elasticsearch和mongodb(用于保存Graylog及其网络接口的配置)可以通过puppet、chef等工具轻松部署。

事实上,使用已经提到的php-lib monlog,登录到graylog很容易。

当然,这里最大的缺点是你必须学习一堆新的工具和软件。但在我看来,这是值得的。

问题的关键是您正在写入的数据不会更改。根据我在这种情况下的经验,我会使用其中一种:

  • MySQL与黑洞存储引擎。设置正确,速度极快
  • Riak Cluster(NoSQL解决方案)-尽管这对你来说可能是一条学习曲线,但它可能是你最终需要学习的曲线

使用SysLog;)在另一台服务器上设置它,它可以单独记录您的所有进程(如网络、服务器、sql、apache和php)。它对您很有用,可以减少调试时间。:)