遇到一个问题,比较困扰,就是关于日志打印的问题。框架用了express。 疑问:如何将每条request对应着的我res.send()给它的数据也同样答应出来,即:同一个http连接对应的request以及response统一打印到一条日志中? 上一下伪代码: 1、主:
var app = express(); var requestLogger = require(’./middleware/requestLogger’); app.use(requestLogger); app.use(’/api/friends’,routeFriends);下边就是各种router了。
2、requestLogger的伪代码:
var requestLogger = function (req, res, next) { var logObj = {}; logObj[‘url’] = req.url; logObj[‘method’] = req.method; if (req.method == ‘POST’) { logObj[‘data’] = req.body; } logObj[‘headers’] = req.headers; log4js.getLogger(‘HTTP’).info(JSON.stringify(logObj)); next(); };
这样可以在各router之前将所有 调用方的带的请求参数打印出来,可是无法打印我res.send()到调用方的信息。
目前的日志格式,类似这样: [2017-08-15 22:02:57.856] [INFO] HTTP - {“url”:"/api/friends",“method”:“POST”,“data”:{“uid”:2014},“headers”:{“host”:“www.baidu.com”,“x-real-ip”:“127.0.0.1”,“x-forwarded-for”:“127.0.0.1”,“connection”:“close”,“accept”:"/",“content-type”:“application/json”,“content-length”:“50”}}
疑问: 如何将每条request对应着的我res.send()给它的数据也同样答应出来,即:一个http连接对应的request以及response统一打印到一条日志中。 当然:可以在各个路由请求中res.send()的同时打印日志,可是这样需要在各个路由去处理,肯定是不行的。
有没有一个统一的http出口可以做这个事情呢?
自己封装一个response函数,里面分别调用res.send和console.log
找到了一个很好的解决方案 https://stackoverflow.com/questions/19215042/express-logging-response-body function logResponseBody(req, res, next) { var oldWrite = res.write, oldEnd = res.end;
var chunks = [];
res.write = function (chunk) { chunks.push(chunk);
oldWrite.apply(res, arguments);
};
res.end = function (chunk) { if (chunk) chunks.push(chunk);
var body = Buffer.concat(chunks).toString('utf8');
console.log(req.path, body);
oldEnd.apply(res, arguments);
};
next(); }
app.use(logResponseBody);