日志文件与数据库在哪里保存用户活动数据以供分析?

Posted

技术标签:

【中文标题】日志文件与数据库在哪里保存用户活动数据以供分析?【英文标题】:Log files vs database where to save user activity data for analysis? 【发布时间】:2017-01-24 09:30:13 【问题描述】:

我目前正在开发一个具有登录功能的网站。我需要跟踪用户活动,例如登录注销时间、浏览总持续时间、IP 地址、位置等。所有数据将用于分析和安全目的。

现在,有两种选择(至少我知道)可以将如此庞大的数据保存在数据库或日志文件中。

保存在数据库或日志中的正确做法是什么? .

如果有人想知道,我使用 PHP 作为编程语言,使用 MySQL 作为 DB,并且没有任何数据分析经验。

【问题讨论】:

取决于您希望如何使用数据。您不能真正从文件中进行分析,因此无论如何您都需要将其加载到数据库中。因此,通常如果您已经知道要分析该数据,则将其放入数据库中。如果您可能不会这样做,但需要也许很久以后才能作为例外来执行此操作,那么日志文件可能会节省麻烦和计算能力。 【参考方案1】:

值得回过头来分析需求。

通常,业务用户需要了解网站以业务为中心的行为。昨天有多少人登录?他们在网站上花了多少时间?他们买东西了吗?

满足此要求的常用方法是配置分析包(例如Google Analytics)。分析包擅长理解网站上的行为,并且可以轻松配置以更改报告和分析结构。但是,他们通常不太擅长报告个人行为,而且他们的报告基于“网络行为”——您必须将“点击添加到购物车按钮”翻译为“购买了东西”的商业概念。

客户支持用户和应用程序逻辑需要了解个人的具体行为。当客户支持接到“求助,我无法登录”的电话时,他们可能想知道该用户最后一次登录是什么时候?如果一个应用逻辑模块想知道这个用户是否对产品X感兴趣,就需要知道他们是否看过相关的产品。

这些数据通常作为关系数据包含在数据库中,因为它很容易查询。但是关系模型很难修改,非技术用户也不会写SQL查询,所以比较死板。

技术用户需要了解应用程序的运行状况,并能够调查事件。

此信息通常存储为日志文件。日志文件通常很大——一个中等繁忙的网站每天会创建数 GB 的 apache 日志——并且只能使用专用的日志解析工具进行查询;这些是针对技术用户的,而不是业务人员。日志文件通常会保留很短的时间(几周或几个月),并且每天轮换一次。因此,回答“用户 x 上次登录是什么时候”这个问题可能需要解析一个月的日志文件,而如果您在一个月后删除日志,您可能无法得到正确的答案。但是,日志语句很容易插入到代码中,并且更改日志记录(例如只记录“错误”而不是“调试”消息)也很容易。

因此,对于“分析”(我假设这是由业务用户进行的)- 插入数据库或使用网络分析。出于“安全目的”(我假设这是为了技术用户的事件分析)- 日志文件。

【讨论】:

【参考方案2】:

最好使用 DB,因为如果您想按 IP、位置等分析或排序登录尝试。您可以使用 mysql 查询轻松地做到这一点,但是当您登录日志时,您应该有一个编辑器并且搜索某些内容会非常困难。 我个人在我的应用程序中记录了相同的功能,这里是一些如何获取浏览器信息和 IP 的代码。

<?php

function log_login_activity($loginEmail, $loginAuthType = '', $loginAttemptStatus = '', $error = '', $loginRedirect = '',$HeaderInfo = '')
    $loginTime = time();
    $browserInfo = getBrowser();
    $browser = $browserInfo['name'].' '.$browserInfo['version'];
    $loginIP = isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
    $protocol = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off' || $_SERVER['SERVER_PORT'] == 443) ? "HTTPS" : "HTTP";
    $browserAgent = $browserInfo['userAgent'];
    DB::insert('?:login_logs',array('email' => $loginEmail, 'time' =>$loginTime, 'browserInfo' =>$browser, 'loginAuthType' =>$loginAuthType, 'IP' =>$loginIP, 'error' => $error, 'protocol' => $protocol, 'loginRedirect' => $loginRedirect, 'browser' => $browserAgent));

【讨论】:

【参考方案3】:

这绝对取决于两件事: 1. 用户操作量。 2. 数据使用场景。 例如,如果有 500000 条新的每日记录,而您要做的只是进行一些聚合分析,那么您可以将日志数据保存到 HDFS 并使用 Apache Hive 或 Apache Spark 进行分析。 如果数据量仍然很大,你想做分析,除了你想有基于用户和时间戳的动作记录检索能力,那么你需要先将数据保存在一些键值数据库(如Apache Cassandra)中,然后使用 Apache Spark 执行分析。 您可以阅读有关 Cassandra 和大数据场景的更多信息here(免责声明:我在这家公司工作)。 如果每天有 2000 条记录,你只要把它放到任何一个关系数据库中并在那里进行分析,这将是最好的解决方案。

【讨论】:

【参考方案4】:

我认为 DB 是这里的正确选择。它更加强大和灵活。否则,您最终会得到(多个?)大而无意义的文件。

【讨论】:

以上是关于日志文件与数据库在哪里保存用户活动数据以供分析?的主要内容,如果未能解决你的问题,请参考以下文章

什么是日志文件?为什么要设立日志文件?

Kafka 用户日志上报实时统计之分析与设计

电商日志流量分析

如何在处理中保存设置数据,然后稍后加载以供使用

10年大数据架构师:日访问百亿级,如何架构并优化日志系统?

深入分析Oracle数据库日志文件(1)