如何使用nodejs设置HTTP服务器进行日志记录


How to setup HTTP server with nodejs for logging?

我需要为我的启动设置日志服务。我和我的团队没有时间和资源(金钱)来部署专门的日志工具。然而,我需要对用户行为进行分析。虽然我要学习分析并实现它,但我需要记录用户活动,以便稍后提取数据并进行数学计算。

我使用基于SQL的(RDBMS)设置为我的主要应用程序(这是一个web服务),并计划在DynamoDB (AWS)中记录用户活动。

此外,我计划设置一个本地(在同一台服务器上)Node.Js服务器,它可以处理来自我的基于PHP的应用程序的日志请求,以确保日志记录活动在另一个进程中运行,并且在不崩溃或减慢主服务器代码的情况下优雅地处理。这里的想法是——当用户发出请求时,PHP应用程序将调用NodeJS服务器。NodeJS服务器将接收请求并立即返回,同时排队请求(例如200个其他请求),PHP应用程序将继续服务该请求。NodeJS服务器将一个接一个地记录队列中的所有内容。

我计划这样做的原因是- NodeJS在单线程上运行并且是基于事件循环的-因此,如果有突然的流量高峰,日志请求将被排队,数据将最终发送到Dynamo,而不会使PHP应用程序等待确认。

注意:当我说用户活动时,我指的是应用程序级别的日志记录,如:

  • 用户X从A.B.C.D的IP地址试图访问ID为123的文章2016-09-10 14:21:22
  • 用户Y使用ABC应用程序在2016-09-10 18:30:02对Article #987发表评论#234。
  • 用户C从efg.h IP地址登录web界面。

当然,数据将是JSON格式,服务器将调用AWS SDK。

在这里,NodeJs服务器基本上充当日志代理。基于目前的想法/场景,我有以下问题:

  1. 是决定使用DynamoDB日志请求好还是我犯了一个错误?这项服务在我的预算之内。
  2. 在这种情况下,我对NodeJS有什么样的限制?nodejs可以吗?
  3. 我应该使用什么节点模块?HTTP服务器是否可以,或者是否有针对此类场景的公开可用模块?
  4. 我如何确保这个服务器只监听来自同一台机器(环回)的请求?

这将是一个TL;答:

1 -使用DynamoDB记录请求的决定是否正确犯错误了吗?这项服务在我的预算之内。

DynamoDB是一个nosql数据库服务,提供快速和可预测的性能与无缝的可扩展性,在我看来,这是一个很好的方式,当我们谈论登录,正如预期的那样,你需要一个快速写入和快速读取,没有日志消息之间的关系(我认为)。因此,您可以在这里使用DynamoDB而不会出现问题。

2 -在这种情况下,我使用NodeJS会有什么样的限制?nodejs可以吗?

NodeJS是(如你所说)单线程和事件循环为基础,如果你有更多的请求比NodeJS可以处理,你应该分叉或者是

我仍然认为你应该使用像Logstash这样的工具,但如果你确定你可以使用NodeJS来做到这一点,可能你会成功。

3 -我应该使用什么Node模块?HTTP服务器会这样做吗是否有针对此类场景的公开可用模块?

当我谈论日志策略时,我想到的第一件事是"网络上成千上万的包",我不知道你是否在你的创业中有这个,无论如何我建议你使用UDP发送日志消息,UDP(用户数据报协议)主要用于在互联网上的应用程序之间建立低延迟和容错连接。你可以启动一个UDP NodeJS监听器,例如使用dgram。要发送UDP日志消息到你的NodeJS服务器,你可以使用带有Winston - UDP插件的Winston登录库。或者,在您的情况下,从PHP服务器,您可以发送UDP消息与套接字或看看这里。免责声明:我不是PHP专家,所以我谷歌了一下,我发现了这些解决方案,通过UDP发送日志消息,我不确定这是否是最好的方法:)

4 -我如何确保这个服务器只监听请求来自同一台机器(环回)?

可以使用安全组