API调用日志记录方案
- log4js
log4js提供了完整的JavaScript日志记录方案,要将日志存储到文件中,需要修改log4js的默认配置.
var logger = require('log4js');
// log4js 配置
logger.configure({
pm2: true, // 结合pm2日志输出
pm2InstanceVar: 'www', // pm2 启动脚本入口
disableClustering: true, // pm2集群模式时,log4js不打印日志,禁用集群模式
replaceConsole: true,
level: 'WARN',
appenders: {
app: {
type: "file", //配置日志输出到文件中
filename: '../logs/app.log' // 日志输出文件路径
}
},
categories: {
default: {
appenders: ["app"],
level: 'WARN'
}
}
});
- node-http-proxy代理API请求
使用ExpressJS作为服务端,使用node-http-proxy作为代理中间件.
node-http-proxy提供了proxyRes事件监听来自后端的请求响应结果,但是http 响应式以数据流的形式,所以必须要把数据流全部接收完毕之后,才能对返回的请求结果进行分析和记录.
ExpressJS提供了app.use(router)路由拦截方法,我们只要提供一个日志拦截路由即可.
module.exports = function (options, context) {
var express = require('express');
var router = express.Router();
var logger = require('log4js').getLogger('API');
var proxy = context.getResource('proxy');
proxy.on('proxyReq', function(proxyReq, req) {
// handle request
});
proxy.on('proxyRes', function(proxyRes, req, res) {
// 需要修改Response结果, 排除上传,下载等特殊接口, 只记录普通接口
if (proxyRes.headers['content-type'] !== 'application/json;charset=utf-8') {
return;
}
// 持续接收服务端数据直到结束
let body = [];
proxyRes.on('data', function (chunk) {
body.push(chunk)
})
proxyRes.on('end', function () {
body = Buffer.concat(body).toString()
// 记录请求url与返回结果
logger.info(`Requested url: "${req.url}" response data: ${body}`)
})
});
router.use(function (req, res, next) {
// node-http-proxy 代理转发
proxy.web(req, res);
});
return router;
}
- PM2 日志管理
首先,启用PM2的ecosystem配置文件。
pm2 ecosystem
ecosystem.config.js
module.exports = {
apps : [{
name: "app",
script: "./www",
env: {
NODE_ENV: "development",
},
env_production: {
NODE_ENV: "production",
},
error_file:’../logs/error.log’, // 错误日志
out_file:’../logs/out.log’, // 输出日志
combine_logs:true // 启动多个实例时,合并日志文件,不按照实例id生成日志文件
}]
}