request-log.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. 'use strict';
  2. module.exports = ({ toMongoDB = false }) =>
  3. async function requestLog(ctx, next) {
  4. await next();
  5. try {
  6. const request = ctx.request;
  7. // 请求路由
  8. const url = request.url;
  9. // 请求方法
  10. const method = request.method;
  11. // get 请求不发日志
  12. if (method === 'GET') return;
  13. // 请求的分站标识
  14. const tenant = ctx.tenant || 'master';
  15. // 请求的用户
  16. const user = ctx.user;
  17. // 当前模块
  18. const module = ctx.app.config.module;
  19. // 所有的请求路由
  20. const routers = ctx.router.stack;
  21. // 匹配路由及http请求方法
  22. const route = routers.find(route => {
  23. const reg = new RegExp(route.regexp);
  24. // 正则验证
  25. const regResult = reg.test(url);
  26. // http方法验证
  27. const methodResult = route.methods.includes(method);
  28. if (regResult && methodResult) return true;
  29. return false;
  30. });
  31. if (!route) return;
  32. // 不往数据库里写,就回去
  33. if (!toMongoDB) return;
  34. // 组织数据,给MQ,让日志服务去写
  35. const { id: user_id, account, name } = user;
  36. const logData = { user_id, account, name, _tenant: tenant, opera: route.name, path: url, module };
  37. // 先用mq发送,不行再用http发
  38. if (ctx.mq) {
  39. ctx.service.util.rabbitMq.sendToMqQueue(logData, 'logs');
  40. } else {
  41. // http请求
  42. const httpPrefix = ctx.app.config.httpPrefix;
  43. if (httpPrefix && httpPrefix.logs) {
  44. const uri = `${httpPrefix.logs}/logs`;
  45. ctx.service.util.httpUtil.cpost(uri, logData);
  46. }
  47. }
  48. } catch (error) {
  49. // 没啥可输出,别中断就行
  50. }
  51. };