test-direct-logging.cjs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. // 直接测试文件日志功能
  2. const fs = require('fs/promises');
  3. const path = require('path');
  4. class FileLogger {
  5. constructor(serviceName, logDir) {
  6. this.serviceName = serviceName;
  7. this.logDir = logDir || process.env.LOG_DIR || './log-prd';
  8. }
  9. getDateFolderPath() {
  10. const now = new Date();
  11. const year = now.getFullYear();
  12. const month = String(now.getMonth() + 1).padStart(2, '0');
  13. const day = String(now.getDate()).padStart(2, '0');
  14. return path.join(this.logDir, `${year}-${month}-${day}`);
  15. }
  16. getLogFilePath() {
  17. const dateFolder = this.getDateFolderPath();
  18. return path.join(dateFolder, `${this.serviceName}.log`);
  19. }
  20. async ensureLogDir() {
  21. const logFilePath = this.getLogFilePath();
  22. const logDir = path.dirname(logFilePath);
  23. try {
  24. await fs.mkdir(logDir, { recursive: true });
  25. } catch (error) {
  26. console.error(`创建日志目录失败: ${error}`);
  27. throw error;
  28. }
  29. }
  30. formatMessage(level, message, metadata) {
  31. const now = new Date();
  32. const timestamp = now.toISOString();
  33. const formattedMessage = `[${timestamp}] [${level.toUpperCase()}] ${message}`;
  34. if (metadata) {
  35. const metadataStr = typeof metadata === 'object'
  36. ? JSON.stringify(metadata, null, 2)
  37. : String(metadata);
  38. return `${formattedMessage}\n${metadataStr}\n`;
  39. }
  40. return `${formattedMessage}\n`;
  41. }
  42. async writeToFile(level, message, metadata) {
  43. try {
  44. await this.ensureLogDir();
  45. const logFilePath = this.getLogFilePath();
  46. const formattedMessage = this.formatMessage(level, message, metadata);
  47. await fs.appendFile(logFilePath, formattedMessage, 'utf8');
  48. console.log(`日志已写入: ${logFilePath}`);
  49. } catch (error) {
  50. console.error(`写入日志文件失败: ${error}`);
  51. // 不抛出错误,避免影响主流程
  52. }
  53. }
  54. async info(message, metadata) {
  55. console.log(`[INFO] ${message}`, metadata || '');
  56. await this.writeToFile('info', message, metadata);
  57. }
  58. async warn(message, metadata) {
  59. console.warn(`[WARN] ${message}`, metadata || '');
  60. await this.writeToFile('warn', message, metadata);
  61. }
  62. async error(message, metadata) {
  63. console.error(`[ERROR] ${message}`, metadata || '');
  64. await this.writeToFile('error', message, metadata);
  65. }
  66. async debug(message, metadata) {
  67. console.debug(`[DEBUG] ${message}`, metadata || '');
  68. await this.writeToFile('debug', message, metadata);
  69. }
  70. }
  71. function createServiceLogger(serviceName, logDir) {
  72. return new FileLogger(serviceName, logDir);
  73. }
  74. // 测试函数
  75. async function testDirectLogging() {
  76. console.log('开始直接测试日志功能...\n');
  77. // 创建日志器
  78. const logger = createServiceLogger('feie-print-task-service-direct-test');
  79. // 测试不同级别的日志
  80. console.log('1. 测试信息级别日志...');
  81. await logger.info('测试信息日志', { taskId: 'TEST_123', status: 'PENDING' });
  82. console.log('2. 测试警告级别日志...');
  83. await logger.warn('测试警告日志', { error: '打印机未连接', retryCount: 1 });
  84. console.log('3. 测试错误级别日志...');
  85. await logger.error('测试错误日志', { error: '打印失败', code: -1 });
  86. console.log('4. 测试调试级别日志...');
  87. await logger.debug('测试调试日志', { response: { ret: 0, msg: 'success' } });
  88. console.log('5. 测试简单消息(无元数据)...');
  89. await logger.info('简单日志消息');
  90. console.log('\n直接日志测试完成!');
  91. console.log('日志文件应该创建在: ./log-prd/YYYY-MM-DD/feie-print-task-service-direct-test.log');
  92. // 显示日志文件路径
  93. const logFilePath = logger.getLogFilePath();
  94. console.log(`完整路径: ${logFilePath}`);
  95. // 尝试读取并显示日志内容
  96. try {
  97. const content = await fs.readFile(logFilePath, 'utf8');
  98. console.log('\n=== 日志文件内容 ===');
  99. console.log(content);
  100. console.log('=== 结束 ===');
  101. } catch (error) {
  102. console.log('无法读取日志文件,可能尚未创建或权限问题');
  103. }
  104. }
  105. // 运行测试
  106. testDirectLogging().catch(error => {
  107. console.error('测试失败:', error);
  108. process.exit(1);
  109. });