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.

68 lines
1.9 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: "collector" },
  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${
  22. origin ? `\x1b[33m[${origin}]\x1b[0m` : ""
  23. } ${level}: ${message}`;
  24. }
  25. )
  26. ),
  27. }),
  28. ],
  29. });
  30. function formatArgs(args) {
  31. return args
  32. .map((arg) => {
  33. if (arg instanceof Error) {
  34. return arg.stack; // If argument is an Error object, return its stack trace
  35. } else if (typeof arg === "object") {
  36. return JSON.stringify(arg); // Convert objects to JSON string
  37. } else {
  38. return arg; // Otherwise, return as-is
  39. }
  40. })
  41. .join(" ");
  42. }
  43. console.log = function (...args) {
  44. logger.info(formatArgs(args));
  45. };
  46. console.error = function (...args) {
  47. logger.error(formatArgs(args));
  48. };
  49. console.info = function (...args) {
  50. logger.warn(formatArgs(args));
  51. };
  52. return logger;
  53. }
  54. }
  55. /**
  56. * Sets and overrides Console methods for logging when called.
  57. * This is a singleton method and will not create multiple loggers.
  58. * @returns {winston.Logger | console} - instantiated logger interface.
  59. */
  60. function setLogger() {
  61. return new Logger().logger;
  62. }
  63. module.exports = setLogger;