You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.8 KiB

11 months ago
  1. const winston = require("winston");
  2. class Logger {
  3. logger = console;
  4. static _instance;
  5. constructor() {
  6. if (Logger._instance) return Logger._instance;
  7. this.logger =
  8. process.env.NODE_ENV === "production" ? this.getWinstonLogger() : console;
  9. Logger._instance = this;
  10. }
  11. getWinstonLogger() {
  12. const logger = winston.createLogger({
  13. level: "info",
  14. defaultMeta: { service: "backend" },
  15. transports: [
  16. new winston.transports.Console({
  17. format: winston.format.combine(
  18. winston.format.colorize(),
  19. winston.format.printf(
  20. ({ level, message, service, origin = "" }) => {
  21. return `\x1b[36m[${service}]\x1b[0m${origin ? `\x1b[33m[${origin}]\x1b[0m` : ""} ${level}: ${message}`;
  22. }
  23. )
  24. ),
  25. }),
  26. ],
  27. });
  28. function formatArgs(args) {
  29. return args
  30. .map((arg) => {
  31. if (arg instanceof Error) {
  32. return arg.stack; // If argument is an Error object, return its stack trace
  33. } else if (typeof arg === "object") {
  34. return JSON.stringify(arg); // Convert objects to JSON string
  35. } else {
  36. return arg; // Otherwise, return as-is
  37. }
  38. })
  39. .join(" ");
  40. }
  41. console.log = function (...args) {
  42. logger.info(formatArgs(args));
  43. };
  44. console.error = function (...args) {
  45. logger.error(formatArgs(args));
  46. };
  47. console.info = function (...args) {
  48. logger.warn(formatArgs(args));
  49. };
  50. return logger;
  51. }
  52. }
  53. /**
  54. * Sets and overrides Console methods for logging when called.
  55. * This is a singleton method and will not create multiple loggers.
  56. * @returns {winston.Logger | console} - instantiated logger interface.
  57. */
  58. function setLogger() {
  59. return new Logger().logger;
  60. }
  61. module.exports = setLogger;