weapp_request_logger.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 'use strict';
  2. /**
  3. * 微信小程序接口请求日志。
  4. *
  5. * 仅记录定位请求所需的元数据,不记录 authorization、platform-code、
  6. * cookie、请求体或完整响应,避免敏感信息进入日志。
  7. */
  8. module.exports = options => {
  9. const slowThreshold = Number(options.slowThreshold) || 3000;
  10. return async function weappRequestLogger(ctx, next) {
  11. const startTime = Date.now();
  12. const requestId = ctx.logId || ctx.app.uuid.v1();
  13. let requestError = null;
  14. ctx.logId = requestId;
  15. ctx.set('X-Request-Id', requestId);
  16. try {
  17. await next();
  18. } catch (error) {
  19. requestError = error;
  20. throw error;
  21. } finally {
  22. const duration = Date.now() - startTime;
  23. const user = ctx.session && ctx.session.sessionUser;
  24. const project = ctx.session && ctx.session.sessionProject;
  25. const tender = ctx.tender;
  26. const responseBody = ctx.body;
  27. const businessCode = responseBody && typeof responseBody === 'object'
  28. ? responseBody.code
  29. : undefined;
  30. const logData = {
  31. requestId,
  32. requestTime: new Date(startTime).toISOString(),
  33. method: ctx.method,
  34. path: ctx.path,
  35. status: ctx.status,
  36. code: businessCode,
  37. duration,
  38. slow: duration >= slowThreshold,
  39. uid: user && (user.accountId || user.id),
  40. projectId: project && project.id,
  41. projectCode: project && project.code,
  42. tenderId: tender && tender.id,
  43. ip: ctx.ip,
  44. };
  45. const accessLogger = ctx.getLogger('weappAccess');
  46. if (duration >= slowThreshold) {
  47. accessLogger.warn(JSON.stringify(logData));
  48. } else {
  49. accessLogger.info(JSON.stringify(logData));
  50. }
  51. if (requestError || ctx.status >= 500 || (typeof businessCode === 'number' && businessCode < 0)) {
  52. const errorData = Object.assign({}, logData, {
  53. error: requestError
  54. ? (requestError.stack || requestError.message || requestError.toString())
  55. : responseBody && responseBody.msg,
  56. });
  57. ctx.getLogger('weappError').error(JSON.stringify(errorData));
  58. }
  59. }
  60. };
  61. };