数据库日志与文件日志
Database logs vs file logs
我已经创建了一个 PHP+MYSQL 网络应用程序,我正在尝试实施一个日志系统来存储和跟踪每个用户的一些操作。
这样做的目的是:通过记录IP+时间+动作来跟踪每个用户的会话activity,然后通过记录时间+页面名称查看他后来访问了哪些页面;对于每个用户,都会有一个格式如下的文件:log{userid}_{month}.log
然后,每个日志将仅由网站所有者通过自定义管理面板查看,并且数据将仅用于安全目的(如向用户显示他是否从其他 IP 登录或如果其他人从不同的 IP 登录并查看用户在登录会话期间访问了网站的哪些区域)。
目前,我有一个 MYSQL MyISAM table,我在其中存储用户 ID、IP、时间、操作,应用程序仍未启动,但我们打算有很多用户(超过100k),并且使用数据库来解决这个问题就像自杀一样。
那么你有什么建议呢?应该如何进行日志记录?使用文件,使用当前数据库中的 table,使用单独的数据库? PHP 是否有可用的文件记录框架?
那么应该如何读取文件呢?按行读取结果?
谢谢
你有很多选择,所以我会根据我的经验来谈谈 运行 一家拥有大约 50 万用户的初创公司,每个月有 10 万活跃用户,这似乎在你的 运行 范围内。
我们在 MySQL 数据库中记录了用户操作。
- 查询您的数据非常简单快捷(提供良好的索引)
- 我们 运行 在 Azure 上,并且有一个专用的 MySQL(带有从机等)用于存储所有用户数据,包括日志。 Space 不是问题。
- 记录到 MySQL 可能会很慢,具体取决于您记录的所有内容,因此我们只是将日志推送到 Redis 并让 Python 应用程序从 Redis 读取它并插入在后台进入 MySQL。这使得日志记录基本上对加载时间没有影响。
我们决定登录 MySQL 进行用户操作,因为:
- 我们想 运行 随时查询任何内容而不费力。用户操作日志的结构化格式使这一切变得异常容易。
- 如果需要,它还允许您向用户显示某些日志。
- 当我们引入徽章时,我们无需解析文本日志即可将徽章奖励给执行特定操作 X 次的人。我们只是针对用户操作日志编写了一个查询,并授予了徽章。因此,添加基于操作的功能也很容易。
我们确实对几个应用程序日志使用了文件日志记录 - 或者我们没有每天查询的东西 - 例如 Python 应用程序写入数据库、Web 服务器访问和错误日志等。
我们使用 Logstash 来处理这些日志。它可以简单地挂接到日志文件并将其流式传输到您的 Logstash 服务器。 Logstash 还可以查询你的日志,很酷
高级使用
我们使用 Slack 进行团队沟通,并将 Python 数据库编写应用程序与其集成,这使我们能够将严重错误发送到一个频道(通过他们的 API)可以立即采取修复措施。
关闭
我的建议是暂时不要想太多,登录 MySQL,查询并查看统计信息。进行更新,冲洗并重复。您希望使部署和更新之间的循环保持快速,因此通过快速 SQL 查询做出决定会变得很容易。
基本上您想要避免的是登录服务器、查找日志并grep
通过它找到一些东西,上面实现了这一点。
这就是我们所做的,它仍然是 运行ning 的样子,我们没有计划很快改变它。我们没有遇到任何找不到我们需要的东西的问题。如果用户数量激增并且我们扩展到每月 100 万活跃用户,那么我们可能 会改变它。
Please note: whichever way you decide to log, if you are saving the POST data, be sure to never do that for credit card info, unless you are compliant. Or rather use Stripe's JavaScript libraries.
如果您确定一次读取日志主要针对一个用户,您应该考虑对您的日志进行分区table:
http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html
使用您的 user_id 作为分区键。
最大分区数为 1024,您将有一个分区存储 100k 用户中的 1/1000,这是合理的。
Are there any file-logging frameworks available for PHP?
packagist 上有这个:https://packagist.org/packages/psr/log
请注意,它不是文件日志记录框架,而是 API 基于图 1 中 PSR-3 标准的记录器。因此,如果您愿意,它是 PHP 的 "standard" 记录器界面。您可以构建一个实现此接口的记录器,或在 packagist 上搜索其他实现该接口的记录器(基于文件或 MySQL)。 packagist(茶杯、林业)上还有一些其他记录器,但最好使用符合 PSR 标准的记录器。
我们使用出色的工具进行日志记录 Graylog。
它可以随心所欲地扩展,拥有出色的数据可视化工具,即使对于复杂的查询和庞大的数据集也非常快,并且底层搜索引擎 (elasticsearch) 是无模式的。后者可能是一个优势,因为您可以在扩展日志时获得更多可能性而无需麻烦 mysql-schemas 可以为您提供。
Graylog、elasticsearch 和 mongodb(用于保存 graylog 及其 web 界面的配置)可以通过 puppet、chef 等工具轻松部署。
实际上,使用已经提到的 php-lib monolog,登录到 graylog 很容易。
当然,这里最大的缺点是你必须学习一堆新的工具和软件。但是在我看来是值得的。
使用系统日志 ;)
在另一台服务器上设置它,它可以单独记录您的所有进程(例如网络、服务器、sql、apache 和您的 php)。
它对您很有用,可以减少调试时间。 :)
问题的关键是你正在写入的数据不会被改变。根据我在这种情况下的经验,我会使用:
- MySQL with a blackhole 存储引擎。设置正确,速度快得惊人!
- Riak Cluster(NoSQL 解决方案)- 尽管这对您来说可能是一个学习曲线,但您可能最终还是需要学习。
我已经创建了一个 PHP+MYSQL 网络应用程序,我正在尝试实施一个日志系统来存储和跟踪每个用户的一些操作。
这样做的目的是:通过记录IP+时间+动作来跟踪每个用户的会话activity,然后通过记录时间+页面名称查看他后来访问了哪些页面;对于每个用户,都会有一个格式如下的文件:log{userid}_{month}.log
然后,每个日志将仅由网站所有者通过自定义管理面板查看,并且数据将仅用于安全目的(如向用户显示他是否从其他 IP 登录或如果其他人从不同的 IP 登录并查看用户在登录会话期间访问了网站的哪些区域)。
目前,我有一个 MYSQL MyISAM table,我在其中存储用户 ID、IP、时间、操作,应用程序仍未启动,但我们打算有很多用户(超过100k),并且使用数据库来解决这个问题就像自杀一样。
那么你有什么建议呢?应该如何进行日志记录?使用文件,使用当前数据库中的 table,使用单独的数据库? PHP 是否有可用的文件记录框架?
那么应该如何读取文件呢?按行读取结果?
谢谢
你有很多选择,所以我会根据我的经验来谈谈 运行 一家拥有大约 50 万用户的初创公司,每个月有 10 万活跃用户,这似乎在你的 运行 范围内。
我们在 MySQL 数据库中记录了用户操作。
- 查询您的数据非常简单快捷(提供良好的索引)
- 我们 运行 在 Azure 上,并且有一个专用的 MySQL(带有从机等)用于存储所有用户数据,包括日志。 Space 不是问题。
- 记录到 MySQL 可能会很慢,具体取决于您记录的所有内容,因此我们只是将日志推送到 Redis 并让 Python 应用程序从 Redis 读取它并插入在后台进入 MySQL。这使得日志记录基本上对加载时间没有影响。
我们决定登录 MySQL 进行用户操作,因为:
- 我们想 运行 随时查询任何内容而不费力。用户操作日志的结构化格式使这一切变得异常容易。
- 如果需要,它还允许您向用户显示某些日志。
- 当我们引入徽章时,我们无需解析文本日志即可将徽章奖励给执行特定操作 X 次的人。我们只是针对用户操作日志编写了一个查询,并授予了徽章。因此,添加基于操作的功能也很容易。
我们确实对几个应用程序日志使用了文件日志记录 - 或者我们没有每天查询的东西 - 例如 Python 应用程序写入数据库、Web 服务器访问和错误日志等。
我们使用 Logstash 来处理这些日志。它可以简单地挂接到日志文件并将其流式传输到您的 Logstash 服务器。 Logstash 还可以查询你的日志,很酷
高级使用
我们使用 Slack 进行团队沟通,并将 Python 数据库编写应用程序与其集成,这使我们能够将严重错误发送到一个频道(通过他们的 API)可以立即采取修复措施。
关闭
我的建议是暂时不要想太多,登录 MySQL,查询并查看统计信息。进行更新,冲洗并重复。您希望使部署和更新之间的循环保持快速,因此通过快速 SQL 查询做出决定会变得很容易。
基本上您想要避免的是登录服务器、查找日志并grep
通过它找到一些东西,上面实现了这一点。
这就是我们所做的,它仍然是 运行ning 的样子,我们没有计划很快改变它。我们没有遇到任何找不到我们需要的东西的问题。如果用户数量激增并且我们扩展到每月 100 万活跃用户,那么我们可能 会改变它。
Please note: whichever way you decide to log, if you are saving the POST data, be sure to never do that for credit card info, unless you are compliant. Or rather use Stripe's JavaScript libraries.
如果您确定一次读取日志主要针对一个用户,您应该考虑对您的日志进行分区table: http://dev.mysql.com/doc/refman/5.1/en/partitioning-range.html 使用您的 user_id 作为分区键。
最大分区数为 1024,您将有一个分区存储 100k 用户中的 1/1000,这是合理的。
Are there any file-logging frameworks available for PHP?
packagist 上有这个:https://packagist.org/packages/psr/log
请注意,它不是文件日志记录框架,而是 API 基于图 1 中 PSR-3 标准的记录器。因此,如果您愿意,它是 PHP 的 "standard" 记录器界面。您可以构建一个实现此接口的记录器,或在 packagist 上搜索其他实现该接口的记录器(基于文件或 MySQL)。 packagist(茶杯、林业)上还有一些其他记录器,但最好使用符合 PSR 标准的记录器。
我们使用出色的工具进行日志记录 Graylog。
它可以随心所欲地扩展,拥有出色的数据可视化工具,即使对于复杂的查询和庞大的数据集也非常快,并且底层搜索引擎 (elasticsearch) 是无模式的。后者可能是一个优势,因为您可以在扩展日志时获得更多可能性而无需麻烦 mysql-schemas 可以为您提供。
Graylog、elasticsearch 和 mongodb(用于保存 graylog 及其 web 界面的配置)可以通过 puppet、chef 等工具轻松部署。
实际上,使用已经提到的 php-lib monolog,登录到 graylog 很容易。
当然,这里最大的缺点是你必须学习一堆新的工具和软件。但是在我看来是值得的。
使用系统日志 ;) 在另一台服务器上设置它,它可以单独记录您的所有进程(例如网络、服务器、sql、apache 和您的 php)。 它对您很有用,可以减少调试时间。 :)
问题的关键是你正在写入的数据不会被改变。根据我在这种情况下的经验,我会使用:
- MySQL with a blackhole 存储引擎。设置正确,速度快得惊人!
- Riak Cluster(NoSQL 解决方案)- 尽管这对您来说可能是一个学习曲线,但您可能最终还是需要学习。