logger.js 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. import { transports, createLogger, format } from "winston";
  2. import cluster from "cluster";
  3. import path from "path";
  4. import { join, dirname } from "path";
  5. import { fileURLToPath } from "url";
  6. const __filename = fileURLToPath(import.meta.url);
  7. const __dirname = dirname(__filename);
  8. const formatMeta = (meta) => {
  9. // You can format the splat yourself
  10. const splat = meta[Symbol.for("splat")];
  11. if (splat && splat.length) {
  12. return splat.length === 1 ? JSON.stringify(splat[0]) : JSON.stringify(splat);
  13. }
  14. return "";
  15. };
  16. const customFormat = format.printf(({ timestamp, level, message, label = "", ...meta }) => `[${timestamp}] ${level} ${label} ${message} ${formatMeta(meta)}`);
  17. const logger = createLogger({
  18. level: "debug",
  19. format: format.combine(
  20. format.colorize(),
  21. format.timestamp({ format: "MMM D, YYYY HH:mm:ss.SSS" }),
  22. customFormat,
  23. // Do not use splat format
  24. ),
  25. transports: [
  26. // - Write all logs with importance level of `error` or less to `error.log`
  27. // - Write all logs with importance level of `info` or less to `combined.log`
  28. //
  29. new transports.Console(),
  30. new transports.File({ filename: join(__dirname, "../../logs/error.log"), level: "error" }),
  31. new transports.File({
  32. filename: join(__dirname, "../../logs/combined.log"),
  33. }),
  34. ],
  35. });
  36. export { logger };