CNode

起http服务比如koa时有并发导致日志的顺序很乱有什么解决方案么?

问答
Ww46245发布于7 年前最后回复7 年前7 回复4587 浏览0 收藏

比如一个请求还没结束的时候进来了第二个请求,这个时候日志就会重叠... 我能想到的,比如,请求进入的时候运行日志记录开始,后续的日志记录到一个数组里,结束的时候一次性写到文件里去,保证一块一块的.. 想知道有没有别的办法

查看回复

回复 (7)

B
Blacate#2·7 年前

koa是洋葱圈模型 所以可以在响应的最后再打印出日志

module.exports = async (ctx, next) => {
  const startTime = Date.now()
  await next()
  const endTime = Date.now()
  console.log(JSON.stringify({
    startTime,
	endTime,
	runTime: endTime - startTime
	// request and response
  }))
}

https://segmentfault.com/a/1190000013981513

W
w46245#3·7 年前
引用 Blacatekoa是洋葱圈模型 所以可以在响应的最后再打印出日志 https://segmentfault.com/a/1190000013981513

@Blacate 我主要的目的是运行过程中的日志..当然,本次请求的结果可以在最后打印..问题是只打印结果的话在哪打印都不会有区别呀...

M
meiwhu#4·7 年前

添加request_id字段来区分。

J
julyL#5·7 年前

一次请求过程中产生的日志都统一push到一个数组中,请求结束后再按顺序打印数组中所有的内容

L
libook#6·7 年前

4楼如果不是一个console.log全输出的话,也可能会有问题,想解决就得用一个console.log把整个数组输出出来。

一般情况下用1楼的方案应该就足够满足日志查阅的需求,不过当请求报错跳出的时候,会执行不到打印日志的代码,解决这个问题的话需要把await next()放到try catch结构里,并对异常做处理。

A
AnzerWall#7·7 年前

如果是想链路追踪的话,就在请求进入的时候增加一个requestID,然后在日志中都附加这个字段,最终可以整理出统一请求的日志

参与回复
登录后即可参与回复。登录