起http服务比如koa时有并发导致日志的顺序很乱有什么解决方案么?
发布于 6 年前 作者 w46245 3690 次浏览 来自 问答

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

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

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

添加request_id字段来区分。

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

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

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

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

@AnzerWall 好吧,从成本上看这是最合理的…改动也最小,谢谢

回到顶部