winston.config.ts 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. * @Author: 白雾茫茫丶<baiwumm.com>
  3. * @Date: 2024-08-29 16:41:59
  4. * @LastEditors: 白雾茫茫丶<baiwumm.com>
  5. * @LastEditTime: 2024-08-30 11:28:50
  6. * @Description: winston 日志
  7. */
  8. import chalk from 'chalk'; // 用于颜色化输出
  9. import { createLogger, format, transports } from 'winston';
  10. import DailyRotateFile from 'winston-daily-rotate-file';
  11. // 定义日志级别颜色
  12. const levelsColors = {
  13. error: 'red',
  14. warn: 'yellow',
  15. info: 'green',
  16. debug: 'blue',
  17. verbose: 'cyan',
  18. };
  19. const winstonLogger = createLogger({
  20. format: format.combine(format.timestamp(), format.errors({ stack: true }), format.splat(), format.json()),
  21. defaultMeta: { service: 'log-service' },
  22. transports: [
  23. new DailyRotateFile({
  24. filename: 'logs/errors/error-%DATE%.log', // 日志名称,占位符 %DATE% 取值为 datePattern 值。
  25. datePattern: 'YYYY-MM-DD', // 日志轮换的频率,此处表示每天。
  26. zippedArchive: true, // 是否通过压缩的方式归档被轮换的日志文件。
  27. maxSize: '20m', // 设置日志文件的最大大小,m 表示 mb 。
  28. maxFiles: '14d', // 保留日志文件的最大天数,此处表示自动删除超过 14 天的日志文件。
  29. level: 'error', // 日志类型,此处表示只记录错误日志。
  30. }),
  31. new DailyRotateFile({
  32. filename: 'logs/warnings/warning-%DATE%.log',
  33. datePattern: 'YYYY-MM-DD',
  34. zippedArchive: true,
  35. maxSize: '20m',
  36. maxFiles: '14d',
  37. level: 'warn',
  38. }),
  39. new DailyRotateFile({
  40. filename: 'logs/app/app-%DATE%.log',
  41. datePattern: 'YYYY-MM-DD',
  42. zippedArchive: true,
  43. maxSize: '20m',
  44. maxFiles: '14d',
  45. }),
  46. new transports.Console({
  47. format: format.combine(
  48. format.colorize({
  49. colors: levelsColors,
  50. }),
  51. format.simple(),
  52. format.printf((info) => {
  53. // 直接使用 info.level 获取日志级别,避免使用 symbol 作为索引
  54. const level = info.level as keyof typeof levelsColors;
  55. const color = levelsColors[level] || 'white';
  56. const chalkColor = chalk[color] || ((text: string) => text);
  57. const message = `${chalkColor(info.timestamp)} ${chalkColor(level)}: ${info.message}`;
  58. return message;
  59. }),
  60. ),
  61. level: 'debug',
  62. }),
  63. ],
  64. });
  65. export default winstonLogger;