Logger.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. const fs = require('fs');
  2. const path = require('path');
  3. const chalk = require('chalk');
  4. class Logger {
  5. constructor(level = 'INFO') {
  6. this.logLevels = ['INFO', 'WARN', 'ERROR'];
  7. this.level = level.toUpperCase();
  8. // 默认日志目录 ./logs
  9. this.logDir = path.resolve(process.cwd(), 'logs');
  10. if (!fs.existsSync(this.logDir)) {
  11. fs.mkdirSync(this.logDir, { recursive: true });
  12. }
  13. }
  14. // 获取当天日志文件路径
  15. getLogFilePath() {
  16. const dateStr = new Date().toISOString().split('T')[0]; // YYYY-MM-DD
  17. return path.join(this.logDir, `${dateStr}.log`);
  18. }
  19. log(level, message) {
  20. level = level.toUpperCase();
  21. if (this.logLevels.indexOf(level) >= this.logLevels.indexOf(this.level)) {
  22. const timestamp = new Date().toLocaleString();
  23. const logMessage = `${timestamp} [${level}] ${message}`;
  24. // 控制台颜色
  25. let coloredMessage;
  26. switch (level) {
  27. case 'INFO':
  28. coloredMessage = chalk.white(logMessage);
  29. break;
  30. case 'WARN':
  31. coloredMessage = chalk.yellow(logMessage);
  32. break;
  33. case 'ERROR':
  34. coloredMessage = chalk.red(logMessage);
  35. break;
  36. default:
  37. coloredMessage = logMessage;
  38. }
  39. console.log(coloredMessage);
  40. // 保存到文件
  41. const logFilePath = this.getLogFilePath();
  42. fs.appendFile(logFilePath, `${logMessage}\n`, (err) => {
  43. if (err) console.error(chalk.red(`日志写入失败: ${err.message}`));
  44. });
  45. }
  46. }
  47. info(message) {
  48. this.log('INFO', message);
  49. }
  50. warn(message) {
  51. this.log('WARN', message);
  52. }
  53. error(message) {
  54. this.log('ERROR', message);
  55. }
  56. }
  57. module.exports = Logger;