2015-02-08 126 views
10

我创建一个PHP + MySQL的Web应用程序,我想现在落实测井系统的存储和跟踪每个用户的一些操作文件记录。数据库日志VS

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

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

目前,我有一个MYSQL MyISAM表,我存储用户标识,IP,时间,行为和应用程序仍然没有启动,但我们打算有非常多的用户(超过10万),并使用数据库为此解决方案就像自杀。

那么你有什么建议?日志记录应该如何完成?使用文件,使用当前数据库中的表,使用单独的数据库?是否有任何文件记录框架可用于PHP?

应该怎样文件的读取来,于是做了?按行读取结果?

谢谢

+1

你应该看看这个: https://github.com/Seldaek/monolog – 2015-02-11 16:25:00

回答

18

你有很多选择,所以我会从我的经验运行的启动有50万左右的用户,10万活跃每个月,这似乎是在你的范围内说话。

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

  1. 查询数据是非常容易和快速(提供了良好的指标)
  2. 我们跑Azure,并有专门的MySQL(奴隶等),用于存储所有的用户数据,包括原木。空间不是问题。
  3. 记录到MySQL可能会很慢,这取决于你正在登录的一切,所以我们只是把圆木Redis,并有一个Python应用程序从Redis的阅读并插入到MySQL的背景。这使得日志记录对加载时间基本没有影响。

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

  1. 我们想毫不费力地运行查询任何东西在任何时间。用户操作日志的结构化格式非常容易实现。
  2. 它还允许您向用户显示某些日志,如果您需要的话。
  3. 当我们推出徽章,我们没有必要解析文本日志奖徽章那些谁执行的时间特定的动作X号。我们只是针对用户操作日志编写了一个查询,并颁发了徽章。因此,基于操作添加功能也很容易。

我们做了几个应用程序日志的使用文件记录 - 或东西我们没有每天都在查询 - 如Python应用程序写入数据库,Web服务器访问和错误日​​志,等等。

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

Advanced使用

我们修复立即使用Slack团队通信和综合了Python数据库写入应用它,这使我们能够严重错误发送到一个通道(通过其API),其中有人可能会采取行动。

关闭

我的建议是不要在想现在,登录到MySQL,查询和看到的统计数据。进行更新,冲洗并重复。您希望快速部署和更新周期,因此通过快速SQL查询做出决策可以让您轻松完成任务。

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

这就是我们所做的,它仍然像这样运行,我们没有计划很快改变它。我们没有发现任何我们需要的任何问题。如果有大规模的用户爆发,我们扩大到每月活跃用户1mil,那么我们可能会改变它。

请注意:你决定记录,如果要保存的POST数据无论怎样,一定要永远做信用卡信息,除非你是兼容的。或者使用Stripe的JavaScript库。

+0

我想知道更多关于你的日志表的样子。我的团队今天正在讨论我们如何在应用程序中记录操作。 一个建议是一个日志表,带有动作,两个任意ID连接到1或2个表。从数据完整性的角度来看,这似乎是一个坏主意。 我为特定的日志建议了单独的表格,其中只有一个(丑陋的)列(varchar 255或者一些愚蠢的东西),只有一个来自应用程序的段落,或者是一些更具体的动作ID,比如某种类型的前后。 – daraul 2017-08-21 23:17:00

+1

这个创业已经过去了几年,以下是来自内存。我们有一个基本上记录了每个调用的表,其中包括'controller','action','param'(请求中的id),'user_agent','query_string','user_id'(如果登录, ),'ip','timestamp'。我们的目标不是保存通用应用程序日志,而是保存用户操作。记录谁做了足够的事情。如果我们希望看到每个访问过项目156的人都有一个简单的'SELECT * FROM user_action_logs WHERE controller ='project'AND action ='view'AND param = 156'给了我们。你的用例可能会有所不同。 – 2017-08-22 07:02:17

2

是否有任何文件记录框架可用于PHP?

有了这个,您可在packagist:https://packagist.org/packages/psr/log

注意,它不是一个文件,日志框架,但基于从图PSR-3标准为记录程序的API。所以,如果你喜欢,它是PHP的“标准”记录器界面。您可以构建一个实现此接口的记录器,或者在packagist上搜索实现该接口的其他记录器(基于文件或MySQL)。 packagist(茶杯,林业)还有其他一些伐木工人,但最好使用符合PSR标准的伐木工人。

+2

这里有两个PSR-3标准日志包: https://packagist.org/packages/monolog/monolog https://packagist.org/packages/gplanchat/php-log – delatbabel 2015-02-11 10:56:08

1

我们用伟大的工具Graylog做记录。

它可以随心所欲地扩展,在数据可视化方面拥有出色的工具,即使对于复杂的查询和庞大的数据集,速度也非常快,底层搜索工具(elasticsearch)是无模式的。后者可能是一个优势,因为您可以在扩展日志的情况下获得更多可能性,而无需麻烦的mysql-schemas可以提供给您。

Graylog,elasticsearch和mongodb(用于保存graylog及其web界面的配置)可以通过puppet,chef等工具轻松部署。

事实上,已经提到的php-lib monolog很容易记录到graylog。

诅咒这里很大的缺点是你必须学习一些新的工具和软件。但我认为这是值得的。

0

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

1

问题的关键是您正在编写的数据不会被改变。根据我在这种情况下的经验,我会使用:

  • MySQL with a blackhole存储引擎。把它设置得恰到好处,它的速度非常快!
  • Riak Cluster(NoSQL解决方案) - 尽管这可能是您的学习曲线,但它可能是您最终需要采取的一种方法。
+0

无不是所有..如果你阅读链接,它会更详细地解释。这个图特别方便(https://dev.mysql.com/doc/refman/5.0/en/images/blackhole-1.png)。会发生什么情况是这些语句是写入日志而不是写入数据库的。你使用一个单独的MySQL实例来将这些语句在它自己的快乐时间中引入到数据库中。这一切都意味着写入发生得很快,存储独立发生(异步)。 – diversemix 2015-02-17 08:49:18

+0

谢谢,从来没有听说过这种方法。 – 2015-02-17 13:01:18