context_logger.js 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. 'use strict';
  2. const { performance } = require('perf_hooks');
  3. /**
  4. * Request context Logger, itself isn't a {@link Logger}.
  5. */
  6. class ContextLogger {
  7. /**
  8. * @class
  9. * @param {Context} ctx - egg Context instance
  10. * @param {Logger} logger - Logger instance
  11. */
  12. constructor(ctx, logger) {
  13. this.ctx = ctx;
  14. this._logger = logger;
  15. }
  16. get paddingMessage() {
  17. const ctx = this.ctx;
  18. // Auto record necessary request context infomation, e.g.: user id, request spend time
  19. // format: '[$userId/$ip/$traceId/$use_ms $method $url]'
  20. const userId = ctx.userId || '-';
  21. const traceId = ctx.tracer && ctx.tracer.traceId || '-';
  22. let use = 0;
  23. if (ctx.performanceStarttime) {
  24. use = Math.floor((performance.now() - ctx.performanceStarttime) * 1000) / 1000;
  25. } else if (ctx.starttime) {
  26. use = Date.now() - ctx.starttime;
  27. }
  28. return '[' +
  29. userId + '/' +
  30. ctx.ip + '/' +
  31. traceId + '/' +
  32. use + 'ms ' +
  33. ctx.method + ' ' +
  34. ctx.url +
  35. ']';
  36. }
  37. write(msg) {
  38. this._logger.write(msg);
  39. }
  40. }
  41. [ 'error', 'warn', 'info', 'debug' ].forEach(level => {
  42. const LEVEL = level.toUpperCase();
  43. ContextLogger.prototype[level] = function() {
  44. const meta = {
  45. formatter: contextFormatter,
  46. paddingMessage: this.paddingMessage,
  47. ctx: this.ctx,
  48. };
  49. this._logger.log(LEVEL, arguments, meta);
  50. };
  51. });
  52. module.exports = ContextLogger;
  53. function contextFormatter(meta) {
  54. return meta.date + ' ' + meta.level + ' ' + meta.pid + ' ' + meta.paddingMessage + ' ' + meta.message;
  55. }