Logger.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. const fs = require('fs');
  2. const path = require('path');
  3. const chalk = require('chalk');
  4. class Logger {
  5. constructor(logFilePath = null, level = 'INFO') {
  6. this.logLevels = ['INFO', 'WARN', 'ERROR'];
  7. this.level = level.toUpperCase(); //不区分大小写 可以偷懒
  8. this.logFilePath = logFilePath ? path.resolve(logFilePath) : null;
  9. if (this.logFilePath) {
  10. // 确保日志目录存在
  11. const dir = path.dirname(this.logFilePath);
  12. if (!fs.existsSync(dir)) {
  13. fs.mkdirSync(dir, { recursive: true });
  14. }
  15. }
  16. }
  17. log(level, message) {
  18. level = level.toUpperCase();
  19. if (this.logLevels.indexOf(level) >= this.logLevels.indexOf(this.level)) {
  20. const timestamp = new Date().toISOString();
  21. const logMessage = `${timestamp} [${level}] ${message}`;
  22. // 控制台颜色
  23. let coloredMessage;
  24. switch (level) {
  25. case 'INFO':
  26. coloredMessage = chalk.white(logMessage);
  27. break;
  28. case 'WARN':
  29. coloredMessage = chalk.yellow(logMessage);
  30. break;
  31. case 'ERROR':
  32. coloredMessage = chalk.red(logMessage);
  33. break;
  34. default:
  35. coloredMessage = logMessage;
  36. }
  37. console.log(coloredMessage);
  38. if (this.logFilePath) {
  39. fs.appendFile(this.logFilePath, `${logMessage}\n`, (err) => {
  40. if (err) throw err;
  41. });
  42. }
  43. }
  44. }
  45. info(message) {
  46. this.log('INFO', message);
  47. }
  48. warn(message) {
  49. this.log('WARN', message);
  50. }
  51. error(message) {
  52. this.log('ERROR', message);
  53. }
  54. }
  55. module.exports = Logger;