起http服务比如koa时有并发导致日志的顺序很乱有什么解决方案么?
比如一个请求还没结束的时候进来了第二个请求,这个时候日志就会重叠… 我能想到的,比如,请求进入的时候运行日志记录开始,后续的日志记录到一个数组里,结束的时候一次性写到文件里去,保证一块一块的… 想知道有没有别的办法
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
}))
}
@Blacate 我主要的目的是运行过程中的日志…当然,本次请求的结果可以在最后打印…问题是只打印结果的话在哪打印都不会有区别呀…
添加request_id字段来区分。
一次请求过程中产生的日志都统一push到一个数组中,请求结束后再按顺序打印数组中所有的内容
4楼如果不是一个console.log全输出的话,也可能会有问题,想解决就得用一个console.log把整个数组输出出来。
一般情况下用1楼的方案应该就足够满足日志查阅的需求,不过当请求报错跳出的时候,会执行不到打印日志的代码,解决这个问题的话需要把await next()放到try catch结构里,并对异常做处理。
如果是想链路追踪的话,就在请求进入的时候增加一个requestID,然后在日志中都附加这个字段,最终可以整理出统一请求的日志
@AnzerWall 好吧,从成本上看这是最合理的…改动也最小,谢谢