我已经创建了一个PHP + MYSQL Web应用程序,我正在尝试实现一个日志记录系统来存储和跟踪每个用户的一些操作。
目的是:通过记录IP +时间+动作跟踪每个用户会话的活动,然后通过记录时间+页面名称查看他稍后访问的页面;对于每个用户,将有一个格式为的文件: log {userid} _ {month} .log
然后,每个日志将仅由网站所有者通过自定义管理面板查看,并且数据仅用于安全目的(如果他从其他IP或某人登录时向用户显示)否则从其他IP登录,并查看用户在登录会话期间访问的网站区域。)
目前,我有一个MYSQL MyISAM表,我存储了用户ID,IP,时间,操作,应用仍未启动,但我们打算拥有非常多的用户(超过100k),并使用数据库来解决这个问题感觉像是自杀。
那你有什么建议?如何进行日志记录?使用文件,使用当前数据库中的表,使用单独的数据库?是否有可用于PHP的文件记录框架?
那么如何读取文件?按行阅读结果?
谢谢
答案 0 :(得分:20)
您有很多选择,所以我会根据自己的经验说明,每月运行一个拥有约50万用户的活动,每月活跃100k,这似乎在您的范围内。
我们在MySQL数据库中记录了用户操作。
我们决定登录MySQL以获取用户操作,因为:
我们确实使用了几个应用程序日志的文件记录 - 或者我们每天都没有查询的东西 - 例如Python应用程序写入数据库,Web服务器访问和错误日志等。
我们使用Logstash来处理这些日志。它可以简单地挂钩到日志文件并将其流式传输到Logstash服务器。 Logstash还可以查询您的日志,这非常酷。
高级用途
我们使用Slack进行团队沟通,并将Python数据库编写应用程序集成到其中,这使我们能够将关键错误发送到某个渠道(通过他们的API),以便有人立即采取措施。
<强>合强>
我的建议是暂时不要考虑它,登录MySQL,查询并查看统计数据。进行更新,冲洗并重复。您希望快速保持部署和更新之间的循环,因此通过快速SQL查询做出决策可以轻松实现。
基本上你想要避免的是登录到服务器,找到一个日志并grep
通过它找到一些东西,上面实现了这一点。
这就是我们所做的,它仍然是这样运行的,我们没有计划很快改变它。我们没有任何问题,我们找不到任何我们需要的东西。如果有大量用户,我们将每月活跃用户扩展到1百万,那么我们可能会更改它。
请注意:无论您决定记录哪种方式,如果您要保存POST数据,请务必不要使用信用卡信息,除非您符合要求。或者更确切地说使用Stripe的JavaScript库。
答案 1 :(得分:2)
如果您确定读取日志主要针对一个用户,则应考虑分配日志表: http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html 使用user_id作为分区键。
最大分区数为1024,您将有一个分区存储您的100k用户的1/1000,这是合理的。
答案 2 :(得分:2)
PHP是否有可用的文件记录框架?
包装上有这个:https://packagist.org/packages/psr/log
请注意,它不是文件记录框架,而是基于图1的PSR-3标准的记录器的API。所以,如果你愿意,它是PHP的“标准”记录器接口。您可以构建一个实现此接口的记录器,或者在packagist上搜索实现该接口的其他记录器(基于文件或基于MySQL)。 packagist(茶杯,林业)上还有一些其他记录器,但最好使用符合PSR标准的记录器。
答案 3 :(得分:1)
我们使用优秀工具Graylog进行记录。
它可以根据您的需要进行扩展,具有很好的数据可视化工具,即使对于复杂的查询和庞大的数据集也非常快,而且基础搜索引擎(elasticsearch)是无模式的。后者可能是一个优势,因为您可以在不使用mysql-schemas可以提供的麻烦的情况下扩展日志。[/ p>
Graylog,elasticsearch和mongodb(用于保存graylog及其web界面的配置)可以通过木偶,厨师等工具轻松部署。
实际上,已经提到的php-lib monolog很容易记录到graylog。
诅咒这里的最大缺点是你必须学习一堆新的工具和软件。但在我看来这是值得的。
答案 4 :(得分:1)
问题的关键在于你所写的数据不会被改变。根据我在这种情况下的经验,我会使用:
答案 5 :(得分:0)
使用SysLog;) 将其设置在另一台服务器上,它可以单独记录所有进程(例如网络,服务器,sql,apache和你的php)。 它对您有用并减少调试时间。 :)