【发布时间】:2013-11-19 10:06:39
【问题描述】:
我是一位经验丰富的 Java 开发人员,开始学习 Node.js 并转向异步模型。除了日志记录之外,大多数事情都进展顺利。在使用 express 使用 Node.js 进行开发时,我在 Java 中找不到类似于 log4j 和 NDC 的任何东西。
我的目标是让每个日志语句自动添加以下信息:
[2013-11-07 11:17:04.615 serverScript INFO 7036 192.168.7.209]
这包括时间戳、编写此语句的 js 文件的名称(对于模块化节点应用程序)、调试级别、进程 ID(正在运行的集群)和客户端的 IP 地址。
当最初进入我的请求处理程序时,我可以让它编写这些,但没有将一堆参数传播到每个调用的函数,子例程内的记录器语句没有信息。我知道我可以在每个 js 文件中创建一个记录器实例来初始化其名称,但我还没有找到客户端 IP 地址的解决方案。对于运行时间较长的请求,我在记录器中设置的地址会在下一个请求进入时被覆盖,因此记录的 IP 会被交叉。
我查看了 winston,但即使使用它也无法解决此问题。有没有人做到这一点?当您可以按 IP 过滤以仅查看一个用户的活动时,跟踪字段问题非常有用。
[编辑:从参数传递解决方案进行测试,直到我学习 syslog 方式]
[2013-11-07 14:29:28.641 server INFO 7527 192.168.7.209] Got request from 192.168.7.209 for /ionmed/executeQuery?
[2013-11-07 14:29:28.641 router INFO 7527 192.168.7.209] About to route a request for /ionmed/executeQuery, method=POST
[2013-11-07 14:29:28.642 router INFO 7527 192.168.7.209] getting POSTed data
[2013-11-07 14:29:28.642 router INFO 7527 192.168.7.209] POST params: {"sqlQuery":"select sleep(10)","sessionStart":"1383852558799","rand":"0.5510970998368581","jsessionid":"117DBAA89F599D923AF80D4AB171BDDF"}
[2013-11-07 14:29:28.642 requestHandlers INFO 7527 192.168.7.209] 'query' was called.
[2013-11-07 14:29:28.642 requestHandlers INFO 7527 192.168.7.209] select sleep(10)
[2013-11-07 14:29:30.673 server INFO 7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:30.673 router INFO 7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:30.673 router INFO 7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:30.673 router INFO 7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:30 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:33.578 server INFO 7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:33.578 router INFO 7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:33.578 router INFO 7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:33.579 router INFO 7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:33 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:38.644 requestHandlers INFO 7527 192.168.7.209] sending response
[192.168.7.209 Thu, 07 Nov 2013 19:29:38 GMT] HTTP/1.1 POST "/node/ionmed/executeQuery?" 200 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:25.0) Gecko/20100101 Firefox/25.0"
[2013-11-07 14:29:41.540 server INFO 7527 192.168.7.217] Got request from 192.168.7.217 for /
[2013-11-07 14:29:41.541 router INFO 7527 192.168.7.217] About to route a request for /, method=GET
[2013-11-07 14:29:41.541 router INFO 7527 192.168.7.217] No request handler found for /; serving as file
[2013-11-07 14:29:41.541 router INFO 7527 192.168.7.217] Request handler 'serveFile' was called to get: /index.html
[192.168.7.217 Thu, 07 Nov 2013 19:29:41 GMT] HTTP/1.1 GET "/node/" 200 "Mozilla/5.0 (iPod; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3"
[2013-11-07 14:29:45.146 server INFO 7527 192.168.7.209] RLz6tmJ7KTH2R16VCVTX: bye {"user":"1"}
[2013-11-07 14:29:45.176 server INFO 7527 192.168.7.209] RLz6tmJ7KTH2R16VCVTX: disconnected
现在我只需要弄清楚如何让快速请求记录器与我的内部记录器采用相同的行条目格式,直到它全部移动到 rsyslog。
【问题讨论】:
-
您使用的是 Linux(我怀疑您是基于您提到 PID 的事实)?如果是这样,请查看 rsyslog。我正在用它来做你正在看的事情。正确设置后,您只需打开一个套接字,它将在时间和发件人名称以及您发送的任何字符串之前添加。如果您使用的是 Linux,请回复评论,我将详细介绍如何从节点设置和使用它。
-
既然您在谈论记录状态信息(请求的 IP 地址),我认为您最好的选择是传递值。不过,您可以传递包含多条信息的单个对象。
-
我同时使用 Linux 和 OS/X(基于 Unix)。我很想知道 rsyslog 方法。
-
现在,我继续使用传递的对象进行操作,感觉不干净,但确实有效。附加到我的原始消息的测试示例日志。
-
既然这是一个 HTTP 服务器,请求对象是否可以通过您的调用堆栈获得?您可以将状态信息附加到它。